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

Rya*_*anW 80 git msysgit git-config

我注意到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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 93

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
Run Code Online (Sandbox Code Playgroud)

您可以通过打开该repo的文件来查看repo特定文件的定义.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和等选项 --unset.git config 只会一次更改一个文件.

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

  • 在使用msysgit的Windows上,"机器的系统`.gitconfig`文件"在哪里? (3认同)
  • @DanielSank尝试`C:\ Program Files(x86)\ Git\etc\gitconfig`.不确定这是否是正确的. (3认同)
  • 当前的Git读取`C:\ Program Files\Git\mingw64\etc\gitconfig` (2认同)

Von*_*onC 59

您不必再猜测哪个配置已设置到哪里,使用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日)由拉斯施耐德(larsxschneider).
(由Junio C gitsterHamano合并- -提交dd0f567,2016年2月26日)

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

如果配置值是使用"查询git config"(例如,通过--get, --get-all,--get-regexp,或--list标志),则有时很难寻找到被限定的值的配置文件.

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

git config手册页现在会显示:

--show-origin:
Run Code Online (Sandbox Code Playgroud)

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

例如:

git config --list --show-origin
Run Code Online (Sandbox Code Playgroud)

那会回来:

    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
Run Code Online (Sandbox Code Playgroud)

对于一个设置,由wisbucky 评论:

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

    file:"D:\\prgs\\git\\latest\\mingw64/etc/gitconfig"     true
    file:C:/Users/vonc/.gitconfig   false
Run Code Online (Sandbox Code Playgroud)


jin*_*008 10

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

git config --system --edit
Run Code Online (Sandbox Code Playgroud)

它会显示位于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"
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 7

除了我在这里介绍的git config -l --show-origingit 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
Run Code Online (Sandbox Code Playgroud)

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

请参阅Matthew 提交的提交 145d59f提交 9a83d08提交 e37efa4提交 5c105a8提交 6766e41提交 6dc905d提交 a5cb420(2020 年 2 月 10 日)和提交 417be08提交 3de7ee3提交 329e6ec(2020 年 1 月 24 日)罗杰斯( ROGERSM94)
(由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
Run Code Online (Sandbox Code Playgroud)

这使您可以快速区分:

  • 受保护的配置:“ system”、“ global”和“ command”范围。
  • 标准配置:local到存储库。

这是在 Git 2.38(2022 年第 3 季度)中引入的:

请参阅提交 8d1a744提交 6061601提交 5b3c650提交 779ea93提交 5f5af37(2022 年 7 月 14 日),作者:Glen Choo ( chooglen)
(由Junio C Hamano 合并 -- gitster--提交 18bbc79,2022 年 7 月 22 日)

Documentation:定义受保护的配置

签署人:Glen Choo

出于安全原因,有些配置变量仅在某些配置范围中指定时才受信任,这些配置变量有时在列表中称为“受保护的配置”(如本线程中所示)。
未来的提交将引入另一个这样的变量(safe.bareRepository),所以让我们定义我们的术语,以便我们可以拥有一致的文档和实现。

在我们的文档中,将“受保护的配置”定义为systemglobalconfigcommand范围。
作为简写,我将仅在受保护配置中遵循的变量称为“仅受保护配置”,但文档中未使用该术语。

受保护配置的定义是基于 Git 是否可以通过忽略配置范围来合理地保护用户:

  • 系统、全局和命令行配置被认为是受保护的,因为控制其中任何一个的攻击者都可以在没有 Git 的情况下造成很大的伤害,所以忽略这些范围我们得到的好处很少。
  • 另一方面,本地(以及类似的工作树)配置不被视为受保护,因为攻击者相对容易控制本地配置,例如:
    • 在某些共享用户环境中,非管理员攻击者可以在目录层次结构的较高位置创建存储库(例如C:\.git在 Windows 上),并且当用户的 PS1 自动调用“git”命令时,用户可能会意外使用它。
      safe.directory通过确保用户打算使用共享存储库来防止这种形式的攻击。
      显然不应该从存储库中读取它,因为这最终会信任 Git 应该拒绝的存储库。
    • git upload-pack( man )预计会在用户无法控制的存储库中运行。
      我们不能忽略该存储库中的所有配置(因为“ git upload-pack”会失败),但我们可以通过忽略uploadpack.packObjectsHook.

uploadpack.packObjectsHook是“仅受保护的配置”。

有意排除以下变量:

  • safe.directory应该是“仅受保护的配置”,但它在技术上不符合定义,因为它在“命令”范围内不受尊重。
    未来的提交将解决这个问题。
  • trace2.*碰巧读取相同的范围,safe.directory因为它们共享一个实现。
    然而,这并不是出于安全原因;这是因为我们想尽早开始跟踪,以至于存储库级别的配置和-c”不可用
    此要求是唯一的trace2.*,因此受保护的配置受到相同的约束是没有意义的。

git config现在包含在其手册页中:

受保护的配置

受保护的配置是指“ system”、“ global”和“ command”范围。
出于安全原因,某些选项只有在受保护的配置中指定时才会受到尊重,否则会被忽略。

Git 将这些范围视为由用户或可信管理员控制。这是因为控制这些范围的攻击者可以在不使用 Git 的情况下造成重大损害,因此假设用户的环境可以保护这些范围免受攻击者的攻击。


使用 Git 2.39(2022 年第 4 季度),允许“受保护”范围内的配置文件包含其他配置文件。

请参阅Glen Choo ( )提交的 ecec57b(2022 年 10 月 13 日)。(由Junio C Hamano 合并 -- --提交 777f548中,2022 年 10 月 25 日)chooglen
gitster

config:尊重includes受保护的配置

签署人:Glen Choo

受保护的配置是通过读取一组固定的路径来实现的,它会忽略 config [include]-s。
将此实现替换为对 的调用config_with_options(),它处理[include]-s 并使我们免于重复 1) 识别要读取的路径和 2) 读取命令行配置的逻辑。

结果,git_configset_add_parameters()未使用,因此将其删除。
它是在5b3c650中与受保护的配置一起引入的(“ config:learn git_protected_config()”,2022-07-14,Git v2.38.0-rc0 -在第 6 批中列出的合并)作为处理命令行配置的一种方式。