I work simultaneously on different companies’ projects, open-source projects, and personal projects. I should therefore use the same username but distinct email addresses for each of them. Although we can set git config user.email <email@example.com> for each project repository, this can be a tedious manual task and perhaps unsuitable.
The Git config manual describes the use of configuration files to better manage such a task through “Conditional includes”.
All my projects, both work and non-work, are located under the ~/src/ directory.
The directories associated with each project and the emails I wish to use for them are as follows:
- Personal:
~/src/github.com/alexandear/with the emailalexandear@users.noreply.github.com. - GitHub Open Source:
~/src/github.com/with the emailoleksandr.red+github@gmail.com. - EPAM work projects:
~/src/github.com/epam/with the emailoredko@epam.com. - GitLab Open Source:
~/src/gitlab.com/with the emailoleksandr.red+gitlab@gmail.com.
Resolution
First, set a global username and email in the ~/.gitconfig file. These will be used by default:
[user]
name = Oleksandr Redko
email = oleksandr.red@gmail.com
Second, create different git config files for the different types of work:
~/.gitconfig-alexandearfile:[user] email = alexandear@users.noreply.github.com~/.gitconfig-githubfile:[user] email = oleksandr.red+github@gmail.com~/.gitconfig-epamfile:[user] email = oredko@epam.com~/.gitconfig-gitlabfile:[user] email = oleksandr.red+gitlab@gmail.com
Third, set conditional includes in the ~/.gitconfig by providing path patterns:
[includeIf "gitdir:~/src/github.com/"]
path = ~/.gitconfig-github
[includeIf "gitdir:~/src/github.com/alexandear/**/.git"]
path = ~/.gitconfig-alexandear
[includeIf "gitdir:~/src/github.com/epam/**/.git"]
path = ~/.gitconfig-epam
[includeIf "gitdir:~/src/gitlab.com/"]
path = ~/.gitconfig-gitlab
Explanation:
"gitdir:~/src/github.com/"matches all projects under~/src/github.com/directories with specific exceptions:~/src/github.com/alexandear/**and~/src/github.com/epam/**. These are excluded because"gitdir:~/src/github.com/alexandear/**/.git"and"gitdir:~/src/github.com/epam/**/.git"are placed after"gitdir:~/src/github.com/"."gitdir:~/src/gitlab.com/"matches all projects located within~/src/gitlab.com/directories.
Now, let’s verify that the correct emails are set:
For personal projects under the
github.com/alexandeardirectory:$ cd ~/src/github.com/alexandear/import-gitlab-commits $ git config user.email alexandear@users.noreply.github.comFor open-source GitHub projects:
$ cd ~/github.com/golangci/golangci-lint $ git config user.email oleksandr.red+github@gmail.comFor EPAM work projects under the
github.com/epamdirectory:$ cd ~/src/github.com/epam/OSCI $ git config user.email oredko@epam.comFor open-source GitLab projects:
$ cd ~/src/gitlab.com/gitlab-org/gitlab $ git config user.email oleksandr.red+gitlab@gmail.com
Conclusion
Using the config option includeIf and setting up related .gitconfig files allows you
to specify your preferred Git settings for each project or company individually.
For instance, you can have different user names and email addresses for different repositories.