Howdy, partner?
First things first, if you’re attempting a wild juggling act between two different platforms like GitHub and GitLab, hold your horses! This post isn’t your ticket to success, you’re in the wrong rodeo, amigo. You can simply use the same key in two different platforms. But hey, who am I to judge?
Alright, so you’re straddling different accounts in the same Git platform like GitHub or GitLab, and they don’t allow using the same SSH key for two accounts. Don’t fret! Let’s breeze through the steps of managing not one, but two SSH keys for your Git adventures.
Step 1: Generating Unique SSH Keys
First things first, make sure you’ve got separate accounts for each purpose. Assuming you’ve got accounts with emails like personal@mail.com
and work@mail.com
, let’s get cooking:
mkdir $HOME/.ssh # Only if it's not there already
ssh-keygen -t ed25519 -C "personal@mail.com" -f $HOME/.ssh/key_personal
ssh-keygen -t ed25519 -C "work@mail.com" -f $HOME/.ssh/key_work
For those still rocking the Stone Age systems, if ed25519
doesn’t cut it,
just use rsa -b 4096
.
And hey, Windows gang, swap out $HOME
for %userprofile%
.
Now you’ve got a pair of keys for each: key_personal
and key_work
, along with their trusty sidekicks—the public keys.
Next, let’s introduce these keys to the SSH agent:
eval "$(ssh-agent -s)" # Raise the SSH flag!
ssh-add ~/.ssh/key_personal # Toss in your personal key
ssh-add ~/.ssh/key_work # And now the work key
Note: Still wrangling the rope on generating SSH key and adding it to your SSH agent? Check out this “How to generate SSH key and add to SSH agent in Windows/Linux/MacOS” page from GitHub.
Step 2: Register Keys with Respective Platforms
Hop onto GitHub or GitLab, or whatever floats your boat, and slide those public keys (key_personal.pub
and key_work.pub
) into the SSH settings.
Step 3: Configure SSH for Different Accounts
Time to set up separate SSH config files for your personal and work shindigs:
touch $HOME/.ssh/config_personal $HOME/.ssh/config_work
Fill ’em up like this:
Content of the config_personal
file:
Host github.com
HostName github.com
Port 22
User git
IdentityFile ~/.ssh/key_personal
Content of the config_work
file:
Host github.com
HostName github.com
Port 22
User git
IdentityFile ~/.ssh/key_work
Don’t forget to don the cloak of correct file permissions:
sudo chmod 600 ~/.ssh/config_personal
sudo chmod 600 ~/.ssh/config_work
Step 4: Setup Git Configuration
Create not one, not two, but three Git configuration files:
touch $HOME/.gitconfig $HOME/.gitconfig_personal $HOME/.gitconfig_work
In your main .gitconfig
, lead the path to personal and work configurations:
[include]
path = ~/.gitconfig_personal
[includeIf "gitdir:/home/john/projects/work/"]
path = ~/.gitconfig_work
Stick to absolute paths, skip the symlinks—they won’t work here.
Ah, and replace /home/john/projects/work/
with your own work directory, Sherlock.
In each specific config file, spill the beans on name, email and SSH config file paths:
Content of the .gitconfig_personal
file:
[user]
name = "John Doe"
email = personal@mail.com
[core]
sshCommand = ssh -F ~/.ssh/config_personal
Content of the .gitconfig_work
file:
[user]
name = "John Doe at work"
email = work@mail.com
[core]
sshCommand = ssh -F ~/.ssh/config_work
Step 5: Test Your Git-fu
Hopping around directories, verify if the correct Git configuration is in play. Go to any work project, example:
/home/john/projects/work/simple_work_project
and run
git config --show-origin --get user.email
The output should be:
file:/home/john/.gitconfig_work work@mail.com
Go anywhere outside /home/john/projects/work/
and run the same command again, the output should be:
file:/home/john/.gitconfig_personal personal@mail.com
If all’s well in the rodeo, you can git along just fine with your various repositories. Just stick to the trail, keep those work-related repositories corralled in the /work
folder, and let the SSH keys do their magic automatically. Easy as pie!
Step 6: Enjoy Seamless Git Usage!
With all the cards on the table, you’re now primed for Git greatness across your various accounts. Git going and may your commits be swift and your merges be painless!