在平时的 Git 开发协作中,大家对 .gitignore 肯定都不陌生------不管是 node_modules/ 还是构建产物 dist/,只要往 .gitignore 里一放,命令行和 IDE 立刻就干净了。
但你是否遇到过这种尴尬的场景?
- 你习惯用
Taskfile或Makefile写本地快捷脚本,但团队项目里没人用这个,提交.gitignore显得多余; - 你在调试代码时写了一个临时的
zzz_debug.py测试脚本,不想提交,但也怕不小心误提交; - 团队的 Docker 配置还没加上本地覆盖规则,你自己写了个
docker-compose.override.yml,怕推上去影响其他人。
直接改项目的 .gitignore?可能会引发团队争议或污染版本历史。
那么,Git 有没有一种既能忽略文件,又只对我个人本地生效的功能呢?
答案就是:Git exclude。
1. 什么是 Git exclude?
简单来说,exclude 是 Git 内部提供的一个"私有忽略配置文件" 。
在语法上,它和 .gitignore 完全一致 (两者甚至共享同一个 官方 gitignore 文档)。只要你会写 .gitignore,你就已经天然学会了如何使用 exclude。
它的存放位置在哪里?
它并不存放在项目的根目录下,而是隐藏在当前仓库的 .git 元数据目录中:
Plaintext
css
your-project/
├── .git/
│ └── info/
│ └── exclude <-- 就是它!
├── src/
└── .gitignore
注意 :在某些情况下(例如刚克隆完仓库后),
.git/info/exclude文件或info目录可能不会自动创建。如果找不到,你自己直接新建一个名为exclude的文件即可。
2. 核心区别:exclude vs .gitignore
虽然语法一样,但它们在设计哲学和作用域上有本质不同:
| 特性 | 项目级 .gitignore | 本地仓库 .git/info/exclude |
|---|---|---|
| 存储路径 | 项目根目录(或子目录) | .git/info/exclude |
| 版本控制 | 被 Git 追踪,随代码库一起 commit/push | 完全不被追踪,仅留在本地 |
| 共享范围 | 团队所有成员共享 | 仅对你当前这份本地 Clone 生效 |
| 编辑器可见性 | 在编辑器文件树中直接可见 | 默认隐藏在 .git 文件夹中 |
💡 特别提醒 :因为
exclude仅对当前这一份本地仓库生效,如果你把同一个项目 Clone 了三份到本地,你在副本 A 的exclude里写的规则,在副本 B 和 C 中是不会生效的。
3. 三种"忽略文件"策略的应用场景
① 项目级 .gitignore(团队共识)
- 定位:团队通用的规则。
- 适用文件 :构建输出(
dist/、build/)、依赖包(node_modules/、vendor/)、通用的环境变量模板等。 - 优势:确保所有团队成员拉取代码后配置统一,且在编辑器中清晰可见。
② 本地仓库 .git/info/exclude(单项目个人定制)
-
定位:特定于当前项目、但属于你个人习惯的临时/辅助文件。
-
适用文件:
- 个人专用的自动化脚本(如
Makefile、Taskfile); - 个人临时编写的调试代码或测试入口(例如文章作者举例的
zzz_marijke命令文件); - 尚未被团队纳入
.gitignore的个人环境配置文件(如docker-compose.override.yml)。
- 个人专用的自动化脚本(如
-
优势:既能保持本地工作区干净,又不会给团队的根目录增加"垃圾配置"。
③ 全局 .gitignore(跨项目个人工具)
- 定位:特定于操作系统或你个人编辑器的全局配置。
- 适用文件 :macOS 的
.DS_Store、VS Code 的.vscode/、JetBrains IDE 的.idea/等。 - 注意事项 :不要滥用全局 ignore 。如果你在全局忽略了某个项目其实需要的文件(例如团队通用的
.vscode/launch.json),可能会导致你在提交代码时漏掉重要配置。
4. 最佳实践指南
- 优先使用
.gitignore:只要是对项目协作有益的忽略规则,优先通过.gitignore提交给全团队。 - 善用
exclude管理临时文件 :本地调试代码、个人快捷脚本,统统塞进.git/info/exclude。 - 结合 gitignore.io:在新建项目时,推荐使用官方模板填充基础语言和框架的忽略规则。
- 如果同一个规则重复出现 :当你发现自己在多个项目的
exclude中重复添加同一种文件(例如某款 IDE 插件产生的日志)时,就该考虑把它迁移到全局.gitignore中了。