我的Git配置中的设置来自哪里?


87

我注意到core.autocrlf我跑步时有两个清单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

最后三个(从user.name向下)是我中仅有的三个 C:\users\username\.gitconfig文件中。其他所有的都从哪里来?为什么core.autocrlf列出两次?

这是与MSysGit 1.8.3一起使用的,并且我还安装了Sourcetree(Windows 7)。在Sourcetree中,我未选中“允许Sourcetree修改全局Git配置文件”


17
注意:使用git 2.8(2016年3月)和时git config --list --show-origin,您不必猜测哪个git config在哪里。请参阅下面的答案
VonC

Answers:


97

Git在四个地方检查配置文件:

  1. 您机器的系统 .gitconfig文件。
  2. 您的用户.gitconfig文件位于~/.gitconfig
  3. 位于$XDG_CONFIG_HOME/git/config或的第二个特定于用户的配置文件$HOME/.config/git/config
  4. 本地存储库的配置文件.git/config

设置按以下顺序级联,每个文件添加或覆盖在其上方文件中定义的设置。

  1. 系统配置。
  2. 用户配置。
  3. 特定于存储库的配置。

您可以使用以下命令查看每个文件定义的内容:

# 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

通过打开.git/config该存储库的文件,可以看到仅定义了该存储库的文件。

如果在Windows上使用MSysGit,则可能会从Windows命令提示符下找到指向的用户~/.gitconfig文件。%homepath%echo %homepath%

文档中git config

如果未使用明确设置--file,则有四个文件git config将在其中搜索配置选项:

  • $(prefix)/etc/gitconfig

    系统范围的配置文件。

  • $XDG_CONFIG_HOME/git/config

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

  • ~/.gitconfig

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

  • $GIT_DIR/config

    特定于存储库的配置文件。

如果没有给出其他选项,则所有读取选项将读取所有这些可用文件。如果全局或系统范围的配置文件不可用,则将忽略它们。如果存储库配置文件不可用或不可读,git config则将退出并显示非零错误代码。但是,在任何情况下都不会发出错误消息。

将按照上面给定的顺序读取文件,找到的最后一个值优先于先前读取的值。当采用多个值时,将使用来自所有文件的键的所有值。

默认情况下,所有写入选项都将写入存储库特定的配置文件。请注意,这也会影响--replace-all和等选项 --unsetgit config 一次只能更改一个文件。

您可以通过命令行选项或环境变量覆盖这些规则。在--global--system选项将限制分别用于全球或全系统文件的文件。该GIT_CONFIG环境变量有类似的效果,但您可以指定任何你想要的文件名。


3
.gitconfigWindows上使用msysgit时,“计算机的系统文件”在哪里?
DanielSank 2014年

3
@DanielSank试试C:\Program Files (x86)\Git\etc\gitconfig。不确定那是否是正确的。

@Cupcake:是的。由于某种原因,我无法修改该文件。正在进行某些处理……无法确定是哪个。我猜没关系,因为我可以在用户级配置中覆盖。谢谢。
DanielSank 2014年

2
当前Git读取 C:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth

1
@KevinSmyth最近更改为C:\Program Files\Git\etc\gitconfig
Enrice

62

您不必再用git 2.8猜测哪个配置被设置到了哪里!(2016年3月)

参见Lars Schneider()的commit 70bd879commit 473166bcommit 7454ee3commit 7454ee3(2016年2月19日),commit 473166bcommit 7454ee3(2016年2月19日),commit 7454ee3(2016年2月19日)和a0578e0(2016年2月17日)。。(通过合并JUNIOÇ滨野- -提交dd0f567,2016年2月26日)larsxschneider
gitster

config:添加' --show-origin'选项以打印配置值的来源

如果配置值是使用“询问git config”(例如,经由--get--get-all--get-regexp,或--list标志),则有时很难寻找到被限定的值的配置文件。

教导'' git config'' --show-origin'选项以为每个打印值打印源配置文件。

git config手册页现在会显示:

--show-origin:

使用原始类型(文件,标准输入,blob,命令行)和实际原始(配置文件路径,ref或blob id(如果适用))增强所有查询的配置选项的输出。

例如:

git config --list --show-origin

那将返回:

    file:$HOME/.gitconfig   user.global=true
    file:$HOME/.gitconfig   user.override=global
    file:$HOME/.gitconfig   include.path=$INCLUDE_DIR/absolute.include
    file:$INCLUDE_DIR/absolute.include  user.absolute=include
    file:.git/config    user.local=true
    file:.git/config    user.override=local
    file:.git/config    include.path=../include/relative.include
    file:.git/../include/relative.include   user.relative=include
    command line:   user.cmdline=true

