Juggling multiple Git identities

This blog post explains how you can have multiple Git identities and make sure you automatically use the correct identity whenever you commit something.

July 6, 2017

Git is everywhere nowadays, and I use Git pretty much daily. I use it privately, for side projects or things like my dotfiles. I also use it at work, or at clients. That’s where things sometimes get a little complicated.

The problem

For private use, I use both Github and Bitbucket. Fortunately I use the same email address for both services. However, at work or clients I might encounter internally hosted Git services (Bitbucket Server, Github Enterprise, Gitlab, etc) that will most likely not use my private email address. And suddenly you run into the issue where Bitbucket Server is rejecting your commits because your email address is invalid.

One way to deal with that is making sure you properly set up the right Git settings per repo:

cd ~/git/clientA/somerepo
git config user.email benny@clientA.tld

cd ~/git/clientB/somerepo
git config user.email benny@clientB.tld

Etcetera.

A better solution

Maybe it’s just me being very sloppy at this stuff, but manually running git config .. for every repo is bound to go wrong. So, let’s find a better solution.

Fortunately, with the release of Git 2.13, Git gained support for Conditional Configuration.

Using Conditional Configuration, we can easily automate this. I already structured my ~/git directory so that every project/client has its own subdirectory. Now let’s add some includes:

# .gitconfig
...

[includeIf "gitdir:~/git/clientA/**"]
  path = ~/.gitconfig.clientA
[includeIf "gitdir:~/git/clientB/**"]
  path = ~/.gitconfig.clientB

And configure our settings for the various clients:

# .gitconfig.clientA
[user]
  email = benny@clientA.tld
# .gitconfig.clientB
[user]
  email = benny@clientB.tld
  signingkey = ABCD1234

[commit]
  gpgsign = true

This way, I use the correct email address for both clients, and have even set up automatic commit signing for client B. The only thing I need to do is create my repos in the right place.

I have kept the [user] block in the overall .gitconfig file, so by default I’ll use my personal Git identity.

Getting Git 2.13

Currently, Apple ships Git version 2.11.0 with macOS Sierra. If you want to get Git 2.13, the easiest way to do it is using Homebrew.