如何从git grep搜索中排除某些目录/文件
有没有办法使用git grep
来搜索git存储库,但排除搜索中的某些路径/目录/文件? 像正常的grep命令中的--exclude
选项一样。
如果您好奇:我不想使用普通的grep,因为当git存储库的大小很大时,它比git grep
慢得多。
这是不可能的,但最近已经讨论过了。 链接中提出的解决方法:
您可以将*.dll
放入.gitignore文件,然后将git grep --exclude-standard
。
编辑看到唯一的答案,因为Git 1.9.0是可能的。
在git 1.9.0中,“magic word” exclude
被添加到pathspec
。 所以如果你想在除了匹配*.java
文件之外的每个文件中搜索foobar
,你可以这样做:
git grep foobar -- './*' ':(exclude)*.java'
或者使用!
排除的“简写”:
git grep foobar -- './*' ':!*.java'
请注意,在使用排除pathspec
,您必须至少有一个“全包” pathspec
。 在上面的例子中,这是./*
(递归地包含当前目录下的所有内容)。
您还可以使用如下内容:(top)
(简写:/
)来包含回购顶部的所有内容。 但是,您可能还想调整排除pathspec
以从顶部开始:/!*.java
(否则它只会从当前目录下排除*.java
文件)。
对于pathspec
中的pathspec允许的所有“魔法词语”(或者仅仅是git help glossary
)都有很好的参考。 出于某种原因,kernel.org上的文档实际上是过时的,即使它们经常在谷歌搜索中首先出现。
更新:对于git> = 1.9,本机支持排除模式,请参阅唯一的答案。
这可能看起来倒退了,但是你可以传递一个不匹配排除模式的文件列表到git grep
像这样:
git grep <pattern> -- `git ls-files | grep -v <exclude-pattern>`
grep -v
返回每个不匹配<exclude-pattern>
路径。 请注意, git ls-files
也需要一个--exclude
参数,但这只适用于未跟踪的文件。
上一篇: How to exclude certain directories/files from git grep search