Multiple git accounts in one machine
Sometimes we would require to handle multiple git accounts say a personal one and one associated with work. It can become frustrating to switch between accounts while committing or pushing any changes.
Changing names manually
One way to tackle this is to set the name and email before committing the changes.
git config --global user.name "your_first_name your_last_name"
git config --global user.email "your_email"
But this can become very much tedious if one is constantly working between official and personal projects.
What if we can automate this?
Git’s includeIf to the rescue.
Say we maintain all our work related repositories in our Work folder and similarly all our Personal repositories in the Personal folder, we can use different git configurations and include them based on some conditions.
First create a git config for your Work environment and name .gitconfig-work
vi ~/.gitconfig-work
And add the following lines
[user]
name = your-work-name
email = your-work-email
[core]
autocrlf = input
editor = "'/usr/local/bin/atom' -n -w"
[filesystem "Oracle Corporation|1.8.0_131|/dev/disk1s5"]
timestampResolution = 1002 milliseconds
minRacyThreshold = 0 nanoseconds
[commit]
gpgSign = true
[tag]
gpgSign = true
# Add other work related stuffs
Create another config for your Personal work environment and name the config file .gitconfig-personal.
vi ~/.gitconfig-personal
Add add the following lines
[user]
name = your-personal-name
email = your-personal-email
[commit]
gpgSign = true
[tag]
gpgSign = true
# Add other personal work related stuffs
Now we go to our main git configuration file
vi ~/.gitconfig
and add the following code
[includeIf "gitdir:/Users/sathish/Work"]
path = ~/.gitconfig-work
[includeIf "gitdir:/Users/sathish/Personal"]
path = ~/.gitconfig-personal
Now whenever we commit a file in any repository inside our Work folder, git automatically sets the configuration from .gitconfig-work and your your-work-name and your-work-email will be used. Similarly any commits made inside the Personal folder will have your your-personal-name and your-personal-email.
Let’s verify!
$ cd ~/Work
$ git init work-test-repo
$ git config -l
credential.helper=osxkeychain
includeif.gitdir:/Users/sathish/Work/.path=~/.gitconfig-work
user.name=your-work-name**
user.email=your-work-email**
core.autocrlf=input
core.editor= '/usr/local/bin/atom' -n -w
filesystem.Oracle Corporation|1.8.0_131|/dev/disk1s5.timestampresolution=1002 milliseconds
filesystem.Oracle Corporation|1.8.0_131|/dev/disk1s5.minracythreshold=0 nanoseconds
commit.gpgsign=true
tag.gpgsign=true
includeif.gitdir:/Users/sathish/Personal/.path=~/.gitconfig-personal
$ cd ~/Personal
$ git init personal-test-repo
$ git config -l
credential.helper=osxkeychain
includeif.gitdir:/Users/sathish/Work/.path=~/.gitconfig-work
includeif.gitdir:/Users/sathish/Personal/.path=~/.gitconfig-personal
user.name=your-personal-name**
user.email=your-personal-email**
commit.gpgsign=true
tag.gpgsign=true
As you can see above, initializing a repository and running git config -l in two different folders gives us two different configurations.