如果 Mac 上的 Git 忽略了某个文件,请在终端的仓库中运行 git check-ignore -v -- 'path/to/file'。输出内容会标明忽略源、行号、匹配模式和路径,以便您找到该规则并决定是否进行修改。如果该文件已被跟踪,请加上 --no-index 重新检查。
在仓库中运行检查
打开终端并进入仓库的顶层目录。您可以输入带空格的 cd ,将项目文件夹从访达(Finder)拖入终端窗口以插入其路径,然后按回车键(Return)。使用 git status 确认您处于 Git 工作树中;如果 Git 提示该目录不是仓库,请先进入项目的实际仓库文件夹。
使用相对于仓库根目录的文件路径。例如,要诊断 build/cache.json,请运行:
git check-ignore -v -- 'build/cache.json'
单引号可让 macOS 默认的 shell(zsh)将路径视为字面量。当名称包含空格或诸如 * 等 shell 会进行解释的字符时,单引号尤为有用。-- 标记选项的结束,这也可以防止以连字符开头的路径被当作参数标志处理。
读取输出以定位规则
详细匹配结果如下所示:
.gitignore:12:build/ build/cache.json
各个字段的含义为:.gitignore 是源文件,12 是其行号,build/ 是匹配模式,build/cache.json 是您查询的路径。在您常用的文本编辑器中打开该源文件,并检查报告的行号。源文件也可能是嵌套的 .gitignore、.git/info/exclude,或者是为您 Git 账户配置的全局排除文件。Git 文档对详细输出字段和这些忽略源进行了说明。
.git/info/exclude 下的源路径适用于此仓库,但通常不会与其他克隆仓库共享。全局排除文件适用于您自己的各个仓库。对于项目应当共享的规则,.gitignore 模式通常是合适的位置。Git 会按优先级检查忽略源:层级较低的 .gitignore 文件可以覆盖父级规则,并且在相同优先级层级上以最后一个匹配的模式为准。关于各源的优先级和预期用途,gitignore 手册有详细说明。
如果 Git 未输出任何内容
没有输出通常意味着没有任何忽略模式匹配该路径。该命令的常规输出会列出被忽略的路径;使用 -v 可查看起决定作用的模式。请检查您是否位于正确的仓库中,以及路径的拼写和大小写是否完全准确。
已被跟踪的文件是常见的困惑来源:默认情况下,git check-ignore 不会报告它们,因为忽略规则适用于尚未被跟踪的文件。添加 --no-index 即可让 Git 依然检查这些规则:
git check-ignore -v --no-index -- 'build/cache.json'
此选项仅用于诊断规则;它不会取消对文件的跟踪,也不会将其从提交中移除。Git 官方文档记录的停止跟踪的方法是 git rm --cached,随后添加相应的忽略规则。这会修改暂存区(index),因此在运行前请检查状态并了解其影响。Git 文档解释了已跟踪文件的限制以及 --no-index 选项。
检查取反规则和模式作用域
以 ! 开头的匹配行是取反规则:它可以在先前的忽略模式之后重新包含某个路径,因此与此类行匹配的详细输出并不意味着该文件仍然被忽略。此外,如果父目录被排除,Git 也无法重新包含其中的文件;必须首先通过匹配规则使父目录可遍历。Git 的模式文档介绍了取反规则以及此父目录限制。
模式是相对于包含它们的 .gitignore 文件进行解释的。带有斜杠的模式作用域仅限于该文件所在的目录层级;简单的名称模式则可以匹配该层级及其子层级。当规则来自嵌套的 .gitignore 时,这一点尤为重要:打印出的模式可能看起来正确,但实际应用到的子树却与预期不符。除了模式文本本身,还要检查源文件的位置。
对于单个文件,git check-ignore -v 通常足以找出应查看的位置。对于已跟踪的文件,请包含 --no-index;之后,利用报告的来源、行号和模式,来确定该规则应当修改、缩小范围还是保持原样。
来源
Git - gitignore 文档 — Git