Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set git config values for all child folders

Tags:

git

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!

like image 388
scubbo Avatar asked Jan 23 '14 12:01

scubbo


People also ask

How do I apply a configuration across the entire git environment?

Git stores all global configurations in . gitconfig file, which is located in your home directory. To set these configuration values as global, add the --global option, and if you omit --global option, then your configurations are specific for the current Git repository. You can also set up system wide configuration.

How do I change my git config list?

Show global git config settings But at runtime, only the value set locally is used. If you would like to delete or edit a Git config value manually with a text editor, you can find the Git config file locations through the Git config list command's –show-origin switch.

What are the three levels of configurations available in git?

# There are 3 levels of git config; project, global and system.


1 Answers

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:

  • This setting should be located after the config you want to override in ~/.gitconfig 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.
like image 161
Ayulin Avatar answered Sep 21 '22 00:09

Ayulin