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 a git config user.email <email@example.com> for each project repository, this might 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”.
Situation
All my projects, both work and non-work, are located under the the ~/src/ directory.
The directories associated with each project, and the emails that I wish to use for them, are as follows:
- Personal:
~/src/github.com/alexandear/with the email alexandear@users.noreply.github.com. - GitHub Open Source:
~/src/github.com/with the email oleksandr.red+github@gmail.com. - EPAM work projects:
~/src/github.com/epam/with the email oredko@epam.com. - GitLab Open Source:
~/src/gitlab.com/with the email oleksandr.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 excaptions:~/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 if 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 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.