How to Manage Multiple Git Accounts (GitHub and GitLab) with Different SSH Keys and Users per Folder

In this tutorial you will learn how to manage multiple Git accounts (for example, a personal one and a company one) using **different SSH keys** and **automatic per-folder configurations**, all organized so you don't have to manually switch users or remotes.

Published on March 11, 2025

Views
100 views
Reading time:
Reading time: 3 min

In this tutorial you will learn how to manage multiple Git accounts (for example, a personal one and a company one) using different SSH keys and automatic per-folder configurations, all organized so you don't have to manually switch users or remotes.

##Goal

  • Have a personal account (personal GitHub and GitLab) with the same SSH key.
  • Have a company account (GitLab) with a different SSH key.
  • Automate user.name and user.email based on the folder.
  • Use differentiated remotes with the correct SSH key, especially for the company account.

##1. Create and Configure SSH Keys

First, we generate the keys (if you have already done this, you can skip this step).

###1.1. Generate Personal SSH Key

ssh-keygen -t rsa -b 4096 -C "your-personal-email@example.com" -f ~/.ssh/id_rsa

###1.2. Generate Company SSH Key

ssh-keygen -t rsa -b 4096 -C "your-company-email@example.com" -f ~/.ssh/id_rsa_company1

###1.3. Add Keys to the SSH Agent

# Personal
ssh-add ~/.ssh/id_rsa
# Company
ssh-add ~/.ssh/id_rsa_company1

###1.4. Upload Public Keys to the Platforms

  • Personal GitHub/GitLab: Upload `~/.ssh/id_rsa.pub`.
  • Company GitLab: Upload `~/.ssh/id_rsa_company1.pub`.

##2. Configure SSH to Use the Correct Keys

Edit (or create) the file `~/.ssh/config`:

nano ~/.ssh/config

Add:

# Personal Account (Personal GitHub and GitLab)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

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

# Company Account (Company GitLab)
Host gitlab.com-company1
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa_company1

Important: Use `gitlab.com-company1` as the host to distinguish it when cloning.


##3. Configure `user.name` and `user.email` per Folder

Edit or create the global `~/.gitconfig` file:

[user]
  name = Your Personal Name
  email = your-personal-email@example.com

[includeIf "gitdir:~/Developer/company1/"]
  path = ~/.gitconfig-company1

Create the file `~/[CompanyFolder]/.gitconfig`:

[user]
  name = Your Company Name
  email = your-company-email@example.com

##4. Clone Repositories Correctly

###4.1. Personal Account (Personal GitHub and GitLab)

git clone git@github.com:user/repository.git
git clone git@gitlab.com:user/repository.git

###4.2. Company Account (Company GitLab using custom host)

git clone git@gitlab.com-company1:company/repository.git

##5. Fix Remotes for Old Projects (Automatic Script)

###5.1. Create the Script

#!/bin/bash

# Base path where company repositories are located

BASE_DIR=~/Developer/company1

# Find all .git directories

find "$BASE_DIR" -type d -name ".git" | while read gitdir; do
  repo_dir=$(dirname "$gitdir")
echo "Fixing remote in: $repo_dir"

cd "$repo_dir"

# Get current remote

current_remote=$(git remote get-url origin)

# Replace if necessary

if [["$current_remote" == *"gitlab.com"* && "$current_remote" != *"gitlab.com-company1"*]]; then
new_remote=${current_remote/git@gitlab.com:/git@gitlab.com-company1:}
    echo "Changing remote from: $current_remote to: $new_remote"
    git remote set-url origin "$new_remote"
else
echo "Remote already correct or not gitlab: $current_remote"
fi
done

###5.2. Make it Executable

chmod +x fix-remotes.sh

###5.3. Run It

./fix-remotes.sh

##6. Automation When Cloning (Useful Alias)

Alias in `/.bashrc` or `/.zshrc`:

alias gitcompany1='git clone git@gitlab.com-company1:'

Usage:

gitcompany1 company/repository.git

With this configuration, you will have everything organized to work with multiple Git accounts without confusion.