关于本文
本文是通过利用生成式 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 配置文件之前,通过只读方式确认来源以掌握其出处是更安全的做法。特别是将命令结果粘贴到公开博客时,请将真实的用户名、电子邮箱地址和身份验证信息替换为虚拟数据。
