在命令中使用排除模式的要求背后的逻辑是什么git ls-files --ignored
?
来自git help ls-files
:
-i, --ignored
在输出中仅显示被忽略的文件。在索引中显示文件时,仅打印与排除模式匹配的文件。显示“其他”文件时,仅显示那些与排除模式匹配的文件。
在命令中使用排除模式的要求背后的逻辑是什么git ls-files --ignored
?
来自git help ls-files
:
-i, --ignored
在输出中仅显示被忽略的文件。在索引中显示文件时,仅打印与排除模式匹配的文件。显示“其他”文件时,仅显示那些与排除模式匹配的文件。
首先让我确保你不会--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
。换句话说,(假设先前的查询是空的,即没有未忽略的未跟踪文件)这显示了当前目录中不属于存储库的所有文件。这对于检查不应被忽略且必须放入存储库中的文件很有用。