92

我注意到我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 配置文件”

4

10 回答 10

104

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环境变量具有类似的效果,但您可以指定任何您想要的文件名。

于 2013-07-19T23:03:52.717 回答
71

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

请参阅提交 70bd879提交 473166b提交 7454ee3提交 7454ee3(2016 年 2 月 19 日)、提交 473166b提交 7454ee3(2016 年 2 月 19 日)、提交 7454ee3(2016 年 2 月 19 日)和提交 a0578e0(2016 年 2 月 17 日),由Lars Schneider( 2016 年 2 月 17 日larsxschneider .
(由Junio C Hamano 合并 -- gitster--dd0f567 提交中,2016 年 2 月 26 日)

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(2020 年第一季度),您可以添加以下--show-scope选项

git config -l --show-origin --show-scope
于 2016-02-27T14:28:01.173 回答
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

于 2015-12-12T00:39:34.810 回答
4

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

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

...

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

$(prefix)/etc/gitconfig::
系统范围的配置文件。(仅限 Windows)此文件仅包含特定于 Windows 版 Git 安装的设置,不应与 JG​​it、libgit2 等其他 Git 实现共享。 --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

于 2019-03-01T15:29:09.197 回答
4

除了我在这里介绍git config -l --show-origin的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每个配置设置来自哪个“”,除了在哪个文件中。

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

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

签字人:马修·罗杰斯

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

教 '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
于 2020-02-18T17:24:08.843 回答
3

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

因此,您在某处有另一个配置文件与您的用户定义.gitconfig文件一起加载。

于 2013-07-19T23:05:50.947 回答
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/<username>')

$ git config --global --list

存储库

配置文件位置:【当前仓库目录】/.git/config

$ git config --local --list
于 2019-08-28T19:21:52.763 回答
1

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

%USERPROFILE%\.gitconfig

(点在文件名前面)

但是Sourcetree不尊重这一点,至少在Git Embedded模式下,配置在:

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

(文件名前无点)

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

另一个有趣的部分。Git hooks 配置在该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

于 2019-04-24T21:50:03.490 回答
-1

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

它被隐藏并以“.”开头。

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

于 2017-11-17T06:48:39.040 回答
-1

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

于 2021-07-08T19:48:08.010 回答