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

时间:2013-07-19 22:57:22

标签: git msysgit git-config

我注意到,当我运行core.autocrlf时,我有git config -l的2个商家信息

$ 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

最后3个(来自user.name)是我c:\users\username\.gitconfig文件中唯一的。所有其他的来自哪里?为什么core.autocrlf会列出两次?

这是使用msysgit 1.8.3,我也安装了SourceTree(Windows 7)。在SourceTree中,我取消选中“允许SourceTree修改全局Git配置文件”

10 个答案:

答案 0 :(得分:90)

Git检查配置文件的4个位置:

  1. 您机器的系统.gitconfig文件。
  2. 您的用户.gitconfig文件位于~/.gitconfig
  3. 位于$XDG_CONFIG_HOME/git/config$HOME/.config/git/config的第二个特定于用户的配置文件。
  4. 本地repo的配置文件.git/config
  5. 设置按以下顺序级联,每个文件添加或覆盖上面文件中定义的设置。

    1. 系统配置。
    2. 用户配置。
    3. Repo-specific config。
    4. 您可以使用以下命令查看每个文件的定义:

      # 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来查看repo特定文件的定义。

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

      来自documentation for 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 只会改变   一次一个文件。

           

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

答案 1 :(得分:52)

您不必再猜测哪个配置已设置为哪里,使用git 2.8! (2016年3月)

请参阅commit 70bd879commit 473166bcommit 7454ee3commit 7454ee3(2016年2月19日),commit 473166bcommit 7454ee3(2016年2月19日), commit 7454ee3(2016年2月19日)和commit a0578e0(2016年2月17日)Lars Schneider (larsxschneider)
(由Junio C Hamano -- gitster --合并于commit dd0f567,2016年2月26日)

  

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

     

如果使用“git config”查询配置值(例如通过--get,   --get-all--get-regexp--list标志)然后有时很难   找到定义值的配置文件。

     

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

git config man page现在将显示:

--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

对于一项设置,commentedwisbucky

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

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

答案 2 :(得分:9)

先前安装了Git for Windows并随后卸载它后,我发现在C:\ Users \ All Users \ Git \ config中安装了一个配置文件,这是一个系统级配置文件,它会持续存在并会影响任何未来的mingw32 git包(在我的例子中,我运行的是我公司提供的便携式mingw32 git包)。我跑的时候

NSNumberFormatter* f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setFormat:@0.00"];

// test
NSNumber* a = @12;
NSString* s = [f stringFromNumber:a];
NSLog(@"%@", s);

它会显示位于mingw32 / etc / gitconfig的系统配置文件,但仍然会从第一个位置加载值。这显示为在尝试使用git lfs

时配置值发生冲突的警告
{{1}}

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

答案 3 :(得分:3)

Git config -l显示所有继承的值:system,global和local。

所以你有另一个配置文件正在与用户定义的.gitconfig

一起加载

答案 4 :(得分:2)

除了git config -l --show-origin,还有I presented here(使用git 2.8(2016年3月))和Git 2.26(2020年第一季度)

git config -l --show-scope

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

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

请参见commit 145d59fcommit 9a83d08commit e37efa4commit 5c105a8commit 6766e41commit 6dc905dcommit a5cb420(2020年2月10日) ,以及commit 417be08commit 3de7ee3commit 329e6ecMatthew Rogers (ROGERSM94)(2020年1月24日)。
(由Junio C Hamano -- gitster --commit 5d55554中合并,2020年2月17日)

config:添加'--show-scope'以显示配置值的范围

签名人:马修·罗杰斯

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

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

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

示例:

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

答案 5 :(得分:1)

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

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

  

...

     

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

     

$(prefix)/etc/gitconfig ::
  系统范围的配置文件。     (仅Windows)此文件仅包含以下设置     专门用于Windows版Git的安装,并且应该     不能与其他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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

%USERPROFILE%\.gitconfig

(文件前面是圆点)

但是至少在Git Embedded模式下SourceTree不支持此操作,并且配置位于

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

(文件前面没有点)

[我需要更新两个文件来修改git命令和SourceTree的全局git设置]

另一个有趣的部分。 Git hooks配置从AppData\Local\...位置开始工作,但是在通过procmon进行了更多研究之后,我注意到SourceTree还以某种方式从用户映射的驱动器中为我的用户加载全局。这几乎没有意义,因为很少有应用程序会查找该位置,因此ST会这样做,如果您无法按ST的每个位置设置进行操作,则运行procmon.exe并创建一条规则以仅记录包含gitconfig的路径,您可以找到如果是网络映射的用户目录,则真正的全局配置在哪里。而且这可能甚至都不是ST的错,正如我现在看到的那样,我写git.exe正在加载它,但这仅发生在ST执行的git.exe中,而直接命令行git使用%USERPROFILE%\.gitconfig < / p>

enter image description here

最后,我从procmon中获取了所有结果,馈入SQL并运行查询以获取不同的结果(没有特定的执行顺序只是按路径排序):

enter image description here

我不知道这些配置如何相互关联,但是我知道有些配置会覆盖另一个配置,而某些设置则在一个位置起作用。 并且上面的列表由SourceTree调用,再次使用git的直接命令行似乎可以与%USERPROFILE%\.gitconfig一起使用,并且不在此列表中,但看起来像这样(在Win7上){{ 1}}

答案 8 :(得分:-1)

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

它是隐藏的,前面带有&#34;。&#34;。

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

答案 9 :(得分:-1)

在 Mac 中,它是 /usr/local/git/etc/gitconfig -_-