Create a gist now

Instantly share code, notes, and snippets.

Embed
Multiple SSH keys for different github accounts

Multiple SSH Keys settings for different github account

create different public key

create different ssh key according the article Mac Set-Up Git

$ ssh-keygen -t rsa -C "your_email@youremail.com"

Please refer to github ssh issues for common problems.

for example, 2 keys created at:

~/.ssh/id_rsa_activehacker
~/.ssh/id_rsa_jexchan

then, add these two keys as following

$ ssh-add ~/.ssh/id_rsa_activehacker
$ ssh-add ~/.ssh/id_rsa_jexchan

you can delete all cached keys before

$ ssh-add -D

finally, you can check your saved keys

$ ssh-add -l

Modify the ssh config

$ cd ~/.ssh/
$ touch config
$ subl -a config

Then added

#activehacker account
Host github.com-activehacker
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_activehacker

#jexchan account
Host github.com-jexchan
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_jexchan

Clone you repo and modify your Git config

clone your repo git clone git@github.com:activehacker/gfs.git gfs_jexchan

cd gfs_jexchan and modify git config

$ git config user.name "jexchan"
$ git config user.email "jexchan@gmail.com" 

$ git config user.name "activehacker"
$ git config user.email "jexlab@gmail.com" 

or you can have global git config $ git config --global user.name "jexchan" $ git config --global user.email "jexchan@gmail.com"

then use normal flow to push your code

$ git add .
$ git commit -m "your comments"
$ git push

Another related article in Chinese

  1. http://4simple.github.com/docs/multipleSSHkeys/
@oleweidner

This comment has been minimized.

Show comment
Hide comment
@oleweidner

oleweidner Sep 3, 2012

I had to change the [remote "origin"] / url field in my local .git/config to use the Host defined in .ssh/config in order for this to work, i.e.,

[remote "origin"]
        url = git@github.com-activehacker:activehacker/gfs.git

Without that modification, git would just try to use my default ssh key.

I had to change the [remote "origin"] / url field in my local .git/config to use the Host defined in .ssh/config in order for this to work, i.e.,

[remote "origin"]
        url = git@github.com-activehacker:activehacker/gfs.git

Without that modification, git would just try to use my default ssh key.

@sdeverly

This comment has been minimized.

Show comment
Hide comment
@sdeverly

sdeverly Nov 1, 2012

Had to do the same to get it working.

sdeverly commented Nov 1, 2012

Had to do the same to get it working.

@elkuku

This comment has been minimized.

Show comment
Hide comment
@elkuku

elkuku Feb 9, 2013

Me too πŸ˜‰

elkuku commented Feb 9, 2013

Me too πŸ˜‰

@jsh2134

This comment has been minimized.

Show comment
Hide comment
@jsh2134

jsh2134 Apr 1, 2013

Me as well.

jsh2134 commented Apr 1, 2013

Me as well.

@straticsryan

This comment has been minimized.

Show comment
Hide comment
@straticsryan

straticsryan Apr 9, 2013

Instead of having to change the remote origin in the config after cloning, you can just use that custom Host variable on the git clone command instead.

Instead of having to change the remote origin in the config after cloning, you can just use that custom Host variable on the git clone command instead.

@jmpnot

This comment has been minimized.

Show comment
Hide comment
@jmpnot

jmpnot May 6, 2013

e.g.

git clone git@github.com-activehacker:activehacker/gfs.git gfs_jexchan
________________________^

as oppose to:

git clone git@github.com:activehacker/gfs.git gfs_jexchan

that's the ticket!

jmpnot commented May 6, 2013

e.g.

git clone git@github.com-activehacker:activehacker/gfs.git gfs_jexchan
________________________^

as oppose to:

git clone git@github.com:activehacker/gfs.git gfs_jexchan

that's the ticket!

@malleor

This comment has been minimized.

Show comment
Hide comment
@malleor

malleor Jul 28, 2013

Thanks!

To make it work with Gists, I needed to add another entry in ~/.ssh/config:

Host gist.github.com
  ...

malleor commented Jul 28, 2013

Thanks!

To make it work with Gists, I needed to add another entry in ~/.ssh/config:

Host gist.github.com
  ...
@sgryschuk

This comment has been minimized.

Show comment
Hide comment
@sgryschuk

sgryschuk Aug 16, 2013

If your ssh keys don't all show up with
ssh-add -l
you have to run
ssh-add ~/.ssh/yourkey.rsa

If your ssh keys don't all show up with
ssh-add -l
you have to run
ssh-add ~/.ssh/yourkey.rsa

@mukeshagarwal

This comment has been minimized.

Show comment
Hide comment
@mukeshagarwal

mukeshagarwal Aug 20, 2013

thanks, worked like a charm

thanks, worked like a charm

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Aug 28, 2013

but how it can works with "rake deploy" when I deploy my octopress blog? The mapping ssh-key seems no effect....

ghost commented Aug 28, 2013

but how it can works with "rake deploy" when I deploy my octopress blog? The mapping ssh-key seems no effect....

@nosir

This comment has been minimized.

Show comment
Hide comment
@nosir

nosir Sep 17, 2013

thanks, would be better if it could be changed as @jmpnot mentioned.

nosir commented Sep 17, 2013

thanks, would be better if it could be changed as @jmpnot mentioned.

@ptheofan

This comment has been minimized.

Show comment
Hide comment
@ptheofan

ptheofan Dec 11, 2013

when trying to pull through a php script via exec it would not use the key automatically though it was the correct user configured (my user). Going through the ssh config file just saved the day! :D

