Different Git configuration per directory
Mon 31 October 2022I have multiple accounts for GitLab and Github. The reason for this is that I work for multiple companies and they require me to use a unique email address and account for those services.
In some cases I perform the development on the same device. So I need to make sure that I perform my work with the correct account details and SSH credentials.
Also I want to be able to push work to my personal accounts from the work device. So in that case I need a similar setup.
By setting up my SSH and Git config in a specific way I can commit with the correct details and authenticate using the required keys.
The following examples are using GitLab, but you can alter the examples to your needs.
Gitconfig
Using a .gitconfig
file I can control how Git behaves.
In my root I a gitconfig like this:
user@computer:~$ cat ~/.gitconfig
[user]
email = user@domain.nl
name = Therry van Neerven
[includeIf "gitdir:~/Projects/company/"]
path = ~/Projects/company/.gitconfig
This config does two things:
- It sets a default user setting
- When I'm in a git directory which starts with
~/Projects/company
it loads~/Projects/company/.gitconfig
The second gitconfig loads specific data for the project of the company:
user@computer:~$ cat ~/Projects/company/.gitconfig
[user]
email = user@company.com
name = Therry van Neerven
The user key overrides the previous user key and now my commits are using the company email.
In this way I always commit with the correct email address.
SSH config
When pulling and pushing code I also need to make sure that I use the right SSH keys. This is done using a SSH config like this:
user@computer:~$ cat ~/.ssh/config
Host gitlab.com
IdentityFile ~/.ssh/id_rsa
Host gitlab.company.com
IdentityFile ~/.ssh/id_rsa.company
The first item picks the standard private for communication with GitLab. The second item matches a different private key with the domain of the GitLab instance of the company.
I also use a variant which allows me to use different keys for the same domain:
user@computer:~$ cat ~/.ssh/config
Host personal-gitlab
Hostname gitlab.com
IdentityFile ~/.ssh/id_rsa
Host company-gitlab
Hostname gitlab.com
IdentityFile ~/.ssh/id_rsa
In this case I need to change the repository url a little bit by swapping the hostname.
So git@gitlab.com:user/repo.git
becomes git@company-gitlab:user/repo.git
in case I want to use the personal SSH key for communication.