跳转到内容

高级忽略规则 (.gitignore)

.gitignore 不仅仅是列出几个文件名那么简单。对于复杂的项目结构,你需要掌握更精细的控制模式,以确保仓库只包含源代码,而不包含构建产物、临时文件或敏感信息。

  • 空行:不匹配任何文件,用于可读性分隔。
  • #:注释。
  • / 结尾:匹配目录。
  • / 开头:匹配根目录下的文件/目录。
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 仅忽略根目录下的 TODO 文件,不包括子目录的 (docs/TODO)
/TODO

** 用于匹配多级目录。

# 忽略任何目录下的 .DS_Store 文件
**/.DS_Store
# 忽略 logs 目录下所有层级的 .log 文件
logs/**/*.log
# 忽略 foo/bar/z, foo/a/b/c/z 等
foo/**/z

这是最强大但也最容易让人困惑的功能。你可以先忽略一类文件,然后用 ! 重新包含其中的一部分。

场景:忽略所有文档,但保留 HTML 文件。

# 忽略所有 doc 目录下的内容
doc/*
# 但不忽略 .html 文件
!doc/*.html

有些文件是特定于你的开发环境的(如 macOS 的 .DS_Store,VSCode 的 .vscode/,IntelliJ 的 .idea/),不应该强制要求项目中的每个人都去忽略它们。

作为系统管理员,你应该配置自己的全局忽略文件

  1. 创建全局忽略文件:

    Terminal window
    touch ~/.gitignore_global
  2. 填入你的环境特定规则:

    .DS_Store
    .vscode/
    *.swp
  3. 告诉 Git 使用该文件:

    Terminal window
    git config --global core.excludesfile ~/.gitignore_global

现在,这些文件在你的所有 Git 仓库中都会被忽略,而不需要污染项目的 .gitignore

有时候你会发现某个文件明明在 .gitignore 里,却还是被 Git 追踪了,或者相反。

使用 git check-ignore 命令查看是哪一行规则生效了。

Terminal window
$ git check-ignore -v app/build/temp.txt
Terminal window
.gitignore:3:build/ app/build/temp.txt

输出表示:.gitignore 文件的第 3 行 build/ 规则导致了该文件被忽略。

如果一个文件已经被提交到了仓库,稍后你把它加到了 .gitignore,Git 不会自动停止追踪它。你需要手动将其从索引(暂存区)中移除。

Terminal window
# 从暂存区移除文件,但保留在工作区
git rm --cached <filename>
# 重新提交
git commit -m "chore: stop tracking ignored file"
  1. 模板起步:不要从零开始写。使用 github/gitignore 提供的针对特定语言(Node, Python, Go 等)的标准模板。
  2. 项目级 vs 全局:项目特定的构建产物(dist/, build/)放项目 .gitignore;编辑器配置和系统文件放全局忽略。
  3. 保持整洁:定期清理不再需要的规则。