Keeping up with two git identities
November 14, 2018
If you are working as a developer these days, then you most likely use a lot of open-source projects and perhaps your company even open sourced several internal projects. You probably fix issues you have with 3rd party dependencies from time to time. While at the same time you have internal project which you keep in the internal source control system.
Or maybe you are a consultant and have personal projects and clients' projects, then chances are high you have client specific email and your personal email.
While everything may seem to be working fine with your simple global git name and email, you then start to notice some of your GitHub commits lack an avatar, or quite the opposite—in your internal source control system (e.g. hosted BitBucket or Gitlab) your commits lack the avatar and username link is shaded.
You start to wonder why and after some digging you find out that you committed to an open-source project using your company email, or the other way around. None of these two options are good.
Don't worry, because with git 2.13 you get a feature called conditional includes. It allows you to configure git to take file system into consideration to figure out which credentials to use for the commit.
Say you keep your repositories in a specific folder or folders. And structure of those folder probably look similar to this:
☯ tree projects/ -L 2 projects/ ├── company │ ├── route │ ├── scripts │ └── tools └── oss ├── iamstarkov.com ├── mdx └── next.js
Then you want to use different identities for different purposes. Conditional includes will help with that.
You can include a config file from another conditionally by setting a
includeIf.<condition>.pathvariable to the name of the file to be included.
In order to utilise this feature you need three files:
And content of these files should look like this:
$ cat ~/.gitconfig [user] name = Firstname and Lastname [includeIf "gitdir:~/projects/oss/"] path = ~/.gitconfig_oss [includeIf "gitdir:~/projects/company/"] path = ~/.gitconfig_company $ cat ~/.gitconfig_oss [user] email = firstname.lastname@example.org $ cat ~/.gitconfig_company [user] email = email@example.com
Let's go through what is going on here.
~/.gitconfig you specify general options which can be overridden by sub-configs. In this case you specify
user.name, after that you have two
includeIf sections, with
gitdir option set to relevant folders with paths set to relevant sub-configs. And those sub-configs in turn should specify different
user.email values for different purposes:
firstname.lastname@example.org for open-source projects and
email@example.com for company specific projects. It was fast, huh?
Let's check if it works or not:
☯ cd ~/projects/oss/mdx ☯ git config --list | grep user user.name=Firstname and Lastname firstname.lastname@example.org ☯ cd ~/projects/company/route ☯ git config --list | grep user user.name=Firstname and Lastname email@example.com
Looks like, it does indeed work. Worth noticing this scheme will work for any number of git identities, the only requirement is to keep it in different folders.
To sum it up, now you can work with your company projects and with open-source projects without mixing two git identities ever again. Hurray!
Configure the shit out of your git!
your Vladimir Starkov