Where do the settings in my Git configuration come from?
git, git-config, msysgit
Solution
Git checks four places for a configuration file:
- Your machine's system `.gitconfig` file.
- Your user `.gitconfig` file located at `~/.gitconfig`.
- A second user-specific configuration file located at `$XDG_CONFIG_HOME/git/config` or `$HOME/.config/git/config`.
- The local repository's configuration file `.git/config`.
The settings cascade in the following order, with each file adding or overriding settings defined in the file above it.
- System configuration.
- User configuration.
- Repository-specific configuration.
You can see what each file has defined using the following commands:
# System, applies to entire machine and all users
$ git config --system --list
$ git config --system --edit
# User defined
$ git config --global --list
$ git config --global --edit
You can see what just the repository-specific file has defined by opening up the file `.git/config` for that repository.
If you're using MSysGit on Windows, you'll probably find your user `~/.gitconfig` file where ever `%homepath%` points to if you use `echo %homepath%` from a Windows command prompt.
From the documentation for `git config`:
If not set explicitly with `--file`, there are four files where `git config` will search for configuration options:
`$(prefix)/etc/gitconfig`
System-wide configuration file.
`$XDG_CONFIG_HOME/git/config`
Second user-specific configuration file. If `$XDG_CONFIG_HOME` is not set or empty, `$HOME/.config/git/config` will be used. Any single-valued variable set in this file will be overwritten by whatever is in `~/.gitconfig`. It is a good idea not to create this file if you sometimes use older versions of Git, as support for this file was added fairly recently.
- `~/.gitconfig`
User-specific configuration file. Also called "global" configuration file.
`$GIT_DIR/config`
Repository specific configuration file.
If no further options are given, all reading options will read all of these files that are available. If the global or the system-wide configuration file are not available they will be ignored. If the repository configuration file is not available or readable, `git config` will exit with a non-zero error code. However, in neither case will an error message be issued.
The files are read in the order given above, with last value found taking precedence over values read earlier. When multiple values are taken then all values of a key from all files will be used.
All writing options will per default write to the repository specific configuration file. Note that this also affects options like `--replace-all` and `--unset`. `git config` will only ever change one file at a time.
You can override these rules either by command-line options or by environment variables. The `--global` and the `--system` options will limit the file used to the global or system-wide file respectively. The `GIT_CONFIG` environment variable has a similar effect, but you can specify any filename you want.
Problem
I've noticed that I have two listings for `core.autocrlf` when I run `git config -l` ``` $ git config -l core.symlinks=false core.autocrlf=false color.diff=auto color.status=auto color.branch=auto color.interactive=true pack.packsizelimit=2g help.format=html http.sslcainfo=/bin/curl-ca-bundle.crt sendemail.smtpserver=/bin/msmtp.exe diff.astextplain.textconv=astextplain rebase.autosquash=true user.name=name user.email=email@example.com core.autocrlf=true ``` Those last three (from user.name down) are the only ones in my `C:\users\username\.gitconfig` file. Where are all of the other ones coming from? Why is core.autocrlf listed twice? This is with MSysGit 1.8.3, and I also have Sourcetree installed (Windows 7). In Sourcetree I have unchecked the "Allow Sourcetree to modify your global Git config files"