git check-ignore 输出为空但仍被忽略

git check-ignore output empty but still being ignored

我有一个被忽略的文件夹 logs/:

$ $ git status -s --ignored logs
!! logs/

但是,当我 运行:

git check-ignore -v logs/

我得到空输出,这似乎表明没有忽略它。

我什么都没有上演:

$ git status --untracked-files=no
On branch master
nothing to commit (use -u to show untracked files)

为什么这个文件夹被忽略了?

$ git --version
git version 2.10.2

当忽略是由于忽略目录内的文件而不是目录本身时,会发生这种情况。我创建了一个 logs/ 目录并在其中放了一些东西,得到了与你相同的结果:

$ git status -s --ignored logs
!! logs/

这是我放在里面的内容 logs:

$ ls -A logs
foo

以下是它被忽略的原因:

$ grep foo .gitignore
foo

但是这里 git check-ignore -v 什么也没说 logs/foo:

$ git check-ignore -v logs/

为什么

一旦目录为 "empty"(因为其中的所有文件都被忽略),Git 不再感兴趣,因为 Git 不会在提交中记录目录。但是在这种情况下,并不是 目录本身 被忽略了;而是这是来自 git status 的总结,限制了您只能在此处查看目录。

因此,当您询问 Git "why is logs/ ignored" 时,答案是 没有 被忽略,只是 contents 被忽略。 (我想我们可以说这是 git check-ignore 中的错误。)

怎么看是怎么回事

添加-uall(或--untracked=all)查看实际被忽略的文件:

$ git status -s --ignored -uall logs
!! logs/foo
$ git check-ignore -v logs/foo
.gitignore:34:logs/foo  logs/foo

现在您可以使用文件(现在不再汇总)路径找出文件被忽略的原因。

(注意:我可能在剪切和粘贴过程中多次更改了上面的 .gitignore 内容,我是零碎地做的:在不同的时间我有 logs/foofoo .gitignore,两者都创建了目录 "become empty"。因此重复实验可能会得到略有不同的输出。尽管如此,关键是使用 -uall 来查找文件名。)