.gitignore 文件的规则,这是 Git 中控制哪些文件不被版本控制的重要配置文件。
一、基本规则
1. 注释
gitignore
# 这是注释,以 # 开头
# 空行会被忽略
2. 匹配文件/目录
gitignore
# 忽略单个文件
secret.txt
# 忽略所有 .log 文件
*.log
# 忽略整个目录(加不加 / 有区别,后面讲)
node_modules/
二、通配符规则
| 符号 | 含义 | 示例 |
|---|---|---|
* |
匹配任意字符(除了 /) |
*.txt 匹配 a.txt,不匹配 dir/b.txt |
** |
匹配任意字符(包括 /) |
**/*.txt 匹配所有层级的 .txt 文件 |
? |
匹配单个字符 | ?.txt 匹配 a.txt,不匹配 ab.txt |
[abc] |
匹配括号内任一字符 | [aeiou] 匹配任意元音字母 |
[0-9] |
匹配范围内字符 | file[0-9].txt 匹配 file1.txt ~ file9.txt |
gitignore
# 示例
*.log # 忽略所有 log 文件
temp?.txt # 忽略 temp1.txt, tempA.txt 等
build/**/*.js # 忽略 build 目录及其子目录下的所有 js 文件
三、路径规则(重点!)
/ 开头的模式 → 从项目根目录开始匹配
gitignore
/build # 只忽略根目录下的 build 目录
# 不忽略 src/build 或 test/build
/config.json # 只忽略根目录的 config.json
# 不忽略 src/config.json
不带 / 的模式 → 匹配任意位置
gitignore
build # 忽略所有名为 build 的文件或目录
# 包括:/build, /src/build, /test/build 等
config.json # 忽略所有层级的 config.json
以 / 结尾的模式 → 只匹配目录
gitignore
build/ # 只匹配名为 build 的目录,不匹配名为 build 的文件
node_modules/ # 只匹配目录,如果有个文件叫 node_modules 则不排除
四、否定规则(取反)
用 ! 开头取消忽略(例外规则)
gitignore
# 忽略所有 .txt 文件
*.txt
# 但不忽略 important.txt
!important.txt
# 忽略所有文件
*
# 但不忽略 .gitignore 本身和 src 目录
!.gitignore
!src/
⚠️ 注意:如果父目录被忽略,子文件无法"反忽略"!
gitignore
# ❌ 错误示例
node_modules/ # 忽略了整个 node_modules 目录
!node_modules/my-package/ # 这行无效!父目录已被忽略
# ✅ 正确做法:先不忽略目录,再忽略内容,最后反忽略特定文件
node_modules/*
!node_modules/my-package/
五、双星号 ** 的用法
gitignore
# 匹配任意层级的目录
**/foo/bar # 匹配 /foo/bar, /a/foo/bar, /a/b/foo/bar 等
# 匹配以特定名称结尾的目录
abc/** # 匹配 abc 目录下的所有内容(包括子目录)
# 组合使用
**/temp/ # 忽略任何层级的 temp 目录
a/**/b # 匹配 a/b, a/x/b, a/x/y/b 等
六、实际常用模板
Node.js 项目
gitignore
# 依赖
node_modules/
# 日志
*.log
npm-debug.log*
# 运行时数据
pids/
*.pid
*.seed
# 编译输出
dist/
build/
# 环境变量
.env
.env.local
# IDE
.idea/
.vscode/
*.swp
Python 项目
gitignore
# 虚拟环境
venv/
__pycache__/
*.py[cod]
# 分发/打包
dist/
build/
*.egg-info/
# 测试
.pytest_cache/
.coverage
# IDE
.idea/
.vscode/
Java 项目
gitignore
# 编译输出
target/
*.class
# IDE
.idea/
*.iml
.classpath
.project
.settings/
# 包文件
*.jar
*.war
*.ear
七、规则优先级总结
1. 从文件顶部到底部逐行匹配
2. 后匹配的规则会覆盖先匹配的规则(对于同一文件)
3. 父目录被忽略 → 子文件无法再"反忽略"
4. 感叹号 ! 只能取消前面的忽略规则,不能取消后面的
八、调试技巧
bash
# 检查某个文件为什么被忽略/没被忽略
git check-ignore -v filename
# 示例
git check-ignore -v config.json
# 输出:.gitignore:5:config.json config.json
# 表示:在第5行的规则匹配了该文件
核心要点速记
| 写法 | 含义 |
|---|---|
file |
任意位置的 file 文件或目录 |
/file |
根目录下的 file |
file/ |
任意位置的 file 目录 |
/file/ |
根目录下的 file 目录 |
*.ext |
任意位置的 ext 后缀文件 |
dir/** |
dir 目录及其所有内容 |
!file |
不忽略(取反) |
记住:带 / 开头 = 从根开始,带 / 结尾 = 只匹配目录