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

问题描述 投票:76回答:7

我注意到当我运行core.autocrlf时,我有2个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
[email protected]
core.autocrlf=true

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

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

git msysgit git-config
7个回答
92
投票

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

  1. 你机器的系统.gitconfig文件。
  2. 您的用户.gitconfig文件位于~/.gitconfig
  3. 第二个特定于用户的配置文件位于$XDG_CONFIG_HOME/git/config$HOME/.config/git/config
  4. 本地repo的配置文件.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来查看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--unset等选项。 git config一次只能更改一个文件。

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


54
投票

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

请参阅commit 70bd879commit 473166bcommit 7454ee3commit 7454ee3commit 473166b(2016年2月19日),commit 7454ee3commit 7454ee3(2016年2月19日),commit a0578e0(2016年2月19日)和Lars Schneider (larsxschneider)(2016年2月17日)。 (由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

10
投票

在以前安装了Git for Windows并随后卸载之后,我发现在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


3
投票

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

因此,您可以在某处使用用户定义的.gitconfig加载另一个配置文件


2
投票

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

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

...

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

前缀是安装事物的顶级目录。在Git for Windows中,这可能是<some-path>/mingw64<some-path>/mingw32


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 config正在从AppData\Local\...位置工作,但经过procmon的更多研究后,我注意到SourceTree也在为我的用户从公司映射驱动器加载全局。这很少有意义,因为很少有应用程序查找此位置,如果你不能在ST的每个位置设置工作,运行procmon.exe并创建一个规则只记录包含gitconfig的路径,那么ST会这样做,你可以找到在网络映射用户目录的情况下,真正的全局配置。这可能不是ST的错,正如我现在看到的那样,我写这个git.exe正在加载它,但这只发生在ST执行的git.exe,而直接命令行git使用%USERPROFILE%\.gitconfig

enter image description here

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

enter image description here

我不知道这些配置是如何与彼此相关的,但我知道有些覆盖另一些设置可以从一个位置起作用。上面的列表是由SourceTree调用的,再次直接命令行与git似乎与%USERPROFILE%\.gitconfig工作正常,但不在此列表上,但看起来像这样(在Win7上)c:\Users\pawel.cioch\.gitconfig


-1
投票

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

它是隐藏的,前面带有“。”。

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

© www.soinside.com 2019 - 2024. All rights reserved.