为什么Git配置列表(总数)与系统+全局+本地不相同?

18
在 Windows 上的 Git 2.6.3 版本中,为什么会出现以下命令结果:
git config --list

不同于其他的东西:

git config --list --system
git config --list --global
git config --list --local

第一个选项列出了比其他选项总和更多的选项。 我已经重定向到文件和kdiff比较,并且存在差异。

按照要求,这是在git config --list中而不在系统/全局/本地分组中的值:

core.symlinks=false
core.autocrlf=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=C:/Program Files (x86)/Git/mingw32/ssl/certs/ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true

上面引用的配置(不在系统/全局/本地)中,这些值保存在哪里?


4
你能分享一下这些文件之间的区别吗? - Whymarrh
2个回答

19
TL;DR: C:\Users\All Users\Git\config.
参见 git-for-windows PR 470

在Windows上,由于没有中央的/etc/目录,因此还有另一个配置文件(位于%PROGRAMDATA%\Git\config),旨在包含运行在计算机上的所有与Git相关的软件的设置。
因此,这个配置文件比$(prefix)/etc/gitconfig文件的优先级更低。

您可以通过输入以下命令(使用git 2.8+,2016年3月)进行检查:

git config --list --show-origin

请查看 "Git配置文件中的设置来自哪里?"


git config FILES所述,Git 在 3 个位置(Git 仓库之外)查找配置的值(或默认值,如果未找到)。请注意,保留 HTML 标签。
$(prefix)/etc/gitconfig

系统范围的配置文件。
$XDG_CONFIG_HOME/git/config

第二个用户特定的配置文件。
如果$XDG_CONFIG_HOME未设置或为空,则将使用$HOME/.config/git/config。在此文件中设置的任何单值变量都将被~/.gitconfig中的内容覆盖。如果您有时使用较旧版本的Git,则最好不要创建此文件,因为对该文件的支持是最近添加的。

~/.gitconfig

用户特定的配置文件。也称为“全局”配置文件。

但是快速进程监视器提到了第四个位置(同样不在git仓库本身之内)

programdata

C:\ProgramData\Git 中,我看到额外的值:

C:\ProgramData\Git>more config
[core]
        symlinks = false
        autocrlf = true
[color]
        diff = auto
        status = auto
        branch = auto
        interactive = true
[pack]
        packSizeLimit = 2g
[help]
        format = html
[http]
        sslCAInfo = C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
[sendemail]
        smtpserver = /bin/msmtp.exe

[diff "astextplain"]
        textconv = astextplain
[rebase]
        autosquash = true

正如在“Windows中ProgramData文件夹的意义是什么?”中提到的那样,该文件夹是来自All Users的文件夹:
C:\Users\All Users\Git>dir
 Volume in drive C has no label.

 Directory of C:\Users\All Users\Git

23/10/2015  16:36    <DIR>          .
23/10/2015  16:36    <DIR>          ..
23/10/2015  16:36               350 config

3

Git 从三个不同的配置文件中读取值。

  1. 系统 - 此文件中的配置值适用于计算机上的所有用户。
  2. 全局 - 此文件中的配置值适用于单个用户。此文件位于“~/.gitconfig”。可以使用此文件覆盖系统配置文件设置的配置值。
  3. 本地 - 此文件中的值适用于单个存储库。此文件位于“.git/config”。可以使用此文件覆盖全局和系统配置文件设置的配置值。

例如,您可以配置 git 安装以使用您的电子邮件地址。

git config --global user.email xyz@example.com

现在你正在处理一个项目。这个特定的项目要求你使用不同的电子邮件地址abc@example.com。但是所有其他项目仍然使用xyz@example.com。你可以使用以下方法为特定存储库设置电子邮件地址:

git config --local user.email acb@example.com

Git会读取所有三个配置文件,并结合这些文件中的配置值来得出最终的配置值。如果在最终的配置值中git没有找到所需的git配置变量的值,那么它将使用变量的默认内部值。


请再次阅读问题和所选答案。它非常有教育意义。 - ferpega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接