For various reasons I have more than one GitHub account. Unfortunately GitHub only allows you to use your ssh-key on a single account. So if you have multiple accounts like I do then you need multiple ssh-keys and it can be annoying to deal with unless you get a little creative with your ssh configuration. Here is what I did for years before I finally got annoyed enough to research a better way.
- Change to project directory, do some work
- git push
- Get error about not having access rights
- ssh-add ~/.ssh/id_rsa_whatever_key
- On rare occasions I might still get the error because I had another key loaded that hadn't expired yet
- ssh-add -D (to remove all keys)
- ssh-add ~/.ssh/id_rsa_whatever_key
- git push (finally it works!)
The other thing that I would have liked to do is maybe even use my git package from inside my editor, Emacs, to push and pull commits but figuring out how to get that to work with various keys never seemed to make it on my radar. It's amazing how much you can put up with while you're in the middle of something and you just want to get it done. But one day I had finally had enough and I had some extra time so I decided to research how others have solved the problem and came up with a solution. I thought git might have a configuration where you could set a path to a key to be used for each repository, kind of like you can with your email address if you want to use a different one for different repositories for some reason. You can set repository level configurations. But it turns out this is all handled at the ssh level. The solution is quite simple. I have 3 ssh keys, so here is what I did.
- Create 3 ssh-keys giving each one a unique name, (ssh-keygen -t rsa)
- Create 3 github.com entries in your ~/.ssh/config file, one for each key you created
Host github.com-key1 HostName github.com User git IdentityFile ~/.ssh/id_rsa_key1 Host github.com-key2 HostName github.com User git IdentityFile ~/.ssh/id_rsa_key2 Host github.com-key1 HostName github.com User git IdentityFile ~/.ssh/id_rsa_key2
- Visit the repo or repos you want to use the first key with and update the remote with the new ssh config entry
git remote set-url origin git@github.com-key1:path-to/repo.git
- Rinse and repeat for your other repos using the appropriate key
Now that you have your keys in place, git
push/pull will just work
without any key management whatsoever! You never have to worry about
them expiring, overlapping, or any of those things you might have had
to deal with before if you were hard-headed like me. It will also just
work with Magit or whatever editor plugin you might want to use in
your environment.
Tags: #git
Categories: #technology