对于一个设置,如评论wisbucky

git config --show-origin --get-all core.autocrlf

    file:"D:\\prgs\\git\\latest\\mingw64/etc/gitconfig"     true
    file:C:/Users/vonc/.gitconfig   false

使用Git 2.26(Q1 2020),您可以添加以下--show-scope选项

git config -l --show-origin --show-scope

1
感谢上帝。网上有许多不同的文章猜测git配置可能存储在哪里。所有文章都错过了可能在我的机器上设置的一个可能的位置:c:\ programdata \ git \ config。不知道为什么会这样,但是我怀疑Visual Studio的TFS集成。我花太多时间寻找的其他奇怪位置是:C:\ program files \ mingw64 \ etc \ .gitconfig和H:\。gitconfig。感谢上帝,这个新命令。耶稣。基督。
RMuesi

我想知道为什么user.cmdline=true需要--show-origin工作吗?另外,我已经注意到,为了与and一起使用,--show-origin需要紧随其后。所以应该是config--get--get-all... config --show-origin --get-all core.autocrlf
wisbucky

@wisbucky同意:我删除了-c 'user.cmdline=true'一点,这似乎是指测试范围:github.com/git/git/blob/…–
VonC

@wisbucky我已经将您的示例包括在内。
VonC

@ VonC,Ah似乎user.cmdline=true在Git 2.13中是必需的,但在Git 2.15中不再需要。
wisbucky

10

在先前安装了Windows的Git并随后将其卸载之后,我发现安装了一个配置文件,C:\Users\All Users\Git\config该文件是系统级配置文件,该文件会持续存在,并且会影响以后的任何MinGW32 Git软件包(在我的情况下,我正在运行便携式MinGW32我公司提供的Git软件包)。我跑的时候

git config --system --edit

它会向我显示位于的系统配置文件mingw32/etc/gitconfig,但仍然会从第一个位置加载值。这表明在尝试使用Git LFS时配置值冲突。

WARNING: These git config values clash:
  git config "http.sslcainfo" = "C:/Users/foo/AppData/Local/Programs/Git/mingw64/ssl/certs/ca-bundle.crt"
  git config "http.sslcainfo" = "/ssl/certs/ca-bundle.crt"

