I know that it's possible to set per-repo configs which override the user-level config (i.e. /path/to/my/repo/.gitconfig
overrides ~/.gitconfig
). Is it possible to set git configs which override the user-level settings for all child folders of a given folder? I.e., I have
|--topLevelFolder1
|--\
| ---.gitconfig_override
|--\
| ---childFolder1
| \---[...]
|--\
| ---childFolder2
| \---[...]
And I want the settings defined in .gitconfig_override
to apply in childFolder1
and childFolder2
.
My motivation for this is as follows: I have a work laptop which I also use in my spare time for personal projects. All my work code is nested within a single folder. When I push to work git repos, I need to do so with my work persona – work login instead of name, and work email. When I push to my own personal (github) repos, I want to do so with my real name and personal email.
Other possible solutions I've thought of (and problems):
- Create separate users for "work" and "play", set their user-level settings appropriately, and log in as the appropriate user when I switch context (hassle, plus I could easily forget to switch)
- Create a script that searches for git repos inside "workFolder", and adds/updates their .gitconfig files to hold the appropriate details (if I create a repo and forget to run the script before pushing, I will push as the wrong person)
- "hack" git such that every time it creates a repo, it checks the filepath and, if appropriate, updates the .gitconfig file (complicated, messy, and almost certainly The Wrong Way To Do It – plus, I wouldn't have the first clue how to go about it!)
I checked this question, which only seems to contain solutions for single repos, not multiple. Hopefully someone will see this question who missed that one!
Best Answer
As mentioned by NateEag's edit, git's Conditional Includes are perfect for this. Since that answer's the one for people on git < 2.13, here's one for those who have newer versions.
First, create a new config file somewhere with the settings you want to take effect in the sub-folders - using the original question's folders, let's say it's at
~/topLevelFolder1/.gitconfig_include
In
~/.gitconfig
, add:Any subfolder of
~/topLevelFolder1
will now include the config in~/toplevelFolder1/.gitconfig_include
- there isn't a need to manually change the.git/config
in each subfolder's repo. (This doesn't override whatever's in the subfolder config - it just adds to it, as "include" implies.)Notes:
~/.gitconfig
becauseincludeIf
will be overridden again by any config that comes after it./
) in thegitdir
condition is important.git config --list
is good for testing this. You'll see any overrides belowincludeif
lines in the output. You can also check specific entries with, e.g.,git config --get user.email
~/
and absolute paths with the Windows-style drive, likeC:/
using forward slashes only. Backslashes and Unix-style mount points like/c/
don't work.