要求在命令git ls-files --ignored
中使用排除模式的逻辑是什么?为什么git ls-files --ignore需要排除模式?
从git help ls-files
:在输出
-i, --ignored
只显示忽略的文件。在索引中显示文件时,只打印排除模式匹配的文件。显示“其他”文件时,只显示与排除模式匹配的文件。
要求在命令git ls-files --ignored
中使用排除模式的逻辑是什么?为什么git ls-files --ignore需要排除模式?
从git help ls-files
:在输出
-i, --ignored
只显示忽略的文件。在索引中显示文件时,只打印排除模式匹配的文件。显示“其他”文件时,只显示与排除模式匹配的文件。
首先让我确保你不会混淆--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
。换句话说,(假设前面的查询是空的,即没有未经过签名的未跟踪文件),它将显示当前目录中不属于存储库的所有文件。这对检查不应该被忽略的文件很有用,并且必须放入存储库。
你的意思是需要指定'--exclude-standard'(或类似的)? – 2013-04-10 12:01:06