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个位置的配置文件:
.gitconfig文件..gitconfig文件位于~/.gitconfig.$XDG_CONFIG_HOME/git/config或的第二个特定于用户的配置文件$HOME/.config/git/config..git/config.设置按以下顺序级联,每个文件添加或覆盖其上方文件中定义的设置.
您可以使用以下命令查看每个文件的定义:
# 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环境变量有类似的效果,但您可以指定任何你想要的文件名.
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)
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)
除了我在这里介绍的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),所以让我们定义我们的术语,以便我们可以拥有一致的文档和实现。在我们的文档中,将“受保护的配置”定义为
system和globalconfigcommand范围。
作为简写,我将仅在受保护配置中遵循的变量称为“仅受保护配置”,但文档中未使用该术语。受保护配置的定义是基于 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:learngit_protected_config()”,2022-07-14,Git v2.38.0-rc0 -在第 6 批中列出的合并)作为处理命令行配置的一种方式。