when trying to pull through a php script via exec it would not use the key automatically though it was the correct user configured (my user). Going through the ssh config file just saved the day! :D

@muhammedbasilsk

This comment has been minimized.

Show comment
Hide comment
@muhammedbasilsk

muhammedbasilsk Jan 16, 2014

ssh config +
updated clone url

Working great... :-) Thanks alot...

ssh config +
updated clone url

Working great... :-) Thanks alot...

@noonat

This comment has been minimized.

Show comment
Hide comment
@noonat

noonat Jan 28, 2014

I was having an issue with SSH using the wrong key, depending on which order I accessed repositories. Turns out it will try all the keys loaded into ssh-agent in order, and IdentityFile only adds to the end of that list.

You can add IdentitiesOnly yes the SSH config block to force it to only use the IdentityFile you specified.

noonat commented Jan 28, 2014

I was having an issue with SSH using the wrong key, depending on which order I accessed repositories. Turns out it will try all the keys loaded into ssh-agent in order, and IdentityFile only adds to the end of that list.

You can add IdentitiesOnly yes the SSH config block to force it to only use the IdentityFile you specified.

@avendael

This comment has been minimized.

Show comment
Hide comment
@avendael

avendael Feb 2, 2014

I was also having issues with SSH using the wrong key even after following the advice of most who have encountered the same issue. In my case, I have a globally enabled ControlMaster in my ssh config. Removing the global ControlMaster config and deleting the github ssh socket (which in my case, is stored in /tmp as ssh_hostname.com_user as specified by my ControlPath config) fixed the issue for me. I can still use ControlMaster in other hosts by adding a ControlMaster auto line in that host's block.

avendael commented Feb 2, 2014

I was also having issues with SSH using the wrong key even after following the advice of most who have encountered the same issue. In my case, I have a globally enabled ControlMaster in my ssh config. Removing the global ControlMaster config and deleting the github ssh socket (which in my case, is stored in /tmp as ssh_hostname.com_user as specified by my ControlPath config) fixed the issue for me. I can still use ControlMaster in other hosts by adding a ControlMaster auto line in that host's block.

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Feb 16, 2014

@oleweidner: Thank you !

ghost commented Feb 16, 2014

@oleweidner: Thank you !

@polykiln

This comment has been minimized.

Show comment
Hide comment
@polykiln

polykiln Mar 12, 2014

How do you do this with https urls though?

How do you do this with https urls though?

@tejaskanani

This comment has been minimized.

Show comment
Hide comment
@tejaskanani

tejaskanani Mar 14, 2014

Thanks Jexchan. It helped and working as expected.

Thanks Jexchan. It helped and working as expected.

@1Rhino

This comment has been minimized.

Show comment
Hide comment
@1Rhino

1Rhino Mar 27, 2014

Thank you. It worked fine.

1Rhino commented Mar 27, 2014

Thank you. It worked fine.

@RBeek

This comment has been minimized.

Show comment
Hide comment
@RBeek

RBeek May 26, 2014

What exactly is the rule for setting up "Host" in the config file
Is it always github.com-[accountname] or can it be anything, because I set it to the shortname of my repository. Everything works, but it is not quit clear what needs to be set there.

RBeek commented May 26, 2014

What exactly is the rule for setting up "Host" in the config file
Is it always github.com-[accountname] or can it be anything, because I set it to the shortname of my repository. Everything works, but it is not quit clear what needs to be set there.

@ignasne

This comment has been minimized.

Show comment
Hide comment
@ignasne

ignasne May 28, 2014

Tnx it helps a lot!

ignasne commented May 28, 2014

Tnx it helps a lot!

@ashanbrown

This comment has been minimized.

Show comment
Hide comment
@ashanbrown

ashanbrown Jun 1, 2014

Thanks for the tips. Might help to add the following to the instructions:

git remote set-url origin git@<host-in-ssh-config>:<username>/<repo>

This is the same as editing your .git/config file.

Thanks for the tips. Might help to add the following to the instructions:

git remote set-url origin git@<host-in-ssh-config>:<username>/<repo>

This is the same as editing your .git/config file.

@greenlaw110

This comment has been minimized.

Show comment
Hide comment
@greenlaw110

greenlaw110 Jun 4, 2014

Same question: How do you do this with https urls though?

Same question: How do you do this with https urls though?

@gholadr

This comment has been minimized.

Show comment
Hide comment
@gholadr

gholadr Jun 23, 2014

Thanks for the help!!!

gholadr commented Jun 23, 2014

Thanks for the help!!!

@1ambda

This comment has been minimized.

Show comment
Hide comment
@1ambda

1ambda Jun 26, 2014

Awsome!!!!!!!!

1ambda commented Jun 26, 2014

Awsome!!!!!!!!

@wmyers

This comment has been minimized.

Show comment
Hide comment
@wmyers

wmyers Jul 2, 2014

Thanks worked a treat. The following worked for me:
git clone git@github.com-sshID:myGitHubAccount/myRepo.git

wmyers commented Jul 2, 2014

Thanks worked a treat. The following worked for me:
git clone git@github.com-sshID:myGitHubAccount/myRepo.git

@robbyronk

This comment has been minimized.

Show comment
Hide comment
@robbyronk

robbyronk Aug 1, 2014

πŸ‘

πŸ‘

@nikolasc

This comment has been minimized.

Show comment
Hide comment
@nikolasc

nikolasc Aug 4, 2014

I forked @RichardBronosky (by mistake :) ) and changed the Host and User settings in ~/.ssh/config (User ) which enables one to actually use multiple accounts, on the local machine, with SSH access.

