Back

每个开发者都应该了解的 5 个 Git 点文件

每个开发者都应该了解的 5 个 Git 点文件

大多数开发者都熟悉 .gitignore,但 Git 的配置生态系统远不止于此。分散在你的主目录和项目根目录中,有几个重要的 Git 点文件默默地影响着你的仓库行为、协作者体验你的代码库的方式,以及 Git 在不同机器上的一致性工作方式。理解它们可以让你避免细微的 bug、混乱的历史记录和协作摩擦。

以下是五个值得深入了解的 Git 配置文件。

核心要点

  • Git 配置在四个层级运行(系统、全局、仓库、工作树),.gitconfig 支持 includeIf 指令以实现可移植的、上下文感知的配置。
  • .gitignore 只影响未跟踪的文件。使用全局忽略文件来处理编辑器和操作系统产生的文件,保持项目级忽略文件的专注性。
  • .gitattributes 控制的功能远不止换行符——它管理合并行为、二进制文件处理、diff 驱动程序和导出行为。
  • .git-blame-ignore-revsgit blame 从批量格式化提交中解脱出来,GitHub 会自动识别它。
  • .mailmap 规范化项目历史中的贡献者身份,确保日志和统计数据中的准确归属。

1. .gitconfig — 你的个人 Git 身份和行为配置

位置: ~/.gitconfig(全局)或 .git/config(仓库级别)

.gitconfig 是你用户账户的主要 Git 配置文件。它存储你的姓名、邮箱、默认编辑器、别名和行为偏好。Git 配置可以存在于多个层级:系统全局本地(仓库),以及可选的工作树,更具体的配置会覆盖更广泛的配置。

从实际的点文件配置中借鉴的一个实用模式:在 ~/.gitconfig 中保留共享设置,并使用 includeIf 指令加载特定机器或特定工作的覆盖配置,而不会污染你的主配置文件。

[includeIf "gitdir:~/work/"]
  path = ~/.gitconfig_work

这使你的点文件保持可移植性,同时适应每台机器的差异——这是简单的符号链接方法无法干净处理的。你可以在官方的 Git 配置文档中了解更多关于条件配置的信息。

2. .gitignore — 将未跟踪的文件排除在索引之外

位置: 项目根目录、子目录,或 ~/.config/git/ignore(全局)

.gitignore 只影响未跟踪的文件。它不会删除已经提交到仓库的文件。这是一个常见的困惑来源——如果你需要停止跟踪已提交的文件,必须先运行 git rm --cached <file>,然后忽略规则才会生效。

对于你想全局忽略的文件——编辑器交换文件、.DS_Store、操作系统缩略图——在你的 .gitconfig 中通过 core.excludesFile 配置全局忽略文件:

[core]
  excludesFile = ~/.config/git/ignore

这使项目的 .gitignore 文件保持简洁,专注于项目特定的排除项,而不是被每个开发者的个人编辑器偏好所填满。Git 的官方 gitignore 文档详细解释了匹配规则和优先级。

3. .gitattributes — 不仅仅是换行符

位置: 项目根目录(提交到仓库)

.gitattributes 是最未被充分利用的 Git 点文件之一。是的,它处理换行符规范化(text=auto),但它还控制:

  • 合并行为 — 配置特定文件类型的合并方式
  • 二进制文件处理 — 告诉 Git 不要对某些文件类型进行 diff 或合并
  • 导出行为 — 使用 export-ignoregit archive 输出中排除文件(对 CI 产物很有用)
  • Diff 驱动程序 — 为 .docx 或压缩的 JS 等格式分配人类可读的 diff 输出

对于前端项目,为锁文件或打包资源标记适当的属性可以防止不必要的合并冲突和 diff 噪音。属性和行为的完整范围在官方的 gitattributes 文档中有描述。

4. .git-blame-ignore-revs — 在格式化提交后清理 Blame

位置: 项目根目录(提交到仓库)

当你在整个代码库上运行 PrettierESLint 等格式化工具时,git blame 几乎变得无用——每一行都指向格式化提交,而不是原始作者。

.git-blame-ignore-revs 解决了这个问题。列出你想让 blame 跳过的完整提交 SHA:

# Prettier formatting pass
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0

然后配置 Git 使用它:

git config blame.ignoreRevsFile .git-blame-ignore-revs

GitHub 会自动识别这个文件。这是一个小小的添加,但对代码审查和历史可读性有重大影响。该行为在官方的 git blame 文档中有记录。

5. .mailmap — 规范化贡献者身份

位置: 项目根目录(提交到仓库)

贡献者会更改电子邮件地址,在不同机器上使用不同的名称,或者在正确配置 Git 之前进行提交。.mailmap 让你在项目历史中规范化这些身份。

Jane Smith <jane@company.com> <jane@oldmail.com>

git shortloggit log 这样的命令将反映修正后的身份,而不修改底层的提交历史。这个功能对于开源项目和长期运行的仓库特别有用,因为贡献者身份会随时间演变。格式和行为在官方的 mailmap 文档中有描述。

结论

这五个 Git 点文件——.gitconfig.gitignore.gitattributes.git-blame-ignore-revs.mailmap——各自解决实际开发工作流程中的不同问题。它们不仅仅关乎个人偏好。其中几个应该直接提交到你的仓库中,它们会改善团队中每个贡献者的体验。从解决你最紧迫的痛点的文件开始,你的 Git 工作流程将明显更加清晰。

常见问题

将文件添加到 .gitignore 只能防止 Git 跟踪新的未跟踪文件。要停止跟踪已经提交的文件,运行 git rm --cached 后跟文件名。这会将其从索引中删除而不会从工作目录中删除它。之后,提交更改,忽略规则将向前应用。

全局 gitignore 文件通过 .gitconfig 中的 core.excludesFile 配置,在你机器上的每个仓库中应用忽略规则。它适用于编辑器产物和操作系统生成的文件。项目级 .gitignore 提交到仓库并与所有协作者共享。将其用于项目特定的排除项,如构建输出或依赖目录。

是的。Git 在 .git-blame-ignore-revs 文件中需要完整的 40 字符提交 SHA。缩写的哈希值不起作用,并且在运行 git blame 时会导致错误。你可以使用 git log 或 git rev-parse 后跟短哈希来检索任何提交的完整 SHA。

不会。.mailmap 文件不会重写或更改任何提交。它只改变贡献者姓名和电子邮件在 git shortlog 和 git log 等命令输出中的显示方式。底层的提交对象保持不变。这是一个纯粹的外观映射,规范化身份在报告和统计中的显示方式。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay