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

时间:2013-04-10 11:53:20

标签: git

使用命令git ls-files --ignored

使用排除模式的要求背后的逻辑是什么

来自git help ls-files

  

-i, --ignored

     

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

1 个答案:

答案 0 :(得分:14)

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