I borrowed one of my friend's laptops, and created a github account. It took a while to figure out why I kept getting kicked off github 'as user <friend's username>' - he hadn't created a new user for me on the laptop, so I was accessing with his username set in ~/.gitconfig and used with SSH. So the above, along with my ssh config changes, was the best way to get around the issue without wrecking his setup.

nikolasc commented Aug 4, 2014

I forked @RichardBronosky (by mistake :) ) and changed the Host and User settings in ~/.ssh/config (User ) which enables one to actually use multiple accounts, on the local machine, with SSH access.

I borrowed one of my friend's laptops, and created a github account. It took a while to figure out why I kept getting kicked off github 'as user <friend's username>' - he hadn't created a new user for me on the laptop, so I was accessing with his username set in ~/.gitconfig and used with SSH. So the above, along with my ssh config changes, was the best way to get around the issue without wrecking his setup.

@zhangcheng

This comment has been minimized.

Show comment
Hide comment
@zhangcheng

zhangcheng Aug 16, 2014

I just found out another way no need to deal with multiple SSH keys: use gitcredentials's useHttpPath option

[credential]
    helper = osxkeychain
    useHttpPath = true

English see http://www.davidhayden.org/blog/multiple-github-accounts-git-credential-osxkeychain
Chinese see http://jianshu.io/p/ef394ef6df95

I just found out another way no need to deal with multiple SSH keys: use gitcredentials's useHttpPath option

[credential]
    helper = osxkeychain
    useHttpPath = true

English see http://www.davidhayden.org/blog/multiple-github-accounts-git-credential-osxkeychain
Chinese see http://jianshu.io/p/ef394ef6df95

@plato-cambrian

This comment has been minimized.

Show comment
Hide comment
@plato-cambrian

plato-cambrian Sep 18, 2014

On Windows 7, I want to manage multiple github users with passphrase-protected ssh keys.

I sorted my ~.ssh/config file to use different keys for different repo domains as described above (I previously documented the steps on mint/ubuntu.)

However, I don't want to type my passphrase every time, and I don't want to use ssh-agent.

Here's how I set up Pageant to ask for and remember my passphrase on Windows login:

  • Download the Putty Tools package
  • Win+R to open run dialog
  • shell:startup to open the auto start folder in windows explorer
  • Navigate to your Pageant folder in a separate Explorer window
  • Right click and drag PAGEANT.EXE to the Startup folder. Choose Create Shortcut
  • Right click the shortcut, properties, Shortcut tab
  • Find the path to your .ppk encoded keypair
    • generate one with PUTTYGEN.EXE if you need a new one
    • convert one with PUTTYGEN.EXE if you have a linux id_rsa file but no .ppk
    • win7+ : shift right click your key in Explorer, Copy as path
  • Append the key path to the C:\whatever\PAGEANT.EXE line
    • e.g: "Target: C:\putty\PAGEANT.EXE plato_cambrian.ppk plato.ppk"
    • If your keys aren't adjacent to PAGEANT you can use absolute paths or change "Start in:" which is Pageant's CWD
  • Open the shortcut or reboot, and type your passphrases

On Windows 7, I want to manage multiple github users with passphrase-protected ssh keys.

I sorted my ~.ssh/config file to use different keys for different repo domains as described above (I previously documented the steps on mint/ubuntu.)

However, I don't want to type my passphrase every time, and I don't want to use ssh-agent.

Here's how I set up Pageant to ask for and remember my passphrase on Windows login:

  • Download the Putty Tools package
  • Win+R to open run dialog
  • shell:startup to open the auto start folder in windows explorer
  • Navigate to your Pageant folder in a separate Explorer window
  • Right click and drag PAGEANT.EXE to the Startup folder. Choose Create Shortcut
  • Right click the shortcut, properties, Shortcut tab
  • Find the path to your .ppk encoded keypair
    • generate one with PUTTYGEN.EXE if you need a new one
    • convert one with PUTTYGEN.EXE if you have a linux id_rsa file but no .ppk
    • win7+ : shift right click your key in Explorer, Copy as path
  • Append the key path to the C:\whatever\PAGEANT.EXE line
    • e.g: "Target: C:\putty\PAGEANT.EXE plato_cambrian.ppk plato.ppk"
    • If your keys aren't adjacent to PAGEANT you can use absolute paths or change "Start in:" which is Pageant's CWD
  • Open the shortcut or reboot, and type your passphrases
@frostwire

This comment has been minimized.

Show comment
Hide comment
@frostwire

frostwire Oct 22, 2014

Let's say alice is a github.com user, with 2 or more private repositories repoN.
For this example we'll work with just two repositories named repo1 and repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

You need to be to pull from these repositories without entering a passwords probably on a server, or on multiple servers.
You want to perform git pull origin master for example, and you want this to happen without asking for a password.

You don't like dealing with ssh-agent, you have discovered (or you're discovering now) about ~/.ssh/config a file that let's your ssh client know what private key to use depending on Hostname and username, with a simple configuration entry that looks like this:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

So you went ahead and created your (alice_github.id_rsa, alice_github.id_rsa.pub) keypair, you then also went to your repository's .git/config file and you modified the url of your remote origin to be something like this:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

And finally you went to the repository Settings > Deploy keys section and added the contents of alice_github.id_rsa.pub

At this point you could do your git pull origin master without entering a password without issue.

but what about the second repository?

So your instinct will be to grab that key and add it to repo2's Deploy keys, but github.com will error out and tell you that the key is already being used.

