问题 为什么git ls-files --ignore需要排除模式?


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

git help ls-files

-i, --ignored

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


9186
2018-04-10 11:53


起源

你的意思是需要指定 --exclude-standard (或类似的)? - Michael Wild


答案:


首先让我确保你不要混淆 --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。换句话说,(假设先前的查询为空,即没有未标记的未跟踪文件),这将显示当前目录中不属于存储库的所有文件。这对于检查不应忽略的文件非常有用,必须放在存储库中。


14
2018-04-10 13:47