【问题标题】:git grepping on filenamesgit grepping 文件名
【发布时间】:2019-10-05 20:34:15
【问题描述】:

如何通过管道向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'相同的结果

【问题讨论】:

    标签: git git-grep


    【解决方案1】:

    TL;DR

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

    (奇怪的是,--and 一开始就应该做你想做的事——我只是在回答没有--and 怎么做的问题。)

    中等长度

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

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

      • 如果文件包含模式 1

      • 文件包含,同一文件中的其他任何地方(不一定在同一行)模式 2

      • 然后列出文件名

    有两种明显的方法可以尝试实现这一点,但其中一种方法不起作用,因为 Git 不会跨换行符匹配。1 所以我们只剩下另一种明显的方法方法:

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

    要将它们组合为 and 操作,您可以选择使用两个 git grep -l 输出之一作为另一个 git grep 的一系列路径名参数。但是请注意,git grep 在分隔它们的-- 之后采用pathspec 参数,而不是路径name 参数(有关详细信息,请参阅the documentation)。这意味着如果您的任何文件名中包含 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 或其他任何特殊文件名。


    1如果 Git 确实 匹配换行符,您可以使用扩展或 Perl 模式:(foo(.|\n)*bar)|(bar(.|\n)*foo) 允许在其他两个模式 foobar,以任一顺序使用任一模式。

    【讨论】:

      【解决方案2】:

      您的第二个 git grep 不会将第一个的结果作为参数,它只输出它应该输出的结果,而不考虑第一个命令。

      用一个简单的 bash grep 替换它就可以了

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

      【讨论】:

      • 所以用git grep不可能做到这一点?
      • @Jim 我不是这么说,我只是在建议一种方法来修改您第二次尝试实现目标的方法。我不确定你是否可以在没有管道的情况下获得相同的结果,只需使用git grep 选项,我也觉得这很有趣,我会留意这里,以防有人提出想法。
      • 只有在“另一个字符串”与“要搜索的字符串”在同一行时才有效。如果要搜索整个文件,可以执行以下操作: git grep 'string to search' |剪切 -d ":" -f1 |排序 |独特 | xargs git grep '另一个字符串'
      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2011-09-27
      • 2011-04-24
      • 2014-05-03
      • 2011-12-07
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多