(注意:这也可能是LFS警告过于自信的情况,#861


这非常有用。永远不会在“所有用户”中找到该文件。你是怎么做的?
T3rm1

1
我从C:\ Users \ All Users \(C:\ ProgramData的别名)和C:\ Users \ foo \ AppData \ Local \ Programs \中删除了“ Git”文件夹,这删除了所有剩余的配置文件。
jinxcat2008

3

您可以使用--show-origin来找出配置的来源。

Windows版Git中的配置文件优先级:

...

$PROGRAMDATA/Git/config:
:(仅Windows)与其他Git实现共享的系统范围的配置文件。通常$PROGRAMDATA 指向C:\ProgramData

$(prefix)/etc/gitconfig::
系统范围的配置文件。(仅Windows)此文件仅包含特定于此Git for Windows安装的设置,并且不应与其他Git实现(例如JGit,libgit2)共享。 --system将选择此文件。

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

~/.gitconfig::
用户特定的配置文件。也称为“全局”配置文件。

$GIT_DIR/config::
特定于存储库的配置文件。

...

将按照上面给定的顺序读取文件,找到的最后一个值优先于先前读取的值。

...

来源:https : //github.com/git-for-windows/git/blob/master@%7B2018-01-07%7D/Documentation/git-config.txt#L231

$PROGRAMDATA是环境变量。您可以像这样获取这些变量的值:

在Git Bash中,您需要使用echo "$ProgramData"。在CMD中,您需要使用echo %PROGRAMDATA%。注意,Git Bash显然假装环境变量区分大小写。

什么$(prefix)

前缀是安装内容的顶级目录。在Windows版Git中,则为<some-path>/mingw64<some-path>/mingw32


3

git config -l 显示从系统,全局和本地继承的所有值。

因此,您将在另一个位置将其他配置文件与用户定义.gitconfig文件一起加载。


谢谢,您的回答使我陷入了系统与全局之间的差异。@Cupcake带有--system标志的答案帮助我找到了文件。
RyanW

2

Windows的完整答案(即可接受答案的Windows版本):

与Linux一样,Windows具有四个级别的配置文件/设置,其中三个是直接等效的。需要注意的另一件事是“所有应用程序/用户”,尤其是因为这是安装程序在其中设置值的位置,例如“ core.autocrlf = true”,但无法从命令行访问它因此会引起混乱。

所有应用程序和用户

如果您安装了多个Git应用程序,则这类似于“系统”设置的共享版本。没有“ git config”命令可以访问它们,但是它们仍然会影响设置的最终结果。

配置文件位置:

C:\ ProgramData \ Git \ config

(请注意,在旧版本的Windows中,“ ProgramData”是“所有用户”。)

系统

配置文件位置:C:/ Program Files / Git / mingw64 / etc / gitconfig

$ git config --system --list

用户

配置文件位置:%USERPROFILE%.gitconfig(此解析为“ C:/ Users / <用户名>”)

$ git config --global --list

资料库

配置文件位置:[当前存储库目录] /。git / config

$ git config --local --list

1

在Windows 7(对于Windows 10可能相同或相似)上,对于Visual Studio和Git命令行,全局配置位于:

%USERPROFILE%\.gitconfig

(在文件名前面加点)

但这至少在Git Embedded模式下不受Sourcetree的认可,并且配置位于:

%USERPROFILE%\AppData\Local\Atlassian\SourceTree\git_local\mingw32\etc\gitconfig

(文件名前面没有点)

(我需要更新两个文件来修改Git命令和Sourcetree的全局Git设置。)

另一个有趣的部分。Git钩子配置正在从该AppData\Local\...位置工作,但是在通过Process Monitor进行了更多研究之后,我注意到Sourcetree还以某种方式从我的用户的公司映射驱动器中加载全局数据。

这几乎没有意义,因为很少有应用程序会查找该位置,但是Sourcetree会以某种方式进行查找,因此,如果您无法使它在Sourcetree上按位置设置工作,请运行Process Monitor并创建规则以仅记录包含gitconfig的路径,如果有网络映射的用户目录,您可以找到真正的全局配置所在的位置。

而且这可能甚至不是Sourcetree的错,正如我现在看到的那样,我在编写git.exe时正在加载它,但这仅发生在Sourcetree执行的git.exe中,而Git使用的是直接命令行 %USERPROFILE%\.gitconfig

在此处输入图片说明

最后,我从Process Monitor中获取所有结果,将其输入到SQL Server中并运行查询以获取不同的结果(没有特定的执行顺序仅按路径排序):

在此处输入图片说明

我不知道这些配置如何相互关联,但是我知道有些配置会覆盖其他配置,而某些设置会在一个位置起作用,而另一些位置则会起作用。

上面的列表由Sourcetree调用,再次使用Git指导命令行似乎可以正常使用%USERPROFILE%\.gitconfig,并且不在该列表中,但是看起来像这样(在Windows 7上)C:\Users\pawel.cioch\.gitconfig


1

另外的git config -l --show-origin,那我这里介绍,与GIT 2.8(2016年3月),你现在有,使用Git 2.26(Q1 2020)

git config -l --show-scope

# you can combine both options:
git config -l --show-origin --show-scope

git config学会了显示scope每个配置设置来自哪个“ ”以及哪个文件。

请参阅Matthew Rogers()的提交145d59f提交9a83d08提交e37efa4提交5c105a8提交6766e41提交6dc905d提交a5cb420(2020年2月10日)和提交417be08提交3de7ee3提交329e6ec(2020年1月24日(由Junio C Hamano合并--5d55554号提交中,2020年2月17日)ROGERSM94
gitster

config:添加'--show-scope'以打印配置值的范围

签字人:马修·罗杰斯(Matthew Rogers)

当用户使用来查询配置值时--show-origin,通常很难确定实际的“ scope”(localglobal给定值等)仅基于原始文件。

教“ git config”的“ --show-scope”选项以显示所有显示的配置值的范围。

注意,我们永远都不会看到“子模块”作用域的任何内容,因为只有submodule-config.c在解析“ .gitmodules”文件时才使用。

例:

git config -l --show-scope

global  user.global=true
global  user.override=global
global  include.path=$INCLUDE_DIR/absolute.include
global  user.absolute=include
local   user.local=true
local   user.override=local
local   include.path=../include/relative.include
local   user.relative=include

-1

如果您想找到实际的文件位置,它将位于您的主目录中。

它是隐藏的,并以“。”开头。

因此,如果您使用的是Mac,则可以在您的终端中cd ~ && open .gitconfig或使用喜欢的文本编辑器(例如)打开它cd ~ && atom .gitconfig


1
已经说过了。无需通过建议(非)替代方案来增加混乱。
斯迪姆(Stim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.