如何告诉Git忽略全局配置文件

6

Git文档讨论了默认的全局git配置文件位置($XDG_CONFIG_HOME/git/config~/.gitconfig),但没有提供一种告诉git命令忽略该文件的方法。

我正在寻找一个环境变量,可能称为$GIT_CONFIG_NOGLOBAL(类似于$GIT_CONFIG_NOSYSTEM),或者传递给git命令的标志(例如--ignore-global-config)。我需要它,因为我的标准git设置(特别是commit.gpgsign true)会干扰使用git的测试套件。

如果目前不可能,我可以在他们的问题跟踪器上提出问题。


2
在运行命令时将 $HOME$XDG_CONFIG_HOME 设置为另一个值。这有点蛮力(您可能需要保留所有其他配置文件的配置),但这是处理它的一种方式。或者,以不具有配置的用户身份运行测试;或者坚持使用管道命令,它们通常不会读取任何配置项,这就是为什么它们是脚本中要使用的命令的原因。 - torek
1
您可以使用临时设置的环境变量运行命令,例如:GIT_CONFIG_NOSYSTEM=1 git do thing - Pockets
为什么你有使用 git 的测试套件?看起来像是在测试 git? - Lasse V. Karlsen
@LasseV.Karlsen 例如,可以查看npm测试套件(尽管还有其他的)。 - gib
3个回答

8
另一种方法是使用 Git 2.32(2021 年第二季度)的新功能 GIT_CONFIG_SYSTEM
Git 2.32 用 GIT_CONFIG_SYSTEM 取代了 GIT_CONFIG_NOSYSTEM 机制,该机制拒绝读取系统范围的配置文件,让用户指定从哪个文件读取系统范围的配置(将其设置为空文件与设置 NOSYSTEM 基本相同),并引入 GIT_CONFIG_GLOBAL 来覆盖 $HOME/.gitconfig 中每个用户的配置。

请参见 提交记录 482d549 (2021年4月23日),以及 提交记录 4179b48提交记录 1e06eb9提交记录 c62a999 (2021年4月19日),作者为 Patrick Steinhardt (pks-t)
(由 Junio C Hamano -- gitster -- 合并于 提交记录 e706aaf,2021年5月7日)

config:允许覆盖全局和系统配置

签名: Patrick Steinhardt

为了让 Git 在完全受控的环境中运行而不出现任何错误配置,用户或脚本可能希望覆盖全局和系统级别的配置文件。 我们已经有一种方法可以做到这一点,就是取消设置 HOME 和 XDG_CONFIG_HOME 环境变量,并设置 GIT_CONFIG_NOGLOBAL=true。 这相当麻烦,并且取消前两个变量可能会影响由此类脚本生成的其他可执行文件。 修复这个问题的明显方法是引入 GIT_CONFIG_NOGLOBAL 作为 GIT_CONFIG_NOSYSTEM 的等效项。 但是在过去,这种设计被证明是不灵活的:我们无法在测试套件中测试 git 配置的系统级解析,因为没有办法更改其位置,所以所有测试都在设置了 GIT_CONFIG_NOSYSTEM 的情况下运行。 与使用 GIT_CONFIG_NOGLOBAL 相同的错误不应再次发生,而是引入两个新变量 GIT_CONFIG_GLOBAL 和 GIT_CONFIG_SYSTEM: 如果未设置,则 git 继续使用通常的位置。 如果设置为特定路径,我们跳过读取正常的配置文件并代替采取该路径。 通过将路径设置为 /dev/null,将不会为相应级别加载任何配置。 这实现了我们想要通过 /dev/null 在消毒环境中执行代码的用例,但比简单添加 GIT_CONFIG_NOGLOBAL 更加灵活,允许更多用例。

git config现在在其手册页面中包括:

GIT_CONFIG_GLOBAL

GIT_CONFIG_SYSTEM

从给定文件中获取配置,而不是全局或系统级配置。

git现在在其手册页面中包括:

GIT_CONFIG_GLOBAL

GIT_CONFIG_SYSTEM