Now you go and generate another key (using ssh-keygen -t rsa -C "alice@alice.com" without passwords of course), and so that this doesn't become a mess, you will now name your keys like this:

  • repo1 keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 keypair: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

You will now put the new public key on repo2's Deploy keys configuration at github.com, but now you have an ssh problem to deal with.

How can ssh tell which key to use if the repositories are hosted on the same github.com domain?

Your .ssh/config file points to github.com and it doesn't know which key to use when it's time to do the pull.

So I found a trick with github.com. You can tell your ssh client that each repository lives in a different github.com subdomain, in these cases, they will be repo1.github.com and repo2.github.com

So first thing is editing the .git/config files on your repo clones, so they look like this instead:

For repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

For repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

And then, on your .ssh/config file, now you will be able to enter a configuration for each subdomain :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Now you are able to git pull origin master without entering any passwords from both repositories.

If you have multiple machines, you could copy the keys to each of the machines and reuse them, but I'd advise doing the leg work to generate 1 key per machine and repo. You will have a lot more keys to handle, but you will be less vulnerable if one gets compromised.

Let's say alice is a github.com user, with 2 or more private repositories repoN.
For this example we'll work with just two repositories named repo1 and repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

You need to be to pull from these repositories without entering a passwords probably on a server, or on multiple servers.
You want to perform git pull origin master for example, and you want this to happen without asking for a password.

You don't like dealing with ssh-agent, you have discovered (or you're discovering now) about ~/.ssh/config a file that let's your ssh client know what private key to use depending on Hostname and username, with a simple configuration entry that looks like this:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

So you went ahead and created your (alice_github.id_rsa, alice_github.id_rsa.pub) keypair, you then also went to your repository's .git/config file and you modified the url of your remote origin to be something like this:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

And finally you went to the repository Settings > Deploy keys section and added the contents of alice_github.id_rsa.pub

At this point you could do your git pull origin master without entering a password without issue.

but what about the second repository?

So your instinct will be to grab that key and add it to repo2's Deploy keys, but github.com will error out and tell you that the key is already being used.

Now you go and generate another key (using ssh-keygen -t rsa -C "alice@alice.com" without passwords of course), and so that this doesn't become a mess, you will now name your keys like this:

  • repo1 keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 keypair: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

You will now put the new public key on repo2's Deploy keys configuration at github.com, but now you have an ssh problem to deal with.

How can ssh tell which key to use if the repositories are hosted on the same github.com domain?

Your .ssh/config file points to github.com and it doesn't know which key to use when it's time to do the pull.

So I found a trick with github.com. You can tell your ssh client that each repository lives in a different github.com subdomain, in these cases, they will be repo1.github.com and repo2.github.com

So first thing is editing the .git/config files on your repo clones, so they look like this instead:

For repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

For repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

And then, on your .ssh/config file, now you will be able to enter a configuration for each subdomain :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Now you are able to git pull origin master without entering any passwords from both repositories.

If you have multiple machines, you could copy the keys to each of the machines and reuse them, but I'd advise doing the leg work to generate 1 key per machine and repo. You will have a lot more keys to handle, but you will be less vulnerable if one gets compromised.

@burningTyger

This comment has been minimized.

Show comment
Hide comment
@burningTyger

burningTyger Nov 6, 2014

Let me add that it is not enough to have

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

 Host github.com
   HostName github.com
   User git
   IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
   IdentitiesOnly yes

In this case the repo1 block will point to the second github.com block because the repo1 block says HostName github.com which will redirect from first to second block.

Took me a while to figure out just how smart ssh is πŸ˜„

Let me add that it is not enough to have

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

 Host github.com
   HostName github.com
   User git
   IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
   IdentitiesOnly yes

In this case the repo1 block will point to the second github.com block because the repo1 block says HostName github.com which will redirect from first to second block.

Took me a while to figure out just how smart ssh is πŸ˜„

@brentsony

This comment has been minimized.

Show comment
Hide comment
@brentsony

brentsony Nov 25, 2014

@burningTyger The HostNames can be identical - it is the 'Host' that must differ. What may work best is to use "repo2.github.com", instead of that second "github.com". Then clone with git clone git@repo2.github.com:GitHubUserName/RepoName.git

@burningTyger The HostNames can be identical - it is the 'Host' that must differ. What may work best is to use "repo2.github.com", instead of that second "github.com". Then clone with git clone git@repo2.github.com:GitHubUserName/RepoName.git

@elpd

This comment has been minimized.

Show comment
Hide comment
@elpd

elpd Dec 24, 2014

Thank you. Worked as expected.

elpd commented Dec 24, 2014

Thank you. Worked as expected.

@pajtai

This comment has been minimized.

Show comment
Hide comment
@pajtai

pajtai Jan 28, 2015

thank you @oleweidner for the tip on changing the git config!

pajtai commented Jan 28, 2015

thank you @oleweidner for the tip on changing the git config!

@dbolser

This comment has been minimized.

Show comment
Hide comment
@dbolser

dbolser Feb 19, 2015

Thanks dudels.

dbolser commented Feb 19, 2015

Thanks dudels.

@apiraino

This comment has been minimized.

Show comment
Hide comment
@apiraino

apiraino Mar 6, 2015

Thanks for the guide, helped me solve this very issue. I need a public keys for each of my GitHub repos.

go figure....

apiraino commented Mar 6, 2015

Thanks for the guide, helped me solve this very issue. I need a public keys for each of my GitHub repos.

go figure....

@lazurey

This comment has been minimized.

Show comment
Hide comment
@lazurey

lazurey Jul 7, 2015

Thank you Xianjun!!!
Your answer is the first one when I searched this problem on google. πŸ˜„

