.gitignore 为什么不生效?

常见原因包括文件已被 Git 跟踪、其他位置的规则产生影响,或规则与实际路径不匹配。

1. 检查文件是否已被跟踪

忽略规则作用于尚未跟踪的文件。文件此前已经提交时,添加规则不会将它从 Git 索引中移除。

git ls-files -- path/to/file

如果命令输出路径,说明文件已被跟踪。请参考停止跟踪文件的指南:

如何忽略已经被 Git 跟踪的文件?

2. 查看匹配了哪条规则

在仓库中使用相对于仓库的实际路径运行检查命令,输出会指出规则来源文件和行号。

git check-ignore -v -- path/to/file

测试已被跟踪的文件时,加上 --no-index:

git check-ignore -v --no-index -- path/to/file

3. 检查目录位置与规则顺序

开头的 / 以该 .gitignore 所在目录为基准;结尾的 / 只匹配目录。同一优先级中,后面的匹配规则可以覆盖前面的规则。以 ! 开头的规则可以重新纳入路径,但如果父目录已被排除,Git 不会继续遍历其中的文件。

为什么用 ! 仍无法保留被忽略目录里的文件?

4. 检查其他忽略来源

Git 还会读取 .git/info/exclude 和 core.excludesFile 配置的全局文件。因此,即使项目的 .gitignore 中没有相关规则,文件也可能被忽略。可用以下命令查看全局配置:

git config --get core.excludesFile

文件为什么被全局规则忽略?

准确行为与更多细节请参阅官方说明: Git 官方文档