如何从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
