Photo by Maddy Baker on Unsplash
If you are like me and work for different companies, have several side hustles and fun projects, you will probably have the same problem as I have:
You want to use different configurations, like E-Mail Addresses, for those repositories.
Of course, you can always apply a local configuration to each repository or even use some scripts or aliases to help you out. But again, if you are like me, you won’t be happy with it, because you will forget to apply it over and over again.
Conditional Configuration
Git allows you to include external configuration-files based on conditions, like the current directory. With this in mind, the problem above is actually easily solvable.
First use different base-directories for each “area”, like your different work-places and personal stuff:
/home/me/
dev-work-a/
dev-work-b/
dev-personal/
Then create a .gitconfig-file for each of those areas:
/home/me/
.gitconfig (your main configuration)
.gitconfig-work-a (specific configuration for work a)
.gitconfig-work-b (specific configuration for work b)
.gitconfig-personal (specific configuration for personal projects)
In your main .gitconfig-File, instead of the actual values, you conditionally include the other files:
# ~/.gitconfig
[includeIf "gitdir:~/dev-work-a/"]
path = .gitconfig-work-a
[includeIf "gitdir:~/dev-work-b/"]
path = .gitconfig-work-b
[includeIf "gitdir:~/dev-personal/"]
path = .gitconfig-personal
and in the specific files, you just define the specific configuration values:
# ~/.gitconfig-work-a
[user]
name = Scooby Doo
email = scooby@worka.com
# ~/.gitconfig-work-b
[user]
name = Scooby Doo, Food-Department
email = scooby@workb.com
# ~/.gitconfig-personal
[user]
name = Scooby
email = me@scoobydoo.com
That’s basically it. So now, when you are for example in ~/dev-personal/bigbang-side-hustle
Git will get your user-configuration from .gitconfig-personal
.
One more thing
Well, of course, you cannot use conditional configuration for user-configurations like name and e-mail only, it’s just a very common use case. But in fact, you can use it for whatever configuration you like.
There are also two more conditions like gitdir
:
-
onbranch
lets you apply configurations based on the branch you are on -
gitdir/i
likegitdir
, but case-insensitive
It's worth mentioning that this works on all platforms and is very Dotfiles-friendly.
Also see documentation for more information.
Have fun!
Top comments (9)
I use instead
Can you explain little more about your solution? I don't think that this is working just by "injecting" additional partial .gitconfig-Files into the file-tree.
Uhh, sorry. The path is
.git/config
.Each project can have its own
.git/config
. This is described in the manual as a local configuration that overrides the same keys in the global config.Instead use
--local
flag, This will override the global config.git config --global
writes the config to~/.gitconfig
andgit config --local
writes to.git/config
Well, this is what I defined in the article with "you can always apply a local configuration to each repository". That's ok if you have one or two repositories to apply this configuration to, but if you have dozens or more then this is just not feasible anymore - at least for me.
With the solution in the article, one can apply those configurations as defaults for all of your repositories in the corresponding base-folder. So both ways are totally fine, it just depends on the situation, which one suits better.
Much helpful!
Very useful tip, tks man.
Great post
I love this, just starting to use git in personal projects and this is really helpful.