无需登录 数据私有 本地保存

.gitignore 规则测试器 - 验证文件是否被忽略

42
0
0
0
.gitignore 的基本语法规则是怎样的?

.gitignore 文件每行定义一条忽略规则,空行和以 # 开头的注释行会被忽略。规则支持多种通配符:星号 * 匹配当前目录层级的任意字符序列,双星号 ** 匹配任意目录层级,问号 ? 匹配单个字符,方括号 [abc] 匹配字符集合中的任意一个字符。斜杠 / 出现在末尾表示只匹配目录,出现在开头表示只匹配根目录下的路径。感叹号 ! 用于取反,强制追踪某些被忽略的文件。规则按从上到下的顺序匹配,后面的规则可以覆盖前面的规则。

为什么我的 .gitignore 规则不生效?文件仍然出现在 git status 中。

最常见的原因是该文件已经被 Git 追踪。.gitignore 规则只能阻止未追踪的文件被添加到暂存区,对已经通过 git add 或 git commit 追踪的文件没有效果。解决方法是先执行 git rm --cached filename 命令取消该文件的追踪(--cached 参数确保只从暂存区移除,不会删除本地文件),然后再提交一次。此后 .gitignore 规则就会对该文件生效。使用本工具测试规则时,如果结果显示匹配但实际不生效,请检查文件是否已被追踪。

双星号 ** 在 .gitignore 中有什么特殊作用?

双星号 ** 是 .gitignore 中功能最强大的通配符,它可以匹配任意数量的目录层级。具体用法有三种:出现在路径开头(如 **/logs)表示匹配任意目录下的 logs 文件或目录;出现在路径中间(如 logs/**/debug.log)表示匹配 logs 目录下任意深度的 debug.log 文件;出现在路径结尾(如 logs/**)表示匹配 logs 目录及其所有子目录和文件。例如,**/*.log 会匹配项目中所有目录下的 .log 文件,而 *.log 只匹配根目录下的 .log 文件。

如何忽略某个文件夹中的所有文件,但保留特定的几个文件?

可以使用感叹号取反规则来实现。首先用一条规则忽略整个文件夹,然后用取反规则强制追踪需要保留的文件。例如,要忽略 build 目录但保留 build/readme.md,可以这样写:build/ 和 !build/readme.md。注意取反规则的前提是父目录已经被忽略,所以必须先写忽略规则再写取反规则。此外,被保留的文件的父目录中不能有其他未被忽略的文件路径模式。

子目录中的 .gitignore 文件与根目录中的有什么区别?

子目录中的 .gitignore 文件只对该子目录及其子目录中的文件生效。例如,src/utils/.gitignore 中的规则只影响 src/utils/ 目录下的文件,不会影响项目根目录或其他目录中的文件。根目录的 .gitignore 对整个项目生效。当同一条规则在不同层级的 .gitignore 文件中定义时,子目录的规则具有更高的优先级。建议在根目录中定义全局忽略规则,在子目录中定义特定于该模块的忽略规则。

如何强制忽略已被 Git 追踪的文件?

需要执行两个步骤。第一步,使用 git rm --cached 命令将文件从 Git 追踪中移除:git rm --cached filename。--cached 参数确保只从暂存区移除追踪,不会删除本地工作目录中的文件。第二步,在 .gitignore 中添加对应的忽略规则,确保该文件未来不会再被意外添加。完成这两步后,需要执行一次 git commit 来提交更改。如果是忽略整个目录,可以使用 git rm -r --cached dirname 命令递归移除追踪。

git check-ignore -v 命令的输出结果如何解读?

git check-ignore -v 命令会输出匹配的规则及其在 .gitignore 文件中的位置。输出格式为:.gitignore:行号:规则内容 文件路径。例如,输出 .gitignore:3:*.log src/debug.log 表示文件 src/debug.log 被 .gitignore 第 3 行的规则 *.log 匹配而被忽略。如果有多个规则匹配,-v 选项只会显示优先级最高的那条规则。这个命令在调试复杂的 .gitignore 配置时非常有用,可以快速定位是哪条规则导致了特定文件被忽略。