Search code examples
git

Set git config values for all child folders


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!


Solution

  • 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:

    [includeIf "gitdir:~/toplevelFolder1/"]
        path = ~/topLevelFolder1/.gitconfig_include
    

    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:

    • Within ~/.gitconfig this setting should be located after the config you want to override because includeIf will be overridden again by any config that comes after it.
    • This setting includes the file only if you are in a repository under the given path. It's ignored if you're in any non-repository sub-path.
    • The trailing forward slash (/) in the gitdir condition is important.
    • git config --list is good for testing this. You'll see any overrides below includeIf lines in the output. You can also check specific entries with, e.g., git config --get user.email
    • On Git for Windows, specify paths relative to your user directory with ~/ and absolute paths with the Windows-style drive, like C:/ using forward slashes only. Backslashes and Unix-style mount points like /c/ don't work. Furthermore, in the includeIf part, you must specify the path with the correct case as the comparisons are case sensitive.