DEV Community

Cover image for How To Configure Multiple Git Accounts with SSH on Your Local Machine
Samuel K.M
Samuel K.M

Posted on • Edited on

How To Configure Multiple Git Accounts with SSH on Your Local Machine

Imagine you're working with multiple organizations, each managing code versions differently. For example, you may need to create a new Git account using your work email while you already have Git set up for your personal account. In another scenario, each organization might use a different version control platform, such as GitHub, GitLab, or Bitbucket.

Local-Remote-Repos

This quick guide will walk you through the steps of managing such a setup, applicable to Windows, Mac OS, and Linux. The ~/.ssh/config files work similarly across Linux, Mac Os and Windows since they are part of the OpenSSH suite. However, a notable difference is that Linux & Mac Os typically come with SSH pre-installed and accessible in the PATH, whereas on Windows, OpenSSH often needs to be installed manually.

Setting Up Multiple Git Accounts Using SSH

We will cover two types of setups you might encounter:

  1. Multiple authentication methods on a single version control platform (e.g., GitHub).
  2. Different version control platforms, each with its own authentication method.

The following is a graphical representation of the SSH authentication setup we will be implementing.

Local-remote-repo-with-sshconfig

Step 1: Generate Unique SSH Keys

Naming your keys properly is crucial. I recommend using this naming convention: nameofvcplatform_nameoforganization_rsa. For example, github_tesla_rsa.

# GitHub Personal Acct
ssh-keygen -t rsa -b 4096 -C "your_email@personal.com" -f ~/.ssh/github_personal_rsa

# GitHub Organization Acct
ssh-keygen -t rsa -b 4096 -C "your_email@organization-name.com" -f ~/.ssh/github_organizationname_rsa

# GitLab
ssh-keygen -t rsa -b 4096 -C "your_email@organization-name.com" -f ~/.ssh/gitlab_organizationname_rsa

# Bitbucket
ssh-keygen -t rsa -b 4096 -C "your_email@organization-name.com" -f ~/.ssh/bitbucket_organizationname_rsa
Enter fullscreen mode Exit fullscreen mode

Step 2: Add SSH Keys to SSH Agent

In our case this would be:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/github_personal_rsa
ssh-add ~/.ssh/github_organizationname_rsa
ssh-add ~/.ssh/gitlab_organizationname_rsa
ssh-add ~/.ssh/bitbucket_organizationname_rsa

Enter fullscreen mode Exit fullscreen mode

Step 3: Add SSH Keys to Each Platform

Copy the public key and add it to your Git account. On Linux, use the cat command to display the key. Alternatively, find the appropriate command for your OS or simply open the key file and copy its contents."

# Copy public key
cat ~/.ssh/github_personal_rsa
cat ~/.ssh/github_organizationname_rsa
cat ~/.ssh/gitlab_organizationname_rsa
cat ~/.ssh/bitbucket_organizationname_rsa
Enter fullscreen mode Exit fullscreen mode

GitHub: Go to [SSH and GPG Keys(https://github.com/settings/keys).
GitLab: Go to SSH Keys.
Bitbucket: Go to SSH Keys.

Step 4. Configure SSH Config File

Create or edit the ~/.ssh/config file to define how SSH should handle each account.

The SSH config file is essential because it defines the hosts, enabling you to distinguish between different version control platforms and accounts by their names. Take a look at the SSH config for our repositories.

Note how Host and IdentityFile are configured.

# GitHub Personal
Host github-personal.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_personal_rsa

# GitHub Organization
Host github-organizationname.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github_organizationname_rsa

# GitLab
Host gitlab-organizationname.com
  HostName gitlab.com
  User git
  IdentityFile ~/.ssh/gitlab_organizationname_rsa

# Bitbucket
Host bitbucket-organizationname.org
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_organizationname_rsa
Enter fullscreen mode Exit fullscreen mode

Step 5: Using the repositories

The commands for cloning, pulling, or pushing will change based on the custom host names defined in the SSH config

For example:

1. Cloning Repositories
Instead of using the default host names (e.g., github.com, gitlab.com), you'll use the custom host names defined in the SSH config:

GitHub Personal:

git clone git@github-personal.com:username/repo.git
Enter fullscreen mode Exit fullscreen mode

GitHub Organization:

git clone git@github-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

**GitLab:**

git clone git@gitlab-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

Bitbucket:

git clone git@bitbucket-organizationname.org:organization/repo.git

2. Pulling or Pushing Changes

For pulling or pushing changes, you will use the same format, referencing the custom host names:

GitHub Personal:

git pull git@github-personal.com:username/repo.git
git push git@github-personal.com:username/repo.git
Enter fullscreen mode Exit fullscreen mode

GitHub Organization:

git pull git@github-organizationname.com:organization/repo.git
git push git@github-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

GitLab:

git pull git@gitlab-organizationname.com:organization/repo.git
git push git@gitlab-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

Bitbucket:

git pull git@bitbucket-organizationname.org:organization/repo.git
git push git@bitbucket-organizationname.org:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

3. Setting Remote URL for Existing Repositories

If you want to update the remote URL for an existing repository, you can use the following command:

GitHub Personal:

git remote set-url origin git@github-personal.com:username/repo.git
Enter fullscreen mode Exit fullscreen mode

GitHub Organization:

git remote set-url origin git@github-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

GitLab:

git remote set-url origin git@gitlab-organizationname.com:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

Bitbucket:

git remote set-url origin git@bitbucket-organizationname.org:organization/repo.git
Enter fullscreen mode Exit fullscreen mode

These adjustments ensure that Git uses the appropriate SSH key for the specified host, as defined in your SSH config file.

I hope you found the article helpful. Thank you for reading!

Top comments (9)

Collapse
 
tahsin000 profile image
Tahsin Abrar

Very nice post. It will be very helpful for beginners.

Collapse
 
robhayward profile image
Rob

Thanks. Really useful.

Collapse
 
svijaykoushik profile image
Vijay Koushik, S. 👨🏽‍💻

I've been looking for this for a long time. Great Post! let me test and update back

Collapse
 
bazeng profile image
Samuel K.M

I hope it helps. Welcome

Collapse
 
chema profile image
José María CL

I wrote an article about the same topic but in spanish. I love how you illustrate the idea with the diagrams and how concise your instructions are. So nice article!

Collapse
 
bazeng profile image
Samuel K.M

Thanks Jose, i recently realized its faster to learn using diagrams. Borrowed this from bytebytego

Collapse
 
ismailco96 profile image
ismail courr

This is Cool. Thank you for sharing

Collapse
 
detzam profile image
webstuff

how can i use this on windows system?

Collapse
 
bazeng profile image
Samuel K.M • Edited

Hello, this also applies to Windows. The ~/.ssh/config files function similarly on Linux, Mac Os and Windows as they are part of the OpenSSH suite. However, a key difference is that on Linux & Mac Os, SSH is usually pre-installed and readily available in the PATH, whereas on Windows, OpenSSH typically needs to be installed manually.

Some comments may only be visible to logged-in visitors. Sign in to view all comments.