使用指南
.gitignore:模板组合、匹配规则与不生效的原因
理解 Git 忽略模式的路径范围、否定规则和优先级,正确区分未跟踪与已跟踪文件。
JTools 维护者 · 更新于 2026-10-17
.gitignore 告诉 Git 哪些未跟踪文件无需纳入版本管理。通常在项目根目录放置一份,并根据语言、构建工具、编辑器和操作系统选择模板。它不会删除文件,也不会停止跟踪已经提交的文件。
模板应与项目实际情况匹配。例如 Node 项目可以组合 Node、VisualStudioCode 和 macOS,但是否提交编辑器共享配置、依赖锁文件或构建产物仍由团队决定。生成器保留选择顺序;想让某个模板的规则后生效,可移除后重新添加。
同一 .gitignore 内,最后一条匹配规则决定是否忽略。*.log 后接 !important.log 会保留 important.log,再添加 *.log 又会将它忽略,因此不能随意排序或去重。已忽略的父目录不会被 Git 继续遍历;若想在 cache 中保留 keep.txt,可先忽略 cache/* 再写 !cache/keep.txt,而不是直接忽略 cache/。
用 git check-ignore -v 路径 查看未跟踪文件匹配到的规则,用 git ls-files -- 路径 判断文件是否已被跟踪。确需取消跟踪时,先检查工作区和团队需求,再针对具体文件使用 git rm --cached -- 路径 并提交变更。该操作不会清除历史,也不应对整个仓库盲目执行。
忽略本地 .env 时可以显式保留不含秘密的 .env.example。已经提交过的密钥不会因增加 .gitignore 而从历史中消失,应撤销或轮换泄露凭据,并单独评估历史清理。
常用 glob 规则
Git 的忽略规则是 glob 模式,不是正则表达式。路径相对于当前 .gitignore 所在目录解释;下表假定文件位于项目根目录。
| 语法 | 含义 | 示例 |
|---|---|---|
# 注释 | 空行与以 # 开头的行不参与匹配;字面 # 开头的文件名需转义。 | \#notes.txt |
*.log | * 匹配零个或多个非斜杠字符,不跨目录分隔符。 | debug.log、app/debug.log |
file?.txt | ? 匹配恰好一个非斜杠字符。 | file1.txt 匹配,file.txt 不匹配 |
/dist/ | 开头 / 限定根目录,末尾 / 限定目录。 | dist/ 匹配,app/dist/ 不匹配 |
**/cache/ | **/ 匹配零级或多级目录。 | cache/、app/cache/、app/src/cache/ |
[0-9].log | 方括号匹配集合或范围内的单个字符。 | 1.log 匹配,12.log 不匹配 |
!important.log | 否定此前匹配;若父目录整体被忽略,需先处理父目录规则。 | *.log 后接 !important.log |