git grepping文件名

时间:2019-10-05 20:34:15

标签: git git-grep

如何通过管道将git grep的文件列表搜索到特定模式?
我具体是这样做的:

git grep -l 'string to search' 

,我想对上一次搜索的结果文件做另外一个git grep

尝试

git grep -l -e 'string to search' --and -e 'another string'  

没有给出任何结果,但我知道有匹配项

git grep -l 'string to search' | git grep -l 'another string'

git grep -l 'another string'

具有相同的结果

2 个答案:

答案 0 :(得分:2)

您的第二个git grep不会将第一个的结果作为参数,而只会输出其预期的内容,而与第一个命令无关。

用一个简单的bash grep替换它,应该这样做

git grep -l 'string to search' | grep 'another string'

答案 1 :(得分:2)

TL; DR

您不能管道名称,但可以供应名称(作为路径规范)到两个git grep命令之一。

(奇怪的是,--and首先应该已经完成​​了您想要的工作-我只是在回答没有--and时如何做的问题。)

中等长

尚不清楚您想要什么结果,但是假设您想要的是:

  • (其中的某些提交|一些提交的集合|索引|工作树)中的每个文件

    • 如果文件包含模式1

    • 文件包含模式2的同一文件中其他位置(不一定在同一行)

    • 然后列出文件名

有两种显而易见的方法可以实现这一目标,但是其中一种方法不起作用,因为Git不能在换行符之间进行匹配。 1 因此,我们剩下了另一种显而易见的方法方法:

  • 首先,使用git grep -l生成与第一个表达式匹配的文件列表
  • 然后,使用git grep -l生成与第二个表达式匹配的文件的列表,(可选)仅从第一个git grep产生的文件开始。

要将它们组合为操作,您可以选择使用两个git grep -l输出之一作为另一个git grep的一系列路径名参数。但是请注意,git grep在分隔它们的--之后使用 pathspec 参数,而不是路径 name 参数(请参阅{{3} })。这意味着,如果您的任何文件名中都包含pathspec元字符,则此简单的shell扩展可能会失败。验证第一个grep确实列出了一些文件,但是将它们组合成一个bash样式命令,可能也是一个好主意:

git grep -l pattern2 -- $(git grep -l pattern1)

通常就足够了。

要将以上两者作为操作(列出包含任一模式的文件)进行组合,最简单的方法是只使用一个git grep和多个模式。但是请注意,您可以运行多个git grep -l操作,并将生成的文件名定向到一个临时文件,然后使用comm之类的程序报告每组结果的共同点和唯一点。 (这假设您在命令行解释器工具箱中有comm。)使用comm还可解决特殊文件名(例如(top)file.cgot*you.sh或其他名称)的pathspec问题


1 如果Git did 在换行符之间匹配,则可以使用扩展或Perl模式:(foo(.|\n)*bar)|(bar(.|\n)*foo)允许在其他两个模式{{ 1}}和foo,以任意顺序使用任意一种模式。