2013-04-10 53 views
10

要求在命令git ls-files --ignored中使用排除模式的逻辑是什么?为什么git ls-files --ignore需要排除模式?

git help ls-files:在输出

-i, --ignored

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

+0

你的意思是需要指定'--exclude-standard'(或类似的)? – 2013-04-10 12:01:06

回答

13

首先让我确保你不会混淆--ignored和​​。

​​是您列出未跟踪文件的选项。从git-ls-files(重点煤矿)的手册:

-o, --others

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

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

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

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

现在--ignored只是恢复输出。所以exclude=的排除内容将被打印出来,而不被排除的内容将被省略。因此,例如:

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

将打印所有未跟踪文件比赛*.o

不完全一样,只--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。换句话说,(假设前面的查询是空的,即没有未经过签名的未跟踪文件),它将显示当前目录中不属于存储库的所有文件。这对检查不应该被忽略的文件很有用,并且必须放入存储库。