如何使用 `GIT_CONFIG` 环境变量

How Do I Use `GIT_CONFIG` Environment Variable

我已经阅读了 git-config 文档并检查了 SO 问题 and here,但我似乎找不到答案。

我正在为 Git 编写自定义工具,我想对其进行测试。我想备份我的全局和系统 Git 配置文件,然后在我的测试中写入新的配置文件,这样我就不会覆盖我已经存在的东西(仅供参考,我正在针对多个不同的便携式(本地)进行测试Git 的 Linux 和 Windows 在我的项目的子目录中)。

我最初的想法只是使用 cp:

# Backup the system config file
# NOTE: How do I test this automatically? (I have to enter root password)...
sudo cp ${PREFIX}/etc/gitconfig ${PREFIX}/etc/gitconfig.bak

# Backup the global config file
cp ~/.gitconfig ~/.gitconfig.bak

# DO MY TESTS HERE

# Restore system config file and delete backup
sudo cp ${PREFIX}/etc/gitconfig.bak ${PREFIX}/etc/gitconfig
sudo rm ${PREFIX}/etc/gitconfig.bak

# Restore global config file and delete backup
cp ~/.gitconfig.bak ~/.gitconfig
rm ~/.gitconfig.bak

但是,我在 t/t1300-config.sh 中没有看到这样做(截至撰写本文时,主存储库的当前版本是 v2.32)。我看到的最接近的事情是这个(第 2147-2158 行):

test_expect_success 'write to overridden global and system config' '
    cat >expect <<EOF &&
[config]
    key = value
EOF
    GIT_CONFIG_GLOBAL=write-to-global git config --global config.key value &&
    test_cmp expect write-to-global &&
    GIT_CONFIG_SYSTEM=write-to-system git config --system config.key value &&
    test_cmp expect write-to-system
'

我不明白这是怎么回事。 Git 文档说明 GIT_CONFIG 是一个环境变量,可以设置为覆盖 git config 文件,但是如果我在终端中输入上述命令,则没有文件 write-to-globalwrite-to-system 已创建(这些也不是测试脚本中的函数)。

有人可以解释如何正确使用 GIT_CONFIG 环境变量以及在测试脚本中执行此操作的正确方法是什么吗?

环境 GIT_CONFIG 变量很古老,早于 Git 1.5.3,其中添加了 git config --file。它仍然作为一种欺骗 other Git 命令的方式存在,就好像它们被赋予了 --file 参数以传递 to git config。它可能应该被删除,但是,好吧,Git 保持了很多向后兼容性!这让我想起了关于英特尔将“向后”放在“向后兼容”中的老笑话......

直到 Git 1.8.2,git clone 依赖于内部设置 GIT_CONFIG,然后取消设置。看起来(从链接的问题和他们的答案来看)这里可能还有一些剩菜。

(我在发行说明中找到了以上两项。不过所有添加的 snark 都是我自己的。)

Git 版本 2.31.0 添加了新的 GIT_CONFIG_COUNTGIT_CONFIG_KEY_$iGIT_CONFIG_VALUE_$i 环境变量。它们似乎旨在增加某种程度的安全性,以避免传递可以从 ps 读取命令行中读取的 -c 参数。但是由于 ps 可以(至少在许多系统上)也可以读取环境变量,我认为这种“安全”主要是虚幻的。

Can someone explain how to properly use the GIT_CONFIG environment variable and what's the right way to do this in a test script?

除非你需要将配置放在 .git/config 以外的地方,简短的回答是“根本不要使用它”。如果您想确保 system 配置文件不会影响您,请设置 GIT_CONFIG_NOSYSTEM(任何值,尽管我使用 true 只是为了保持一致性) .然后,您可以设置 $HOME$XCD_CONFIG_HOME 以使其他 Git 命令在可预测的位置查找全局 Git 配置文件,当然还有本地和每个工作-树配置文件的位置已经可以预测。

这个方法有点笨拙

... in t/t1300-config.sh

最近(不是在任何发行版本中,而是在 2.32.0 发行版 candidates 中)获得了新的 GIT_CONFIG_SYSTEMGIT_CONFIG_GLOBAL 变量。它们旨在解决上述问题的一些笨拙之处。除非您正在构建各种候选发布版或其他尖端分支,否则您根本不会拥有它。但在我看来,这确实是处理所有这些问题的更好方法。

The Git Docs explain GIT_CONFIG is an environment variable that can be set to override the git config file,

随着 Git 2.33(2021 年第 3 季度),GIT_CONFIG 周围的文档已更新,并阐明了当前情况。

参见 commit 7342838, commit b3b1862, commit 4bb9eb5 (14 Jul 2021) by Jeff King (peff)
(由 Junio C Hamano -- gitster -- in commit 5a9b455 合并,2021 年 8 月 2 日)

doc/git-config: clarify GIT_CONFIG environment variable

Signed-off-by: Jeff King
Reviewed-by: Taylor Blau

The scope and utility of the GIT_CONFIG variable was drastically reduced by dc87183 (Only use GIT_CONFIG in , 2008-06-30, Git v1.6.0-rc0 -- merge) (Only use GIT_CONFIG in "git config"(man), not other programs, 2008-06-30).
But the documentation in git-config(1) predates that, which makes it rather misleading.

These days it is really just another way to say "--file".

So let's say that, and explicitly make it clear that it does not impact other Git commands (like GIT_CONFIG_SYSTEM, etc, would).

I also bumped it to the bottom of the list of variables, and warned people off of using it.
We don't have any plans for deprecation at this point, but there's little point in encouraging people to use it by putting it at the top of the list.

git config 现在包含在其 man page 中:

GIT_CONFIG

If no --file option is provided to git config, use the file given by GIT_CONFIG as if it were provided via --file.

This variable has no effect on other Git commands, and is mostly for historical compatibility; there is generally no reason to use it instead of the --file option.

并且:

doc/git-config: explain --file instead of referring to GIT_CONFIG

Signed-off-by: Jeff King
Reviewed-by: Taylor Blau

The explanation for the --file option only refers to GIT_CONFIG.
This redirection to an environment variable is confusing, but doubly so because the description of GIT_CONFIG is out of date.

Let's describe(man) --file from scratch, detailing both the reading and writing behavior as we do for other similar options like --system, etc.

git config 现在包含在其 man page 中:

For writing options: write to the specified file rather than the repository .git/config.

For reading options: read only from the specified file rather than from all available files.