DEV Community

Cover image for Setting up multiple ssh keys and git repositories on a single machine
אוריאל גימאני
אוריאל גימאני

Posted on

Setting up multiple ssh keys and git repositories on a single machine

In this short guide ill walk you through setting up multiple GitHub accounts with ssh on the same machine so that different repositories will be automatically related to the right ssh key and account.

Explaining the problem:
Lets say you have two GitHub accounts — one for work, the other for personal usage.
Each of these accounts has one or more repositories on your machine that you want to associate with said account.

Step 1: Setting up ssh

Create an ssh key for each account and add them to your GitHub accounts, You can use GitHub’s guide on how to do that here.

Step 2: Setting up ssh config hosts.

create an ssh config file in your .ssh folder. This file is responsible for telling your ssh agent what key to use for each domain:

touch ~/.ssh/config
Enter fullscreen mode Exit fullscreen mode

Now add the following to the config file:

Host github.com-personal-account # github.com-{name-with-hyphen}
  HostName github.com
  AddKeysToAgent yes
  UseKeychain yes # only if you used a keychain when creating the ssh key
  IdentityFile ~/.ssh/private_key_1

Host github.com-work-account
  HostName github.com 
  AddKeysToAgent yes
  UseKeychain yes # only if you used a keychain when creating the ssh key
  IdentityFile ~/.ssh/private_key_2
Enter fullscreen mode Exit fullscreen mode

You should be able test the success / failure of this part by using the following command:

ssh -T git@github.com-personal-account

# If everything is working you should see this message: 
Hi {github account name}! Youve successfully authenticated, but GitHub does not provide shell access.

# if not - troubleshoot the previous steps before moving on :)
Enter fullscreen mode Exit fullscreen mode

Step 3: Associate repositories with the corresponding ssh keys.

There are two different cases we may encounter here;
One is cloning a new repository and the second is attaching an already cloned repository.
Both cases are pretty straightforward so let me explain each of them.

Cloning a new repository:

Go to GitHub and press on the “<>code” button, choose ssh and copy the link.
You’ll receive something like the following: (please follow the example)

git@github.com:{repo-owner-name}/{repo-name}.git

# change it to:
git@github.com-{username-from-host-in-config}:{repo-owner-name}/{repo-name}.git

# example:
git@github.com-personal-account:{repo-owner-name}/{repo-name}.git

#now use it to run git clone:
git clone git@github.com-personal-account:{repo-owner-name}/{repo-name}.git
Enter fullscreen mode Exit fullscreen mode

The commands above will clone the repository and make sure that each git command involving this repository will be directed through the corresponding ssh key.

(Don’t forget to set the user.name and user.email properties for your commits metadata).

Linking an existing local repository:

In case you already have a local repository you can set it easily to work with your newly set ssh. Go to the repository base directory and follow these commands:

#this command shows the current origin of the repo
git remote -v

#you will recieve something like this:
origin git@github.com:{repo-owner}/{repo-name}.git (fetch)
origin git@github.com:{repo-owner}/{repo-name}.git (push)

# copy the origin and add to it as follows:
git@github.com-{profile-name}:{repo-owner}/{repo-name}.git

# example:
git@github.com-personal-account:{repo-owner}/{repo-name}.git

# now use the origin you wrote to set the repo new origin 
git remote set-url origin git@github.com-personal-account:{repo-owner}/{repo-name}.git
Enter fullscreen mode Exit fullscreen mode

And thats it, you're done.

You can make sure it works by running git pull.
(Don’t forget to set the user.name and user.email properties for your commits metadata).

I hope you find this guide helpful , For any questions / corrections / additions feel free to comment below.
Thanks a lot for reading!

Top comments (0)