Skip to content

Instantly share code, notes, and snippets.

@jexchan
Created April 10, 2012 15:00
Show Gist options
  • Save jexchan/2351996 to your computer and use it in GitHub Desktop.
Save jexchan/2351996 to your computer and use it in GitHub Desktop.
Multiple SSH keys for different github accounts

Multiple SSH Keys settings for different github account

create different public key

create different ssh key according the article Mac Set-Up Git

$ ssh-keygen -t rsa -C "[email protected]"

Please refer to github ssh issues for common problems.

for example, 2 keys created at:

~/.ssh/id_rsa_activehacker
~/.ssh/id_rsa_jexchan

then, add these two keys as following

$ ssh-add ~/.ssh/id_rsa_activehacker
$ ssh-add ~/.ssh/id_rsa_jexchan

you can delete all cached keys before

$ ssh-add -D

finally, you can check your saved keys

$ ssh-add -l

Modify the ssh config

$ cd ~/.ssh/
$ touch config
$ subl -a config

Then added

#activehacker account
Host github.com-activehacker
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_activehacker

#jexchan account
Host github.com-jexchan
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_jexchan

Clone you repo and modify your Git config

clone your repo git clone [email protected]:activehacker/gfs.git gfs_jexchan

cd gfs_jexchan and modify git config

$ git config user.name "jexchan"
$ git config user.email "[email protected]" 

$ git config user.name "activehacker"
$ git config user.email "[email protected]" 

or you can have global git config $ git config --global user.name "jexchan" $ git config --global user.email "[email protected]"

then use normal flow to push your code

$ git add .
$ git commit -m "your comments"
$ git push

Another related article in Chinese

  1. http://4simple.github.com/docs/multipleSSHkeys/
@rnag
Copy link

rnag commented Jan 27, 2024

I've also written a pretty good Gist about another approach: https://gist.github.com/yinzara/bbedc35798df0495a4fdd27857bca2c1

Excellent write-ups! This and the linked article are both great to read through. I am new to SSH and GPG in GitHub so I needed to spend a lot of time to get up to speed.

FYI I recently got a new personal Macbook, so I found I've needed this sort of setup for git since I use one account for work, and another for personal stuff.

In case it's useful to others, I've gathered all the useful steps in the main steps, into a Bash/shell script. Helps for automation purposes, so e.g. less manual work, and also less things to remember.

Please do check it out and let me know (link below). I welcome any PRs or updates to script if needed. I tested this extensively on a Mac environment.

https://github.com/rnag/Mac-Quickstart/blob/main/scripts/bootstrap_ssh_for_github.sh


Updates:

  • I liked @airtonix suggestion on creating a ~/.dotfiles folder and adding all project .gitconfig there, so I've updated the script to do that.
  • I just got around to updating the script to handle semi-automated GPG key setup, for Git commit verification! Check it out. This simplifies the process a whole lot so you don't have to think about it, just copy paste some stuff around!

After running the script, file/directory structure in user home ~ would now look as follows:

.gitignore
Git-Projects/
├── Personal
└── Work
.dotfiles
├── Personal-github.gitconfig
└── Work-github.gitconfig
.ssh
├── config
├── id_ed25519_<gh_user>
├── id_ed25519_<gh_user>.pub
├── known_hosts

@rio-ap
Copy link

rio-ap commented Jul 11, 2024

munging your .git/config remote is just going to end up being a hassle in the long run.

trust me, been there done that, never doing it again tomorrow.

the. most. portable. way is to setup your root gitconfig so that it uses the includeif.

edit: like mentioned here:
https://gist.github.com/jexchan/2351996?permalink_comment_id=4456452#gistcomment-4456452

The includeif stanza/directive modifies your git config on the fly based on the CWD of the git operation. Relevant to this thread, this is where we can teach git about the ssh_command, which is where you point to your shiny unique ssh key.

The end result is a set of dotfiles ~/.gitconfig, ~/.dotfiles/this.gitconfig, ~/.dotfiles/that.gitconfig you can carry around and a directory structure for your ~/Projects

~/.gitconfig

[core]
	editor = DISPLAY=:1 code --wait

[init]
	defaultBranch = master

[rerere]
	enabled = true

[includeIf "gitdir:Projects/Mine/Gitlab/"]
        path = ~/.dotfiles/mine-gitlab.gitconfig

[includeIf "gitdir:Projects/Mine/Github/"]
        path = ~/.dotfiles/mine-github.gitconfig

[includeIf "gitdir:Projects/Experiements/Github/"]
        path = ~/.dotfiles/mine-github.gitconfig

[includeIf "gitdir:Projects/Work/Github/SomeCompany"]
        path = ~/.dotfiles/work-somecompany.gitconfig

Personal Configs

~/.dotfiles/mine-gitlab.gitconfig

[user]
name = My Name
email = [email protected]

~/.dotfiles/mine-github.gitconfig

[user]
name = My Name
email = [email protected]'com
signingkey = DEADBEEF

[commit]
gpgsign = true

[gpg]
program = age

For the above, any git operations occurring within a path that matches either:

  • Projects/Mine/Gitlab/
  • Projects/Mine/GitHub/, or
  • Projects/Experiements/Github/

will use my github config.

Work Configs

~/.dotfiles/work-github-somecompany.gitconfig

[core]
sshCommand = "ssh -o IdentitiesOnly -i ~/.ssh/id_rsa-mymachinename-github-somecompany -F /dev/null"

For the above, any git operation occuring in a directory that matches Projects/Work/Github/SomeCompany will specifically use a different ssh key despite my ~/.ssh/config declaring another for other general github ssh connections. The -o IdentitiesOnly tells ssh to use only the private key specified with the "-i" option and ignore any other keys in the SSH agent or on the remote server.

The main reasons I love this setup :

can just copy paste a github git repo url with wild abandon and paste it without having to remember the magical things to modify.

don't have to do anything in the ~/.ssh/config since what we really wanted this for was git and nothing else.

thank you, this work best for my need

@yurtpage
Copy link

You have and error in the line:

sshCommand = "ssh -o IdentitiesOnly -i ~/.ssh/id_rsa-mymachinename-github-somecompany -F /dev/null"

The option value for the IdentitiesOnly is empty so the line should be:

sshCommand = "ssh -o IdentitiesOnly=yes -i ~/.ssh/id_rsa-mymachinename-github-somecompany -F /dev/null"

@TonyDo99
Copy link

TonyDo99 commented Nov 1, 2024

On Macbook, it works

Host github.com HostName github.com User your_user_account_github PreferredAuthentications publickey IdentityFile ~/.ssh/your_user_account_github_rsa IdentitiesOnly yes

This work with me. Thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment