使用 git config –show-origin 追踪设置来源:system、global 和 local 的优先级

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

关于本文
本文是通过利用生成式 AI 的自动化工作流创建的。我们查阅了 Git 官方的 git-config 与设置优先级,并创建了一个示例,在不修改个人 Git 设置的情况下确认 local 和 command 作用域。未在 Ubuntu 实机上确认 Git 命令的执行。

验证状态:📘 已确认 Git 官方规范/未在 Ubuntu 实机上确认

当 Git 提交创建者的名字与预期不符,或者某个特定仓库的用户名不同时git config --get user.name仅凭这一点是无法知道原因的。

Git 设置包含 system、global 和 local 等应用范围,当设置发生重复时,了解它们是从哪个位置读取的就变得非常重要。git config --show-origin --show-scope使用它可以同时检查值和出处。

但是,真实的设置列表中可能包含用户的电子邮件地址或公司内部代理。这次我们将不修改真实的个人设置,仅通过临时 Git 仓库来进行观察。

设置是从哪里读取的

Git 的典型设置位置如下。

作用域主要对象含义
system整台机器多用户通用的设置
global所有使用者您自己使用的 Git 默认设置
local该 Git 仓库仅针对单个项目的设置
command执行该命令git -c等进行临时覆盖

通常情况下,较小范围的设置优先级高于较大范围的设置,但如果定义了多个相同的键或多个值具有意义,请务必检查实际的键。

官方文档是Git 设置参考。

在不污染您的设置的情况下进行尝试

以下 Shell 应用了不读取 Git system/global 设置的配置,并仅创建一个用于学习的临时仓库。

#!/usr/bin/env bash

set -euo pipefail

temp_dir="$(mktemp -d)"
trap 'rm -rf -- "$temp_dir"' EXIT

export GIT_CONFIG_NOSYSTEM=1
export GIT_CONFIG_GLOBAL=/dev/null

git -C "$temp_dir" init -q
git -C "$temp_dir" config --local user.name "Sample Local"

echo "=== local setting ==="
git -C "$temp_dir" config --show-origin --show-scope --get user.name

echo "=== command-line override ==="
git -C "$temp_dir" -c user.name="Sample Override" \
  config --show-origin --show-scope --get user.name

mktemp -d仅写入到.git/config创建的位置。结束时trap会进行清理。它绝不会擅自编辑现有仓库的设置。

内容相同的文件保存在GitHub 示例:Git 设置的 origin 与 scope中。

要观察什么?

期望的结果如下所示。根据运行环境和 Git 版本的不同,显示格式可能会有所变化。

=== local setting ===
local  file:/tmp/.../.git/config  Sample Local

=== command-line override ===
command  command line:  Sample Override

最初会读取保存在该仓库中的Sample Local。在下一次运行中,-c user.name=...将覆盖指定的值,并且应该能够看出它是来自命令行。

--show-origin是显示配置值是从哪个文件或位置获取的选项,而--show-scope是显示配置范围的选项。范围以支持 Git 2.26 及更高版本的--show-scope为前提。

修改一处进行比较

Sample Override将Sample Another改写为并重新运行。

git -C "$temp_dir" -c user.name="Sample Another" \
  config --show-origin --show-scope --get user.name

即使更改命令参数,.git/config中写入的Sample Local也不会改变。也就是说,仅改变单次运行的设置与持久化的仓库设置是两回事。

另一种确认方法是在临时仓库中显示git config --local --list,并比对Sample Local是否仍然存在。

配置的优先级与故障排除

实务中常见的情况是“命令结果在 GitHub 与本地不同”。例如,在 GitHub Actions 检出后,会使用与本地电脑不同的 HOME、系统设置以及 Git 版本。切勿盲目认为本地电脑与 CI 的运行结果会完全一致。

另一方面,在 CI 中git config --list最好避免直接将内容输出到日志中。有时可能会泄露身份验证助手、用户名、代理或企业内部路径等信息。

排查原因时,缩小目标键的范围是基本原则。

git config --show-origin --show-scope --get user.name
git config --show-origin --show-scope --get core.autocrlf

对于不存在的配置,退出代码有时会非 0。在自动化脚本中,需要决定是将这种情况视为未设置还是视为错误。如果将未设置的情况默默当作空字符串继续处理,可能会让人忽视非预期的默认值。

此外,--show-scope不支持该功能的旧版本 Git 会导致选项错误,因此git --version请进行确认。

配置真的改变了吗?应该检查到什么程度?

排查 Git 配置错误的原因时,其顺序为:确认是否位于目标仓库中、获取了哪个键、哪个作用域先生效,以及是否通过 CI 或 IDE 的环境变量进行了覆盖。

在手动修改 Git 配置文件之前,通过只读方式确认来源以掌握其出处是更安全的做法。特别是将命令结果粘贴到公开博客时,请将真实的用户名、电子邮箱地址和身份验证信息替换为虚拟数据。

官方信息

文档信息

文章??
使用 git config –show-origin 追踪设置来源:system、global 和 local 的优先级
?布日期
更新日期
来源
https://papanda925.com/?p=18100&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制