【问题标题】:How Do I Use `GIT_CONFIG` Environment Variable如何使用`GIT_CONFIG`环境变量
【发布时间】:2021-08-14 21:55:30
【问题描述】:

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

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

我最初的想法只是使用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 Docs 解释 GIT_CONFIG 是一个环境变量,可以设置为覆盖 git config 文件,但如果我在终端中输入上述命令,则不会创建文件 write-to-globalwrite-to-system(这些不是测试脚本中的函数)。

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

【问题讨论】:

    标签: git testing config


    【解决方案1】:

    Git Docs 解释 GIT_CONFIG 是一个环境变量,可以设置为覆盖 git 配置文件,

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

    参见Jeff King (peff)commit 7342838commit b3b1862commit 4bb9eb5(2021 年 7 月 14 日)。
    (由 Junio C Hamano -- gitster -- 合并于 commit 5a9b455,2021 年 8 月 2 日)

    doc/git-config:澄清GIT_CONFIG环境变量

    签字人:Jeff King
    审核人:Taylor Blau

    GIT_CONFIG 变量的范围和实用性大大减少了 dc87183(仅在 2008-06-30,Git v1.6.0-rc0 中使用 GIT_CONFIG -- merge)(仅使用 GIT_CONFIG在“git config(man) 中,而不是其他程序,2008-06-30)。
    但是 git-config(1) 中的文档早于此,这使得它相当具有误导性。

    如今,它实际上只是另一种表达“--file”的方式

    让我们这么说,并明确说明它不会影响其他 Git 命令(如 GIT_CONFIG_SYSTEM, 等)。

    我还将它放在变量列表的底部,并警告人们不要使用它。
    我们目前没有任何弃用计划,但通过将它放在列表顶部来鼓励人们使用它并没有什么意义。

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

    GIT_CONFIG

    如果没有为git config 提供--file 选项,请使用该文件 由GIT_CONFIG 提供,就好像它是通过--file 提供的一样。

    此变量对其他 Git 命令没有影响,主要用于 历史兼容性;通常没有理由使用它 而不是 --file 选项。

    还有:

    doc/git-config:解释 --file 而不是引用GIT_CONFIG

    签字人:Jeff King
    审核人:Taylor Blau

    --file 选项的解释仅指GIT_CONFIG
    这种对环境变量的重定向令人困惑,但更令人困惑的是,GIT_CONFIG 的描述已经过时了。

    让我们从头开始describe(man)--file,详细说明读写行为,就像我们对--system等其他类似选项所做的那样。

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

    对于写入选项:写入指定文件而不是 存储库.git/config

    对于读取选项:只从指定文件中读取,而不是从所有文件中读取 可用的文件。

    【讨论】:

      【解决方案2】:

      环境 GIT_CONFIG 变量是古老的,早于 Git 1.5.3,其中添加了 git config --file。它仍然作为一种欺骗其他 Git 命令的方式存在,就像它们被赋予了一个--file 参数来传递 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 可以(至少在许多系统上)也可以读取环境变量,所以我认为这种“安全性”大多是虚幻的。

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

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

      这个方法有点笨拙。

      ...在t/t1300-config.sh

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

      【讨论】:

      • 很好的答案!非常彻底。我喜欢蛇! (开玩笑的玩笑很有趣,哈哈)。我将尝试分别设置$GIT_CONFIG_NOSYSTEM$HOME$XCD_CONFIG_HOME。我必须在测试时将配置放在 tmp 文件夹中,因此如果其他用户运行我的测试,它不会覆盖他们的设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2016-02-04
      • 2016-11-05
      相关资源
      最近更新 更多