Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

git-ssh

An ssh-key selection wrapper for git

Why

This exists because SSH keys and git are a little weird when it comes to working together. Let's say you work at home on personal projects, and at a company for work-related projects. These two project environments should be completely seperated due to personal or work requirements, and so they include different SSH keys owned by different accounts on your favorite centralized Git hosting service. You sometimes work on personal code, and then need to context switch over to work code. You go to git pull your latest work repository changes and get hit with this:

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

This is because you are using git with the wrong SSH key, so you are blocked from seeing or pushing to a private ssh secure repository.

You can solve this problem by creating a git config file and configuring it to use a specific SSH key when you are interacting with a specific website, say only using id_work.rsa when accessing github.com, but now you've hit a different problem, which is that your personal repositories hosted on the same website are now not accessible because your work SSH key is different from your personal SSH key.

You feel balder by the minute. Enter git-ssh, a very simple shell script to help you keep your remaining hair on your head.

Example

For example, lets say you have 2 different ssh keys at $HOME/.ssh

id_git_personal and id_git_company

To make git use your personal id for a project, creat it via

$ git-ssh create personal $HOME/.ssh/id_git_personal

and then use it by eval'ing the output of the export command:

$ eval"$(git-ssh export personal)"

This will load up your environment with the following:

export GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/personal.2"'

which, when used by git will load up ssh with the IdentityFile of id_git_personal

To switch to your company key when accessing company repositories, create it and then export it just like you did your personal. It's that simple!

$ git-ssh create work $HOME/.ssh/id_git_company
$ eval"$(git-ssh export work)"

Some more fun

git has a fun feature in certain environments where, if a program on your $PATH starts with git-*, like git-ssh, you can call it as git ssh on the CLI.

This allows it to feel like just another git subcommand, and works with all of the git-ssh commands:

You can automatically add your target key to the running ssh-agent by passing the -a or --add option to git-ssh export

$ git ssh create test~/.ssh/id_my_test.rsa
$ git ssh exporttestexport GIT_SSH_COMMAND='ssh -F "$HOME/.config/git-ssh/test.2"'
$ eval"$(git ssh export test)"

Usage and Options

create <config> <path> Create a new <config> pointing to file name <path>
delete <config> Delete a <config>
list [--verbose] List all configs in CONFIG_DIR
export <config> [-a|--add] Export a config into the environment as GIT_SSH_COMMAND
reset Reset GIT_SSH_COMMAND, unsetting an exported configs
help | -h | --help This help
version | -v | --version Display application version

Configuration

Configuration files are just plain ssh_config files that have, by default, a couple of options preset. The config files apply by default to all hosts and have a specific IdentityFile noted. The IdentitiesOnly option is on, meaning that only the IdentityFile specified can be used. One can override these settings by editing the generated config file directly.

NOTE: If you edit the config file, it may be over-written by a future major version update to git-ssh

CONFIG files are by default searched for in ${XDG_CONFIG_HOME}/git-ssh

Issues

Check the issues page on GitHub for any notes about outstanding or existing issues. If you encounter a problem with git-ssh of which no such issue already exists please feel free to help the developer by creating an issue ticket.

License

GPLv2

 Copyright (C) 2025 pyamsoft
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

About

SSH key selection wrapper for git

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages