忽略文件(.gitignore)
本教程共 26 篇 · 第 8 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
8. 忽略文件(.gitignore)
本节目标:学会配置 .gitignore,让 Git 自动跳过那些不该提交的文件。
为什么需要忽略
项目里有些文件不该进版本库:
- 操作系统生成的垃圾(Windows 的
Thumbs.db、macOS 的.DS_Store) - 编译产物(
.class、.o、dist/) - 依赖目录(
node_modules/、vendor/) - 敏感配置(数据库密码、API 密钥)
- 编辑器临时文件(
.swp、~结尾的备份)
每次 git status 都看到这些文件,烦不说,还容易误提交。
.gitignore 的基本用法
在仓库根目录创建一个 .gitignore 文件,写入要忽略的文件模式:
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略特定文件
config.ini
.gitignore 本身应该提交进仓库,这样团队成员都能用同一套规则。
Note以
#开头的行是注释。空行会被忽略。
语法规则
.gitignore 使用 glob 模式匹配:
| 模式 | 含义 |
|---|---|
* | 匹配零个或多个字符 |
? | 匹配单个字符 |
[abc] | 匹配方括号内任一字符 |
** | 匹配任意中间目录 |
/ 开头 | 只匹配仓库根目录 |
/ 结尾 | 匹配目录 |
! 开头 | 取反,不忽略 |
示例
# 忽略所有 .a 文件
*.a
# 但 lib.a 例外
!lib.a
# 只忽略根目录下的 TODO
/TODO
# 忽略任何名为 build 的目录
build/
# 忽略 doc 下所有 .txt,但不忽略子目录
doc/*.txt
# 忽略 doc 及其子目录下所有 .pdf
doc/**/*.pdf
已跟踪文件怎么办
.gitignore 只对未跟踪文件生效。如果文件已经被 Git 提交了,加到 .gitignore 也没用。
解决办法:先从 Git 删除跟踪,但保留本地文件:
git rm --cached config.ini
然后提交这次删除。之后 config.ini 就被忽略了,本地文件还在。
如果要从所有地方(包括已跟踪的)批量忽略:
git rm -r --cached .
git add .
git commit -m "apply .gitignore"
Warning
git rm --cached只是取消跟踪,不会删本地文件。但git rm不加--cached会真的删文件。注意区分。
全局忽略
有些文件你想在所有仓库都忽略,比如操作系统生成的垃圾。
创建一个全局忽略文件:
# macOS
echo ".DS_Store" >> ~/.gitignore_global
# Windows
echo "Thumbs.db" >> ~/.gitignore_global
然后告诉 Git 用这个文件:
git config --global core.excludesfile ~/.gitignore_global
这样所有仓库都会自动应用这些规则,不用每个项目单独配。
调试 .gitignore
发现某个文件被意外忽略了,查一下是哪个规则搞的:
git check-ignore -v config.ini
输出:
.gitignore:5:*.ini config.ini
告诉你:.gitignore 第 5 行的 *.ini 规则匹配了这个文件。
常见模板
GitHub 维护了一个 .gitignore 模板仓库:https://github.com/github/gitignore
常用模板:
# Python
__pycache__/
*.py[cod]
*.egg-info/
dist/
build/
.venv/
# Node.js
node_modules/
npm-debug.log
.env
# Java
*.class
*.jar
target/
# IDE
.idea/
.vscode/
*.swp
*~
# OS
.DS_Store
Thumbs.db
Desktop.ini
Tip不需要从头写。去 gitignore.io 或 GitHub 模板库找对应语言和 IDE 的组合,复制粘贴就行。
这章学到了什么
.gitignore放在仓库根目录,本身要提交- glob 语法:
*、?、[]、**、!取反 - 已跟踪文件用
git rm --cached取消跟踪 - 全局忽略用
core.excludesfile git check-ignore -v调试忽略规则
下一章,我们进入 Git 最强大的功能:分支。