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

Tom*_*ale 7 git gitignore

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

$ $ git status -s --ignored logs
!! logs/
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时:

git check-ignore -v logs/
Run Code Online (Sandbox Code Playgroud)

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

我没有什么上演的:

$ git status --untracked-files=no
On branch master
nothing to commit (use -u to show untracked files)
Run Code Online (Sandbox Code Playgroud)

那么为什么这个文件夹会被忽略呢?

$ git --version
git version 2.10.2
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 5

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

$ git status -s --ignored logs
!! logs/
Run Code Online (Sandbox Code Playgroud)

这是我放在里面的内容logs

$ ls -A logs
foo
Run Code Online (Sandbox Code Playgroud)

这就是它被忽略的原因:

$ grep foo .gitignore
foo
Run Code Online (Sandbox Code Playgroud)

但这里git check-ignore -v只字未提logs/foo

$ git check-ignore -v logs/
Run Code Online (Sandbox Code Playgroud)

为什么

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

因此,当你问 Git“为什么被logs/忽略”时,答案是,有点,它没有被忽略,它只是被忽略的内容。(我想我们可以说这是 . 中的一个错误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
Run Code Online (Sandbox Code Playgroud)

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

(注意:我可能.gitignore在剪切和粘贴过程中多次更改了上面的内容,这是我零碎的:在不同的时间我有logs/foofoo.gitignore,这两者都使目录“变空”。所以重复实验可能会略有不同输出。不过,关键是-uall用来查找文件名。)