在项目开发中,并非所有文件都适合纳入版本控制。例如编译产生的二进制文件、本地配置文件、日志文件或庞大的依赖库目录。Git 提供了一种机制,可以主动忽略这些文件,使它们不被 git status 或 git add 追踪。
这就是 .gitignore 文件。
忽略文件主要有以下三个目的:
在 Git 仓库的根目录下创建一个名为 .gitignore 的文件。在该文件中列出需要忽略的文件或目录规则。
注意:文件名必须是 .gitignore,且没有后缀名。
.gitignore 文件使用简单的“glob 模式”匹配规则,类似于正则表达式但更简单。
| 符号 | 作用说明 | 示例 |
|---|---|---|
| 空行 | 以 # 开头的行为注释。 | |
# 注释 |
匹配任意个字符(除 / 外)。 | # 这是一个注释 |
* |
用于分隔规则,增加可读性。 | *.log 忽略所有 .log 文件 |
? |
匹配单个字符(除 / 外)。 | file?.txt 匹配 file1.txt 但不匹配 file10.txt |
[] |
匹配括号内的单个字符。 | file[123].txt 匹配 file1, file2, file3 |
/ |
目录分隔符,或表示根目录。 | /TODO 仅忽略根目录下的 TODO 文件 |
** |
匹配任意层级的目录。 | doc/**/*.pdf 忽略 doc 目录下所有的 .pdf 文件 |
! |
取反,表示不忽略该文件。 | !keep.log 即使忽略了 *.log,但不忽略 keep.log |
以下是不同开发场景下的常用忽略规则组合:
忽略操作系统生成的文件:
# macOS 系统文件
.DS_Store
# Windows 缩略图
Thumbs.db
忽略编译产物和依赖目录:
# Node.js 依赖目录
node_modules/
# Java 编译文件
*.class
# Python 缓存
__pycache__/
*.py[cod]
忽略日志和临时文件:
# 忽略所有 .log 文件
*.log
# 忽略 temp 目录下的所有文件
temp/
例外规则(取反)示例:
假设你想忽略所有的 .txt 文件,但唯独需要保留 important.txt:
*.txt
!important.txt
这是新手最容易遇到的陷阱:.gitignore 只能忽略尚未被纳入版本控制的文件。
如果一个文件已经被 git add 并 git commit 提交到了版本库,那么之后再将它添加到 .gitignore 中是无效的,Git 依然会追踪它的变更。
解决方案:
如果你需要让 Git 停止追踪某个已被管理的文件,需要执行以下两步:
git rm --cached <filename>
如果是目录,使用 git rm -r --cached <directory>。
git commit -m "停止追踪指定文件"
执行完上述操作后,该文件就会从版本库中删除(历史记录依然存在),此时 .gitignore 的规则就会生效,Git 将不再过问该文件的后续变更。
配置全局忽略:如果你希望所有项目都忽略某些特定的系统文件(如 .DS_Store),可以配置一个全局的 gitignore 文件:
git config --global core.excludesfile ~/.gitignore_global
不要忽略锁定文件:像 package-lock.json 或 yarn.lock 这类文件虽然由工具生成,但它们锁定了依赖版本,不应被忽略,否则会导致团队开发环境不一致。