从给定的文件中获取配置,而不是从全局或系统级别的配置文件中获取。如果设置了GIT_CONFIG_SYSTEM,则不会读取在构建时定义的系统配置文件(通常为/etc/gitconfig)。同样,如果设置了GIT_CONFIG_GLOBAL,则也不会读取$HOME/.gitconfig$XDG_CONFIG_HOME/git/config。可以设置为/dev/null以跳过读取相应级别的配置文件。


例如,baltakatei评论中 提到,可能是在 这个上下文 中:

在运行 make 之前运行 export GIT_CONFIG_GLOBAL=''; export GIT_CONFIG_SYSTEM='',使我能够编译一个程序,该程序期望 git log -1 --pretty=oneline somefile 在我的 ~/.gitconfig 文件中有 log.showsignature=true 时获取提交哈希值。
git log-1 --pretty=oneline 可以根据 gitconfig 文件的内容打印多行)。
语境:编译语音转录程序 Kaldi


1
你救了我。在运行make之前运行export GIT_CONFIG_GLOBAL=''; GIT_CONFIG_SYSTEM,使我能够编译一个程序,该程序期望git log -1 --pretty=oneline somefile在我的~/.gitconfig文件中有log.showsignature=true时获取提交哈希值(git log-1 --pretty=oneline根据gitconfig文件的内容可以打印多行)。 - baltakatei
@baltakatei 谢谢您的反馈。我已将您的评论包含在答案中以进行说明。 - VonC
糟糕,应该是 export GIT_CONFIG_GLOBAL=''; export GIT_CONFIG_SYSTEM=''。而上下文是编译Kaldi,一款语音转录程序。https://github.com/kaldi-asr/kaldi - baltakatei
@baltakatei 好的,我已经相应地编辑了答案。 - VonC

3

我需要它是因为我的标准git设置(特别是commit.gpgsign true)会干扰使用git的测试套件。

我认为这是测试套件中的一个bug。他们应该被设置为忽略外部配置。我建议将此报告给测试套件作者。他们会做与您相同的事情:

GIT_CONFIG_NOSYSTEM

是否跳过从系统范围内的$(prefix)/etc/gitconfig文件读取设置。这个环境变量可以与$HOME和$XDG_CONFIG_HOME一起使用来为挑剔的脚本创建可预测的环境,或者您可以暂时设置它以避免在等待具有足够权限的人修复它时使用有缺陷的/etc/gitconfig文件。

设置,取消设置,更改<$HOME>。


@Pockets评论,附带Git测试套件的链接,您可以在其中看到他们为确保Git隔离性所做的许多事情。


1
你还应该设置GIT_ATTR_NOSYSTEM(如果你有其他全局配置,比如Git模板的配置,那么这些也应该被取消/重新配置)。参考一下,Git测试套件使用这个脚本来为所有测试准备环境。 - Pockets
是的,计划是更新测试套件,而不是让我每次都运行命令。不幸的是,更改主目录会破坏很多其他工具,因此我们必须模拟一个主目录,这有点复杂。感谢您的确认。 - gib
1
@gib 另一种选择是使用 libgit2 包装库。这样可以更好地控制它读取配置文件的位置。相比不断地调用 git 并解析结果,这种方法编程更简单。我在大多数 git 自动化中都是这么做的。使用 libgit2 有一个陡峭的学习曲线,但是一个好的包装库会提供熟悉的方法。 - Schwern

1
使用Docker,您可以在不设置变量的情况下进行隔离。
docker run -it --rm -v "$(pwd)":/work:ro -w /work alpine sh -c 'apk add git && git status'

对于您的测试套件,您可以通过创建一个Dockerfile(此处省略,因为我不知道您的测试情况)来设置测试框架+ git,并进行类似的运行。

如果您还需要提供git的ssh凭据并且正在使用ssh-agent,您还可以挂载ssh auth套接字:

docker run -it --rm \
  -v $SSH_AUTH_SOCK:/ssh-agent --env SSH_AUTH_SOCK=/ssh-agent \
  -v "$(pwd)":/work:ro -w /work test_runner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接