lazurey commented Jul 7, 2015

Thank you Xianjun!!!
Your answer is the first one when I searched this problem on google. πŸ˜„

@micheleva

This comment has been minimized.

Show comment
Hide comment
@micheleva

micheleva Aug 22, 2015

Thank you very much for the instructions @jexchan ! Doing as @jmpnot wrote fixed all the problems !

Thank you very much for the instructions @jexchan ! Doing as @jmpnot wrote fixed all the problems !

@AkhterAli

This comment has been minimized.

Show comment
Hide comment
@AkhterAli

AkhterAli Aug 28, 2015

Thank you so much for this guide, this worked wonders with my sublime text git plugin!

Thank you so much for this guide, this worked wonders with my sublime text git plugin!

@ttiu

This comment has been minimized.

Show comment
Hide comment
@ttiu

ttiu Nov 5, 2015

Works great. Thank you!

ttiu commented Nov 5, 2015

Works great. Thank you!

@rplaurindo

This comment has been minimized.

Show comment
Hide comment
@rplaurindo

rplaurindo Nov 6, 2015

$ git config --local remote.origin.url git@[repository]-[public_ssh_key_file_name]:[repository_user]/[project].git
$ git config --local user.email [user_email]

Works!!! ^^

The .git file looks like this

[remote "origin"]
  url = git@[repository]-[public_ssh_key_file_name]:[repository_user]/[project].git
$ git config --local remote.origin.url git@[repository]-[public_ssh_key_file_name]:[repository_user]/[project].git
$ git config --local user.email [user_email]

Works!!! ^^

The .git file looks like this

[remote "origin"]
  url = git@[repository]-[public_ssh_key_file_name]:[repository_user]/[project].git
@StylusEater

This comment has been minimized.

Show comment
Hide comment
@StylusEater

StylusEater Nov 17, 2015

I think others have mentioned this but I couldn't find it when I searched the page.

I was getting the following error on bitbucket:

$ git push -u origin master
conq: repository access denied.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.`

adding this to the ~/.ssh/config file entries after specifying IdentityFile fixed it ...

IdentitiesOnly yes

Contents of ~/.ssh/config:

Host bitbucket.org-foo
HostName bitbucket.org
User git
IdentityFile ~/.ssh/my_rsa_private_key
IdentitiesOnly yes

Contents of .git/config:

[remote "origin"]
>url = git@bitbucket.org-foo:repo/repo.git
>fetch = +refs/heads/:refs/remotes/origin/

Notice how bitbucket.org-foo matches in each.

I think others have mentioned this but I couldn't find it when I searched the page.

I was getting the following error on bitbucket:

$ git push -u origin master
conq: repository access denied.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.`

adding this to the ~/.ssh/config file entries after specifying IdentityFile fixed it ...

IdentitiesOnly yes

Contents of ~/.ssh/config:

Host bitbucket.org-foo
HostName bitbucket.org
User git
IdentityFile ~/.ssh/my_rsa_private_key
IdentitiesOnly yes

Contents of .git/config:

[remote "origin"]
>url = git@bitbucket.org-foo:repo/repo.git
>fetch = +refs/heads/:refs/remotes/origin/

Notice how bitbucket.org-foo matches in each.

@bigomega

This comment has been minimized.

Show comment
Hide comment
@bigomega

bigomega Nov 30, 2015

AT LAST, I've seen someone else use subl command. I'm not alone πŸ˜„

AT LAST, I've seen someone else use subl command. I'm not alone πŸ˜„

@wching

This comment has been minimized.

Show comment
Hide comment
@wching

wching Jan 19, 2016

@ashanbrown thanks for your line, saved me πŸ‘ πŸš€

wching commented Jan 19, 2016

@ashanbrown thanks for your line, saved me πŸ‘ πŸš€

@blog-han-chen

This comment has been minimized.

Show comment
Hide comment
@blog-han-chen

blog-han-chen Jan 31, 2016

[remote "origin"]
url = git@github.com-activehacker:activehacker/gfs.git

Golden line, solved the problem.

[remote "origin"]
url = git@github.com-activehacker:activehacker/gfs.git

Golden line, solved the problem.

@vidinev

This comment has been minimized.

Show comment
Hide comment
@vidinev

vidinev Feb 16, 2016

On Ubuntu 15.10 I faced with β€œBad owner or permissions on ~/.ssh/config” error.
This article helped me http://serverfault.com/questions/253313/ssh-hostname-returns-bad-owner-or-permissions-on-ssh-config

Just need:
chmod 600 ~/.ssh/config

vidinev commented Feb 16, 2016

On Ubuntu 15.10 I faced with β€œBad owner or permissions on ~/.ssh/config” error.
This article helped me http://serverfault.com/questions/253313/ssh-hostname-returns-bad-owner-or-permissions-on-ssh-config

Just need:
chmod 600 ~/.ssh/config

@raduvargabuddyguard

This comment has been minimized.

Show comment
Hide comment
@raduvargabuddyguard

raduvargabuddyguard Feb 17, 2016

What worked for me is to use "github-activehacker" instead of "github.com-activehacker".

What worked for me is to use "github-activehacker" instead of "github.com-activehacker".

@Khande

This comment has been minimized.

Show comment
Hide comment
@Khande

Khande Aug 25, 2016

learned a lot, thx!

Khande commented Aug 25, 2016

learned a lot, thx!

@cdarne-darwineco

This comment has been minimized.

Show comment
Hide comment
@cdarne-darwineco

cdarne-darwineco Sep 7, 2016

Worked pretty good, thanks!

