17

在命令中使用排除模式的要求背后的逻辑是什么git ls-files --ignored

来自git help ls-files

-i, --ignored

在输出中仅显示被忽略的文件。在索引中显示文件时,仅打印与排除模式匹配的文件。显示“其他”文件时,仅显示那些与排除模式匹配的文件。

4

1 回答 1

25

首先让我确保你不会--ignored混淆--other.

--other是列出未跟踪文件的选项。从git-ls-files(强调我的)手​​册中:

-o, --others

在输出中显示其他(即未跟踪的)文件

就是说,让我们看看有什么--ignored作用。无论您列出什么,无论是跟踪文件、未跟踪文件、修改文件等,您都可以从输出中排除一些文件。把它想象成一个免费的grep -v自动完成的输出。例如:

git ls-files --other --exclude=*.o

将列出所有不匹配的未跟踪文件*.o。排除模式与.gitignore. 实际上,.gitignore确定在列表完成后过滤--other输出时会输出--exclude什么(或者至少这是观察到的行为)1

现在--ignored简单地还原输出。因此,被排除的exclude=内容将被打印出来,而未被排除的内容将被省略。因此,例如:

git ls-files --other --exclude=*.o --ignored

将打印所有匹配的未跟踪文件*.o

1不完全一样,--exclude只过滤未跟踪的文件,因此如果您列出跟踪的文件,则--exclude不会排除任何内容。但是,--ignored它会列出应该被排除的文件。这有点奇怪。

结论: --ignored基本上会恢复命令行中给出的排除模式。默认情况下,排除模式为空(您可以看到所有内容),因此--ignored没有任何排除模式会导致所有内容都被忽略。这永远不会有用,这就是为什么需要排除模式--ignored才能工作。


既然--exclude-standard提到了,我也想对此进行扩展。--exclude-standard也会在列表中添加被忽略的模式(例如 write in .gitignore)作为排除模式。所以想想下面的命令:

git ls-files --ignored --exclude-standard

首先,此命令列出所有跟踪的文件。然后给出--ignored命令,它只会打印那些与排除模式匹配的文件。给定,将打印--exclude-standard与模式匹配的有效文件。.gitignore但这些是您未跟踪的文件。如此有效,您将什么也看不到。您会看到的唯一情况是,如果您正在跟踪您也提到在.gitignore.

换句话说,如果该命令输出任何内容,则意味着您已经告诉 git 忽略某些文件,但是您违反了自己的规则并将它们添加到存储库中。


其他有趣的命令可能是:

git ls-files --other --exclude-standard

显示您未在 中指定的所有未跟踪文件.gitignore。您还会在git status.

git ls-files --other --ignored --exclude-standard

显示您成功忽略的所有未跟踪文件.gitignore。换句话说,(假设先前的查询是空的,即没有未忽略的未跟踪文件)这显示了当前目录中不属于存储库的所有文件。这对于检查不应被忽略且必须放入存储库中的文件很有用。

于 2013-04-10T13:47:42.323 回答