.gitignore 是什么
.gitignore 用来声明哪些文件不需要纳入版本控制,例如构建产物、依赖目录、日志与本地环境文件。它是仓库里的普通文本文件,按行写模式并支持通配与否定。规则只对尚未被跟踪的文件生效,已被跟踪的文件即使命中规则也仍会继续被跟踪。
匹配规则怎么算
模式里斜杠出现在开头或中间时,按 .gitignore 所在目录解析;不含斜杠的模式会匹配任意层级的同名文件或目录。结尾带斜杠只匹配目录,感叹号表示否定并把先前排除的内容重新纳入,两个星号可以跨目录匹配任意层级。多份 .gitignore 可以同时存在,深层的规则优先于浅层。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 写法 | 每行一个模式;# 开头是注释;空行被忽略 |
| 生效范围 | .gitignore 所在目录及其全部子目录 |
| 特殊符号 | / 锚定路径;结尾 / 只匹配目录;! 否定;** 跨目录 |
| 典型内容 | 构建产物、依赖目录、日志、缓存、本地配置与密钥 |
| 优先级 | 同层后写的规则覆盖先写的,深层规则覆盖浅层 |
典型使用场景
- 新建仓库:第一次提交前先写好规则,避免把产物与密钥带进历史
- 本机文件:用 .git/info/exclude 忽略只属于自己机器的临时文件
- 强制保留:用 ! 把重要的示例配置从整体排除里放回来
- 多语言项目:按语言分别声明依赖目录与编译产物
- 全局兜底:用 core.excludesFile 配一份跨仓库有效的忽略文件
- 排查规则:用 git check-ignore -v 定位某个文件被哪条规则命中
示例规则
示例规则
build/ # 只忽略名为 build 的目录
*.log # 忽略任意层级下的日志文件
!important.log # 但保留这一个日志
**/node_modules/ # 任意深度下的依赖目录
.env* # 忽略所有以 .env 开头的本地配置
docs/* # 忽略 docs 下的条目
!docs/README.md # 但保留 README
/secret.txt # 只忽略仓库根目录下的这个文件常用模式对照
| 模式 | 匹配范围 | 注意 |
|---|---|---|
| build/ | 任意层级名为 build 的目录 | 不匹配同名文件 |
| *.log | 任意层级的日志文件 | 默认作用于整个仓库 |
| /build/ | 仅仓库根目录下的 build | 斜杠起到锚定作用 |
| !keep.log | 把先前排除的文件重新纳入 | 父目录被排除时不生效 |
| **/cache/ | 任意深度的 cache 目录 | 跨目录匹配 |
| docs/** | docs 目录下的全部内容 | 不匹配 docs 自身 |
模式含斜杠时相对 .gitignore 所在目录解析,不含斜杠时匹配任意层级,两种写法覆盖面差别很大,写规则前先想清楚锚点在哪里。
已被跟踪的文件不受忽略规则影响。要让文件停止跟踪,先 git rm --cached,再确认 .gitignore 已经覆盖它,否则下次 git add -A 又会把它加回来。
只属于本机的文件(编辑器配置、临时笔记)更适合写进 .git/info/exclude,不会污染团队共享的 .gitignore。
想确认某个文件为什么被忽略,用 git check-ignore -v <路径> 会直接指出命中的规则与所在文件,比逐条比对快得多。
全局忽略与本机忽略
除了仓库里的 .gitignore,还有两个位置可以放规则:.git/info/exclude 只对当前仓库有效,而且不进版本控制,适合放本机个人文件;core.excludesFile 指向的全局文件对所有仓库有效,适合放编辑器与操作系统产生的临时文件。只有团队共享的规则才应该写进 .gitignore。
模式是否区分大小写取决于所在文件系统与 core.ignorecase 设置。跨平台项目里同名但大小写不同的文件,最好各写一条规则,避免只在一部分机器上生效。