Windows特定的Git配置设置在哪里设置?

36

我已经阅读了Git文档和我的 Git 配置从哪里来,但我仍然无法理解部分设置。

我正在使用 Windows 10 上的 Git 2.5.3。这是git config -l的输出结果:

λ git config -l
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/Git/mingw64/ssl/certs/ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
user.name=Ben Collins
user.email=#redacted#
alias.sm=submodule
alias.br=branch
alias.co=checkout
alias.st=status
alias.rebuild=!git rm --cached -r . && git reset --hard
core.excludesfile=C:\Users\Benjamin\Documents\gitignore_global.txt
core.editor=c:/Users/Benjamin/AppData/Local/atom/bin/atom.cmd
core.attributesfile=C:\Users\Benjamin\.gitattributes
push.default=simple
merge.tool=p4merge
mergetool.p4merge.cmd=p4merge.exe "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
mergetool.p4merge.path=C:/Program Files/Perforce/p4merge.exe
gui.encoding=utf-8
diff.guitool=p4merge
difftool.p4merge.path=C:/Program Files/Perforce/p4merge.exe
difftool.p4merge.cmd=p4merge.exe "$LOCAL" "$REMOTE"
mergetool.keepbackup=false
rerere.enabled=true
credential.helper=!'C:\Users\Benjamin\AppData\Roaming\GitCredStore\git-credential-winstore.exe'
filter.lfs.clean=git lfs clean %f
filter.lfs.smudge=git lfs smudge %f
filter.lfs.required=true
color.diff.whitespace=red reverse

令人烦恼的是,前十二个设置我无处找到

C:\Program Files\Git
λ git config --system --list
fatal: unable to read config file 'C:\Program Files\Git\mingw64/etc/gitconfig': No such file or directory
C:\Program Files\Git
λ git config --global --list
user.name=Ben Collins
user.email=#redacted#
alias.sm=submodule
alias.br=branch
alias.co=checkout
alias.st=status
alias.rebuild=!git rm --cached -r . && git reset --hard
core.excludesfile=C:\Users\Benjamin\Documents\gitignore_global.txt
core.editor=c:/Users/Benjamin/AppData/Local/atom/bin/atom.cmd
core.attributesfile=C:\Users\Benjamin\.gitattributes
push.default=simple
merge.tool=p4merge
mergetool.p4merge.cmd=p4merge.exe "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
mergetool.p4merge.path=C:/Program Files/Perforce/p4merge.exe
gui.encoding=utf-8
diff.guitool=p4merge
difftool.p4merge.path=C:/Program Files/Perforce/p4merge.exe
difftool.p4merge.cmd=p4merge.exe "$LOCAL" "$REMOTE"
mergetool.keepbackup=false
rerere.enabled=true
credential.helper=!'C:\Users\Benjamin\AppData\Roaming\GitCredStore\git-credential-winstore.exe'
filter.lfs.clean=git lfs clean %f
filter.lfs.smudge=git lfs smudge %f
filter.lfs.required=true
color.diff.whitespace=red reverse

此外,当我尝试取消前十二个设置之一时,它没有任何效果:

C:\Users\Benjamin\Projects\blah [master +0 ~1 -0]
λ git config --unset core.autocrlf
C:\Users\Benjamin\Projects\blah [master +0 ~1 -0]
λ git config core.autocrlf
true
C:\Users\Benjamin\Projects\Saddleback\cm-core [master +0 ~1 -0]
λ git config --unset-all core.autocrlf
C:\Users\Benjamin\Projects\Saddleback\cm-core [master +0 ~1 -0]
λ git config core.autocrlf
true

这前十二个设置是否是硬编码或某种特定于平台的?我该如何控制它们?


这个有帮助吗:https://dev59.com/4HI95IYBdhLWcg3w3iDG? - hjpotter92
2
这些可能是Git的默认设置,必须将其设置为某些内容。您可以尝试将它们设置为其他内容,例如 git config core.autocrlf false,而不是取消设置它们。如果这样做有效,并且您随后取消了 core.autocrlf,它是否会恢复为 true - Chris
@BenCollins,我不确定你的意思。假设它成功地改变了值,git config --global core.autocrlf false不是有意义的吗?接下来使用git config --global --unset core.autocrlf,假设它将您恢复到当前状态? - Chris
@Chris 是的,从意义上讲,我可以覆盖较低配置中的值,但我的问题的重点是存在某些更高级别、未命名、不可触及的配置,而我想要控制它。 - Ben Collins
3
如果有帮助的话,我找到了这个位置,使用命令git config --show-origin -l,在找到这个问题之前。 - ardila
显示剩余6条评论
3个回答

46
根据此提交所述,他们为Windows添加了另一个配置位置,即使在使用--system之前也会应用它:

文件/etc/gitconfig可用于存储系统范围的默认配置。在Windows上,配置也可以存储在C:\ProgramData\Git\config中;此文件还将被基于libgit2的软件使用。

...

在Windows上,由于没有集中的/etc/目录,因此还有另一个配置文件,旨在包含运行在计算机上的所有Git相关软件的设置。 因此,此配置文件的优先级甚至低于$(prefix)/etc/gitconfig文件。

因此,我相信您可以在C:\ProgramData\Git\config中找到这些神秘设置。


从该提交中,我可以看到git config --system --list应该显示这些设置,但似乎缺少C:\Program Files\Git\mingw64/etc/gitconfig文件使操作中止,这可能是一个错误。