Worked pretty good, thanks!

@adeyahya

This comment has been minimized.

Show comment
Hide comment
@adeyahya

adeyahya Sep 22, 2016

Thanks, it worked pretty awesome!

Thanks, it worked pretty awesome!

@eness

This comment has been minimized.

Show comment
Hide comment
@eness

eness Jan 14, 2017

Worked fine for me!

eness commented Jan 14, 2017

Worked fine for me!

@knatch

This comment has been minimized.

Show comment
Hide comment
@knatch

knatch Jan 19, 2017

Thanks @oleweidner !!

knatch commented Jan 19, 2017

Thanks @oleweidner !!

@spasarok

This comment has been minimized.

Show comment
Hide comment
@spasarok

spasarok Jan 30, 2017

If you have to change your local .git/config for this to work, how are you supposed to make the first clone?

EDIT: I figured it out. Instead of changing the remote url in .git/config, you can clone by replacing github.com with the host like so: git clone git@github.com-activehacker:activehacker/gfs.git gfs_jexchan. This will automatically set the remote url in .git/config to use the ssh host, so no need to manually edit after cloning.

spasarok commented Jan 30, 2017

If you have to change your local .git/config for this to work, how are you supposed to make the first clone?

EDIT: I figured it out. Instead of changing the remote url in .git/config, you can clone by replacing github.com with the host like so: git clone git@github.com-activehacker:activehacker/gfs.git gfs_jexchan. This will automatically set the remote url in .git/config to use the ssh host, so no need to manually edit after cloning.

@ORESoftware

This comment has been minimized.

Show comment
Hide comment
@ORESoftware

ORESoftware Feb 3, 2017

this is going to save my life!

this is going to save my life!

@irajhedayati

This comment has been minimized.

Show comment
Hide comment
@irajhedayati

irajhedayati Feb 7, 2017

Thank you for the documentation. It helped me. Could you please apply @oleweidner changes as well. It seems it is mandatory.

Thank you for the documentation. It helped me. Could you please apply @oleweidner changes as well. It seems it is mandatory.

@JREAM

This comment has been minimized.

Show comment
Hide comment
@JREAM

JREAM Feb 23, 2017

I find this really easy

Example

git clone gh:jream/config-ubuntu.git

~/.gitconfig

[url "git@github.com:"]
     insteadOf = "gh:"
     pushInsteadOf = "github:"
     pushInsteadOf = "git://github.com/"

[url "git://github.com/"]
     insteadOf = "github:"

~/.ssh/config

Host github.com                                                             
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_rsa

JREAM commented Feb 23, 2017

I find this really easy

Example

git clone gh:jream/config-ubuntu.git

~/.gitconfig

[url "git@github.com:"]
     insteadOf = "gh:"
     pushInsteadOf = "github:"
     pushInsteadOf = "git://github.com/"

[url "git://github.com/"]
     insteadOf = "github:"

~/.ssh/config

Host github.com                                                             
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_rsa
@m4vr

This comment has been minimized.

Show comment
Hide comment
@m4vr

m4vr Feb 23, 2017

+1

m4vr commented Feb 23, 2017

+1

@lepetitchevalblanc

This comment has been minimized.

Show comment
Hide comment
@lepetitchevalblanc

lepetitchevalblanc Jun 8, 2017

With a git push, if underlying ssh returns an error as "nodename or servname" unknown replace the ":" by a / in the origin url, like
(git config --get remote.origin.url) ssh://git@github.com-[reponame]/[username]/[reponame].git (at least with git 2.11.0)

With a git push, if underlying ssh returns an error as "nodename or servname" unknown replace the ":" by a / in the origin url, like
(git config --get remote.origin.url) ssh://git@github.com-[reponame]/[username]/[reponame].git (at least with git 2.11.0)

@inakiabt

This comment has been minimized.

Show comment
Hide comment
@inakiabt

inakiabt Jul 14, 2017

I finally made it work! πŸŽ‰
The issue in my case (I think it's related to https://gist.github.com/jexchan/2351996#gistcomment-998128) was that I had this in my ~/.ssh/config (it's to make ssh connections persistent):

Host * !localhost
  ControlPath ~/tmp/ssh_mux_%h_%p_%r
  ControlMaster auto
  ControlPersist 2h

Whenever I connect to a server via SSH, that configuration checks if the files exists in ~/tmp if not, it creates a new one. But if it exists, it reuses the latest connection that created that file (I'm not pretty sure how exactly works, but it's something like that). With that ControlPath configuration, it creates files like: ~/tmp/ssh_mux_github.com-22-git because %h is for "remote host", %p is for "port" and %r is for "ssh user". So, no matter which repository hostname I used, the "remote host" was always github.com (because of the HostName github.com configuration this gist suggest) and the connection was reused every time.

The trick was change my ~/.ssh/config from ControlPath ~/tmp/ssh_mux_%h_%p_%r to ControlPath ~/tmp/ssh_mux-%n-%p-%r.
%n is for "local hostname" (the Host config), so now this control path file is created like ~/tmp/ssh_mux_github.com-activehacker-22-git.

inakiabt commented Jul 14, 2017

I finally made it work! πŸŽ‰
The issue in my case (I think it's related to https://gist.github.com/jexchan/2351996#gistcomment-998128) was that I had this in my ~/.ssh/config (it's to make ssh connections persistent):

Host * !localhost
  ControlPath ~/tmp/ssh_mux_%h_%p_%r
  ControlMaster auto
  ControlPersist 2h

