Git config with multiple identities

June 17, 2020    Article    360 words    2 mins read

Let’s say you work with multiple repositories, some personal, some work-related and you’re doing some freelance work for a friend or two. You definitely don’t want to use the same identity and expose your juicy email and the linked GPG key you sign your commits with. Or if you’re bipolar.

Let’s assume your git config is similar to this (just an example, not the same name and email address, of course).

$ git config --get
Don Donnington
$ git config --get

Start by removing the existing global identity:

# unset user name
$ git config --global --unset
# unset user email
$ git config --global --unset
# unset GPG signing key if you're using one, skip this line if it looks like voodoo magic to you
$ git config --global --unset user.signingkey
# require config to exist if you want to make commits
$ git config --global user.useConfigOnly true

Beginning with git version 2.13, you can use conditional includes that will help you configure everything correctly.

So, you need to set up a git username and email address depending on the directory you are in. Add the lines below in your ~/.gitconfig:

# when you are in ~/projects the ~/.gitconfig-personal will be used 
[includeIf "gitdir:~/projects/"]
	path = ~/.gitconfig-personal
# when you are in ~/projects/work the ~/.gitconfig-work will be used 
[includeIf "gitdir:~/projects/work/"]
	path = ~/.gitconfig-work

# when you are in ~/projects/freelance the ~/.gitconfig-freelance will be used 
[includeIf "gitdir:~/projects/freelance/"]
	path = ~/.gitconfig-freelance

Add your personal information in the ~/.gitconfig-personal file:

	email =
	name = James Hetfield
	signingkey = ACAB1234

Add your workplace information in the ~/.gitconfig-work file:

	email =
	name = Jason Newsted
	signingkey = FE2CCA41
	sshCommand = ssh -i ~/.ssh/work_ed25519

Add your freelancing (if you need a third identity, of course) information in the ~/.gitconfig-freelance file:

	email =
	name = Cliff Burton
	signingkey = E1ADB1C9

If you want to test your configuration, move into one of the folders, for example ~/projects/work/ and check your git configuration:

$ cd ~/projects/work/
$ git config --get
Jason Newsted
$ cd ~/projects/freelance/
$ git config --get
Cliff Burton

Rock on!