这个回答没有得到它应该得到的赞数 :) PS. 我有系统 gitconfig 文件,但是在运行 git config --system --list 命令时,除了那个文件中的内容之外,我没有看到其他任何东西(我没有看到那个隐藏得很好的 programdata 文件)。 - andrei.serea
2
请注意,从Git版本2.17开始,似乎没有命令行工具可以修改C:\ProgramData\Git\config中的设置。该文件默认情况下只对管理员权限锁定,因此我所做的是在我的编辑器(Notepad++)快捷方式上执行“以管理员身份运行”上下文菜单,然后直接进行编辑。 - satyagraha
3
"这个文件也将被基于libgit2的软件使用。" C:\ProgramData\Git\Config文件中的设置在列表中出现,但在使用三个开关(--system,--global,--local)时却没有出现,这真的很奇怪。 - Triynko
4
自 v2.23.0 版本起,这已不再是正确的。现在的位置是 C:\Program Files\Git\etc\gitconfig。请参阅 https://github.com/git-for-windows/build-extra/blob/master/ReleaseNotes.md。 - user202472
对我来说,由于某种原因,它在这里... C:\Users{myusername}\AppData\Local\Programs\Git\etc\gitconfig。 - KevinVictor
@KevinVictor,也许你只是为你的用户帐户安装了Windows版的Git? - Michael

29

在我的Git版本中,列表命令上有一个--show-origin开关,可以显示设置被应用的位置。我同意这很令人困惑,因为没有提供开关来访问ProgramData中的Windows配置位置。

在我的Git版本中,列表命令上有一个--show-origin开关,可以显示设置被应用的位置。我同意这很令人困惑,因为没有提供开关来访问ProgramData中的Windows配置位置。

C:\Users\karlb>git --version
git version 2.11.0.windows.3

C:\Users\karlb>git config --list --show-origin
file:"C:\\ProgramData/Git/config"       core.symlinks=false
file:"C:\\ProgramData/Git/config"       core.autocrlf=true
file:"C:\\ProgramData/Git/config"       core.fscache=true
file:"C:\\ProgramData/Git/config"       color.diff=auto
file:"C:\\ProgramData/Git/config"       color.status=auto
file:"C:\\ProgramData/Git/config"       color.branch=auto
file:"C:\\ProgramData/Git/config"       color.interactive=true
file:"C:\\ProgramData/Git/config"       help.format=html
file:"C:\\ProgramData/Git/config"       http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
file:"C:\\ProgramData/Git/config"       diff.astextplain.textconv=astextplain
file:"C:\\ProgramData/Git/config"       rebase.autosquash=true
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig"    credential.helper=manager
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig"    difftool.usebuiltin=true
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig"    alias.lol=log --oneline --graph
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig"    alias.last=log -1 HEAD
file:C:/Users/karlb/.gitconfig  user.email=karl.horton@yahoo.com
file:C:/Users/karlb/.gitconfig  user.name=Karl Horton

3
C:\ProgramData\Git\Config 中的设置出现在列表中,但在使用三个开关(--system、--global、--local)时却没有出现,这真的很奇怪。 - Triynko
1
有点离题,但是git程序缺少“默认”源的概念(例如我们可以在GNU make中找到变量值来自哪里)。 例如,如果没有在某个配置文件中明确定义它,我们无法确定core.symlinks是否为true或false。我怀疑它在Windows上默认为false,但是列出的内容应该更加友好并提供一种列出所有有效选项的方式。即使--get命令也不会告诉你。 - Johan Boulé

2
我发现在Windows上使用Git时有一个注意事项。我当前的版本是git version 2.17.1.windows.2
我试图设置全局core.attributesfile,以覆盖*.sh文件的行尾属性(我使用WSL,当它尝试运行带有DOS(CRLF)行结尾的shell脚本时,当前版本会变得非常不稳定)。对于Linux端上的Git,以下代码在~\.gitattributes中可以解决这个问题:
*.sln text eol=crlf
*.bat text eol=crlf
*.sh  text eol=cr

但是,在Windows端使用Git(例如通过Sourcetree GUI),对于某些存储库,我仍然在*.sh文件中得到CRLF。

我发现在这些存储库中,core.autocrlf=true。将其设置为input可以解决问题,并且Git现在尊重全局的gitattributes

最初的回答:

在Windows端使用Git时(例如通过Sourcetree GUI),对于某些存储库,*.sh文件中仍然会出现CRLF。我发现这些存储库中,core.autocrlf设置为true。将其设置为input即可解决此问题。此外,Git还会遵守全局的gitattributes。


值得更深入地挖掘一下;.gitattributes 应始终覆盖 core.autocrlf - Edward Thomson
@EdwardThomson 你的意思是,它可以作为一个错误报告发布吗? - Alex Cohn
1
也许?我认为在Stack Overflow上提问可能是一个好的开始。例如,在Sourcetree和命令行中它的行为是否不同?你的配置文件确切地长什么样子?(例如,你提到了~\.gitattributes,这不是你主目录的有效路径。) - Edward Thomson
好问题!在这里,我只总结了结论,并提到了一些细节(例如Sourcetree),这可能有助于通过谷歌解决她的难题。当然,我检查了命令行和GUI产生相同的结果。并且在Windows中全局gitattributes通过git configure --global正确设置。 - Alex Cohn

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