在命令中使用排除模式的要求背后的逻辑是什么 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
会添加被忽略的模式(例如写入 .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
。换句话说,(假设先前的查询为空,即没有未标记的未跟踪文件),这将显示当前目录中不属于存储库的所有文件。这对于检查不应忽略的文件非常有用,必须放在存储库中。