Whenever I connect to a server via SSH, that configuration checks if the files exists in ~/tmp if not, it creates a new one. But if it exists, it reuses the latest connection that created that file (I'm not pretty sure how exactly works, but it's something like that). With that ControlPath configuration, it creates files like: ~/tmp/ssh_mux_github.com-22-git because %h is for "remote host", %p is for "port" and %r is for "ssh user". So, no matter which repository hostname I used, the "remote host" was always github.com (because of the HostName github.com configuration this gist suggest) and the connection was reused every time.

The trick was change my ~/.ssh/config from ControlPath ~/tmp/ssh_mux_%h_%p_%r to ControlPath ~/tmp/ssh_mux-%n-%p-%r.
%n is for "local hostname" (the Host config), so now this control path file is created like ~/tmp/ssh_mux_github.com-activehacker-22-git.

@DawnImpulse

This comment has been minimized.

Show comment
Hide comment
@DawnImpulse

DawnImpulse Aug 20, 2017

I was using the user as my github username rather than git . Hence having problems with connection . Now everything working perfectly . Thanks a lot .

I was using the user as my github username rather than git . Hence having problems with connection . Now everything working perfectly . Thanks a lot .

@GraniteConsultingReviews

This comment has been minimized.

Show comment
Hide comment
@GraniteConsultingReviews

GraniteConsultingReviews Aug 28, 2017

I was facing problems but thank god this works properly. Thanks for sharing

I was facing problems but thank god this works properly. Thanks for sharing

@cwangmove

This comment has been minimized.

Show comment
Hide comment
@cwangmove

cwangmove Sep 15, 2017

Thank you, JexChan! This post is really helpful.

According to my experiment, git config user.name "myusername" and git config user.email "my@email.com" does NOT matter at all. What really matters is what oleweidner mentioned in the first comment of this post as following:

`I had to change the [remote "origin"] / url field in my local .git/config to use the Host defined in .ssh/config in order for this to work, i.e.,

[remote "origin"]
url = git@github.com-activehacker:activehacker/gfs.git
Without that modification, git would just try to use my default ssh key.`

In addition, if your url from git hub is git@github.com:activehacker/gfs.git, when doing git clone, you need to do
$ git clone git@github.com-activehacker:activehacker/gfs.git

cwangmove commented Sep 15, 2017

Thank you, JexChan! This post is really helpful.

According to my experiment, git config user.name "myusername" and git config user.email "my@email.com" does NOT matter at all. What really matters is what oleweidner mentioned in the first comment of this post as following:

`I had to change the [remote "origin"] / url field in my local .git/config to use the Host defined in .ssh/config in order for this to work, i.e.,

[remote "origin"]
url = git@github.com-activehacker:activehacker/gfs.git
Without that modification, git would just try to use my default ssh key.`

In addition, if your url from git hub is git@github.com:activehacker/gfs.git, when doing git clone, you need to do
$ git clone git@github.com-activehacker:activehacker/gfs.git

@navyad

This comment has been minimized.

Show comment
Hide comment
@navyad

navyad Sep 25, 2017

following worked for me:

  • update url for origin in .git/config as given for HOST in /.ssh/config
  • git config user.email
  • git config user.name

navyad commented Sep 25, 2017

following worked for me:

  • update url for origin in .git/config as given for HOST in /.ssh/config
  • git config user.email
  • git config user.name
@jagroop

This comment has been minimized.

Show comment
Hide comment
@jagroop

jagroop Nov 29, 2017

thanks mate πŸ‘ πŸ’―

jagroop commented Nov 29, 2017

thanks mate πŸ‘ πŸ’―

@gaborod16

This comment has been minimized.

Show comment
Hide comment
@gaborod16

gaborod16 Jan 8, 2018

Guys, hope you won't lose as much time as I did to realize that I just had to reopen the console.
If you have all set up correctly and all of the sudden it stops working, just close and open your console and try again.

So sad...

Guys, hope you won't lose as much time as I did to realize that I just had to reopen the console.
If you have all set up correctly and all of the sudden it stops working, just close and open your console and try again.

So sad...

@ranjitis

This comment has been minimized.

Show comment
Hide comment
@ranjitis

ranjitis Jan 15, 2018

Another solution is to only have one active ssh key in the ssh-agent.

Example ssh config-file:
Host www.github.com
    ForwardAgent yes
    User jexchan

Only use one key in the ssh-agent at any time:
$ ssh-add -D
$ ssh-add ~/.ssh/id_rsa_jexchan

Change user:
$ ssh-add -D
$ ssh-add ~/.ssh/id_rsa_activehacker

Another solution is to only have one active ssh key in the ssh-agent.

Example ssh config-file:
Host www.github.com
    ForwardAgent yes
    User jexchan

Only use one key in the ssh-agent at any time:
$ ssh-add -D
$ ssh-add ~/.ssh/id_rsa_jexchan

Change user:
$ ssh-add -D
$ ssh-add ~/.ssh/id_rsa_activehacker

@L4grange

This comment has been minimized.

Show comment
Hide comment
@L4grange

L4grange Jan 31, 2018

Thank you so much, I finally set up both of my keys, ssh config and remote URLs correctly, I've been struggling for months when pushing projects to different accounts and finally everything is working!

Thank you so much, I finally set up both of my keys, ssh config and remote URLs correctly, I've been struggling for months when pushing projects to different accounts and finally everything is working!

@tannhaeuser

This comment has been minimized.

Show comment
Hide comment
@tannhaeuser

tannhaeuser Feb 12, 2018

...just removed my stupid comment here as I learned something the hard way...

Usually a Host-section could contain more than one IdentityFile entry - and a plain SSH connection will usually probe all keys in the given order until it finds one that can be used.

