
Git 忽略文件不止 .gitignore——三层忽略机制详解
除了 .gitignore,Git 还有另外两层忽略文件的机制:.git/info/exclude 和全局忽略文件。本文详细讲解三者的区别和使用场景。
原文来源:Nelson Figueroa — .gitignore 不是 Git 忽略文件的唯一方式,还有两层更灵活的机制多数开发者不知道
如果你用 Git 已经有一段时间,大概率对 .gitignore 文件不陌生——把不想提交到仓库的文件名写进去,Git 就会自动忽略它们。这几乎是每个 Git 用户的第一课。
但今天要告诉你一个事实:.gitignore 只是 Git 忽略文件机制的冰山一角。
Git 实际上提供了三层忽略文件机制,它们的使用场景和影响范围各不相同。绝大多数开发者只知道第一层(.gitignore),忽略了后面两层,导致很多本可以更优雅处理的情况变得很麻烦。
第一层:.gitignore(项目级,入版本控制)
这是最常用的一层。.gitignore 文件放在仓库根目录下,随代码一起提交,团队成员都能看到。
适用于:
- 编译产物(
dist/、build/、*.o) - 依赖目录(
node_modules/、vendor/) - IDE 配置文件(
.vscode/、.idea/) - 环境变量文件(
.env模板可以提交,但具体值不提交) - 系统文件(
Thumbs.db、.DS_Store)
node_modules/
dist/
.env
*.log优点:团队共享,统一管理。新增成员 clone 仓库后自动生效,不用额外配置。
缺点:所有成员共享同一个忽略规则。有些文件你个人不想提交但同事并不介意,.gitignore 就不太合适了。
—— 广告 ——
第二层:.git/info/exclude(仓库级,不入版本控制)
每个 Git 仓库目录下都有一个 .git/ 目录,里面藏着大量管理数据。其中 .git/info/exclude 是一个特殊的忽略文件——它的语法和 .gitignore 完全一样,但修改它不会被 Git 跟踪,也不会被推送。
换句话说,它只对你当前这个仓库的本地副本生效。
适用场景:
- 个人笔记:你在仓库里放了一个
notes.txt记录自己的开发思路,不想提交但也不适合写在团队共享的.gitignore里 - 本地调试文件:比如
debug.log、临时测试脚本test-temp.py - 本地 IDE 配置差异:团队用 VSCode,但你自己用 Neovim,
.vimrc相关的临时文件
操作示例:
# 编辑 .git/info/exclude
echo "notes.txt" >> .git/info/exclude
echo "debug.log" >> .git/info/exclude打开 .git/info/exclude 文件看看,你会发现它默认就有一些注释行,告诉你这个文件的作用。
# 默认内容通常是一组注释
# .git/info/exclude 的内容格式与 .gitignore 完全一致优点:只影响当前仓库的本地副本,不影响团队其他人。非常适合个人工作流特有的文件。
缺点:每个仓库都要单独配置,不能跨仓库复用。
第三层:~/.config/git/ignore(机器级,全局忽略)
这是最不为人知但最强大的一层。Git 支持一个全局忽略文件,位于 ~/.config/git/ignore。任何写在这个文件中的规则,会在你本机的所有 Git 仓库中生效。
适用场景:
- 操作系统生成的文件:macOS 上的
.DS_Store、Windows 上的Thumbs.db - 编辑器全局残留文件:
*~(Vim/Emacs 备份文件)、*.swp - 全局工具生成的缓存文件:比如
*.pyc、.pytest_cache/
.DS_Store
Thumbs.db
*~
*.swp
*.pyc优点:一次配置,所有仓库生效。把全局通用的忽略规则放在这里,就不用每个项目的 .gitignore 都重复写 .DS_Store 了。
缺点:影响所有仓库,添加规则要谨慎——如果某天你写了一条过于宽泛的规则,可能无意中忽略掉你本机所有仓库的重要文件。
自定义全局忽略文件位置
如果你不喜欢默认的 ~/.config/git/ignore 路径,Git 允许你通过配置修改它:
# 将全局忽略文件设为 ~/.gitignore_global
git config --global core.excludesFile ~/.gitignore_global
# 如果想恢复默认
git config --global --unset core.excludesFile这个配置被个人开发者广泛使用,尤其是那些需要在多台机器之间同步 Git 配置的人。你把全局忽略文件放在 Dropbox 或 iCloud Drive 里,所有设备都能共享。
如何检查文件被哪一层忽略了?
有时候你会遇到一个奇怪的现象:明明 .gitignore 里没有写某个文件,但 git status 里就是不显示它。这时候你需要一个神奇的调试命令——git check-ignore。
git check-ignore -v <文件名>-v 参数会告诉你该文件是被哪个规则、哪个文件、哪一行忽略的。
来看看不同情况下的输出:
被 .gitignore 忽略:
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store被 .git/info/exclude 忽略:
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store被全局忽略文件忽略:
$ git check-ignore -v .DS_Store
/Users/you/.config/git/ignore:2:.DS_Store .DS_Store被自定义全局忽略文件忽略:
$ git check-ignore -v .DS_Store
/Users/you/.gitignore_global:1:.DS_Store .DS_Store如果没有任何文件忽略它:
没有任何输出——git check-ignore -v 会安静地返回空。
这个命令在排查「为什么这个文件没被跟踪」时极其好用。很多时候你删了 .gitignore 里的某条规则发现还是不管用,一查才发现是全局忽略文件在作祟。
三层机制对比总表
| 层级 | 文件路径 | 影响范围 | 是否入版本控制 | 最佳用途 |
|---|---|---|---|---|
| 项目级 | .gitignore | 单个仓库的单个副本 | ✅ 提交到仓库 | 团队共享的忽略规则 |
| 仓库级 | .git/info/exclude | 单个仓库的本地副本 | ❌ 不提交 | 个人工作流特有的文件 |
| 全局级 | ~/.config/git/ignore | 本机所有仓库 | ❌ 不提交 | 操作系统/编辑器通用的忽略规则 |
这三层忽略规则的优先级是:项目级 > 仓库级 > 全局级。也就是说,如果同一个文件在三层中设置了不同的规则,最具体的(项目级)会胜出。
最佳实践建议
-
团队相关的规则放
.gitignore:编译产物、依赖目录、语言特定的临时文件。这些是所有开发者都需要忽略的。 -
个人临时文件放
.git/info/exclude:你的调试日志、个人笔记、本地测试脚本。这些不需要打扰其他成员。 -
系统和编辑器文件放全局忽略:
.DS_Store、Thumbs.db、*.swp——这些你应该在所有仓库中忽略,而不是在每个项目的.gitignore里重复写。 -
不确定时用
git check-ignore -v排查:当 Git 行为出乎意料时,先查清楚是哪个文件、哪条规则在起作用。 -
避免过度使用全局忽略:太宽泛的规则(比如
*.log)可能会让你错过本该提交的日志文件。
很多人用 Git 几年都不知道这三层机制的存在。一旦掌握了,你会发现很多之前需要小心翼翼地处理的情况,其实都有更优雅的解决方案。
© 2026 四月 · CC BY-NC-SA 4.0
原文链接:https://aprilzz.com/tutorials/git-ignore-three-levels
相关文章
读任何代码前,先跑这 5 个 Git 命令
5 个 git log 命令,花几分钟就能摸清一个代码库的全貌:代码热区、公交因数、Bug 聚集地、危机模式。开文件之前先跑一遍。
从 GNU Stow 迁移到 Chezmoi——多机点文件管理方案
点文件管理是每个开发者的必修课。本文详细对比 GNU Stow 和 Chezmoi 两种方案,并给出完整的迁移指南,涵盖多机同步、敏感文件管理和开机初始化配置。
Sem:基于 Git 的语义化版本控制工具——让 AI Agent 理解代码变更的真正含义
Sem 是一个建立在 Git 之上的语义化版本控制工具,用 tree-sitter 解析代码,展示函数、类、方法层面的变更,而不是行级别的 diff。AI Agent 的代码理解准确率提升 2.3 倍。