.gitconfig
is usually stored in the user.home
directory.
I use a different identity to work on projects for Company A and something else for Company B (primarily the name / email). How can I have two different Git configurations so that my check-ins don’t go with the name / email?
As of git version 2.13, git supports conditional configuration includes. In this example we clone Company A’s repos in ~/company_a
directory, and Company B’s repos in ~/company_b
.
At the end of your .gitconfig
file, you can put something like this:
[includeIf "gitdir:~/company_a/"]
path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
path = .gitconfig-company_b
Example contents of .gitconfig-company_a
(the [core]
section can be omitted if the global ssh key can be used):
[user]
name = John Smith
email = [email protected]
[core]
sshCommand = ssh -i ~/.ssh/id_rsa_companya
Example contents of .gitconfig-company_b
:
[user]
name = John Smith
email = [email protected]
[core]
sshCommand = ssh -i ~/.ssh/id_rsa_companyb
There are 3 levels of git config; project, global and system.
- project: Project configs are only available for the current project and stored in .git/config in the project’s directory.
- global: Global configs are available for all projects for the current user and stored in ~/.gitconfig.
- system: System configs are available for all the users/projects and stored in /etc/gitconfig.
Create a project specific config, you have to execute this under the project’s directory:
$ git config user.name "John Doe"
Create a global config:
$ git config --global user.name "John Doe"
Create a system config:
$ git config --system user.name "John Doe"
And as you may guess, project overrides global and global overrides system.
Note: Project configs are local to just one particular copy/clone of this particular repo, and need to be reapplied if the repo is recloned clean from the remote. It changes a local file that is not sent to the remote with a commit/push.
The .git/config
file in a particular clone of a repository is local to that clone. Any settings placed there will only affect actions for that particular project.
(By default, git config
modifies .git/config
, not ~/.gitconfig
– only with --global
does it modify the latter.)
Thanks @crea1
A small variant:
As it is written on https://git-scm.com/docs/git-config#_includes:
If the pattern ends with
/
,**
will be automatically added. For example, the patternfoo/
becomesfoo/**
. In other words, it matchesfoo
and everything inside, recursively.
So I use in my case,
~/.gitconfig :
[user] # as default, personal needs
email = [email protected]
name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
path = .gitconfig-job
# all others section: core, alias, log…
So If the project directory is in my ~/wokspace/
, default user settings is replace with
~/.gitconfig-job :
[user]
name = John Smith
email = [email protected]