The same is true for cloning public repositories from github. It will ignore unknown keys in the config (not known to github at all) and accepts the first known key in the chain.

But if you try to push to a repository github bails out on the first unknown key or a key that is not associated with the targeted repo.

tannhaeuser commented Feb 12, 2018

...just removed my stupid comment here as I learned something the hard way...

Usually a Host-section could contain more than one IdentityFile entry - and a plain SSH connection will usually probe all keys in the given order until it finds one that can be used.

The same is true for cloning public repositories from github. It will ignore unknown keys in the config (not known to github at all) and accepts the first known key in the chain.

But if you try to push to a repository github bails out on the first unknown key or a key that is not associated with the targeted repo.

@TiE23

This comment has been minimized.

Show comment
Hide comment
@TiE23

TiE23 Feb 16, 2018

Keychain cannot remember your passwords in MacOS when using this trick?

I ran into this issue as a MacOS user. I use ssh-add -K to have MacOS's KeyChain remember my passwords to my two SSH keys. Yet I would still be asked for a password when pushing my change in my second account or other some such issue.

See. I traced it back... If you add the identity like so:

cd ~/.ssh;
ssh-add -K private.rsa;

And then in your .ssh/config file define your IdentityFile's absolute path (like I did):

  IdentityFile /Users/jdoe/.ssh/private.rsa
  IdentitiesOnly yes

It won't work. In the mind of the ssh agent and KeyChain private.rsa and /Users/jdoe/.ssh/private.rsa are different and will ask you for the password when trying to pull/push.

No, you need to be consistent with how you add the password to the keychain. Add your Identity with ssh-add -K /Users/jdoe/.ssh/private.rsa

(I use absolute path /Users/jdoe/ instead of ~/ just because I felt like it. I believe ~/ should work just fine.)

To fix this open up KeyChain Access in MacOS, search your keychain for your SSH keys and after reminding yourself of the passwords (you can look at them in KeyChain Access) delete them. Then re-add the Identities using ssh-add -K /Users/jdoe/.ssh/private.rsa. That should fix things up.

TiE23 commented Feb 16, 2018

Keychain cannot remember your passwords in MacOS when using this trick?

I ran into this issue as a MacOS user. I use ssh-add -K to have MacOS's KeyChain remember my passwords to my two SSH keys. Yet I would still be asked for a password when pushing my change in my second account or other some such issue.

See. I traced it back... If you add the identity like so:

cd ~/.ssh;
ssh-add -K private.rsa;

And then in your .ssh/config file define your IdentityFile's absolute path (like I did):

  IdentityFile /Users/jdoe/.ssh/private.rsa
  IdentitiesOnly yes

It won't work. In the mind of the ssh agent and KeyChain private.rsa and /Users/jdoe/.ssh/private.rsa are different and will ask you for the password when trying to pull/push.

No, you need to be consistent with how you add the password to the keychain. Add your Identity with ssh-add -K /Users/jdoe/.ssh/private.rsa

(I use absolute path /Users/jdoe/ instead of ~/ just because I felt like it. I believe ~/ should work just fine.)

To fix this open up KeyChain Access in MacOS, search your keychain for your SSH keys and after reminding yourself of the passwords (you can look at them in KeyChain Access) delete them. Then re-add the Identities using ssh-add -K /Users/jdoe/.ssh/private.rsa. That should fix things up.

@ann07cor

This comment has been minimized.

Show comment
Hide comment
@ann07cor

ann07cor Feb 19, 2018

Had to do the same to get it working. My friend, web developer from web development company helped me to solve it. He's a former programmer, has a huge experience in creating and optimizing more than 2,000 websites for small to mid-sized companies throughout the United States, so he usually gives me pieces of advice, cause I'm just the beginner..

ann07cor commented Feb 19, 2018

Had to do the same to get it working. My friend, web developer from web development company helped me to solve it. He's a former programmer, has a huge experience in creating and optimizing more than 2,000 websites for small to mid-sized companies throughout the United States, so he usually gives me pieces of advice, cause I'm just the beginner..

@anhducbkhn

This comment has been minimized.

Show comment
Hide comment
@anhducbkhn

anhducbkhn Mar 8, 2018

Work well. (Y)

Work well. (Y)

@arsmuun

This comment has been minimized.

Show comment
Hide comment
@arsmuun

arsmuun Mar 23, 2018

Worked good for me, thanks. Also had to match the origin url to the host url in config.

arsmuun commented Mar 23, 2018

Worked good for me, thanks. Also had to match the origin url to the host url in config.

@brlafreniere

This comment has been minimized.

Show comment
Hide comment
@brlafreniere

brlafreniere Apr 28, 2018

What is the subl command? It doesn't exist on my machine.

What is the subl command? It doesn't exist on my machine.

@DevinFrenze

This comment has been minimized.

Show comment
Hide comment
@DevinFrenze

DevinFrenze May 2, 2018

@brlafreniere it's the command for opening sublime

@brlafreniere it's the command for opening sublime

@ronapelbaum

This comment has been minimized.

Show comment
Hide comment
@ronapelbaum

ronapelbaum May 10, 2018

πŸ‘

πŸ‘

@Lathanao

This comment has been minimized.

Show comment
Hide comment
@Lathanao

Lathanao Jun 8, 2018

Thanks!

Lathanao commented Jun 8, 2018

Thanks!

@antonlpr

This comment has been minimized.

Show comment
Hide comment
@antonlpr

antonlpr Jun 15, 2018

DANKE!1

DANKE!1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment