【问题标题】:How can I search though all deletions in a commit?如何搜索提交中的所有删除?
【发布时间】:2021-04-11 13:11:28
【问题描述】:

我有很多文件的提交。我想在所有删除中搜索一个字符串(或正则表达式),并显示一个包含匹配项的文件列表(最好是删除的相关摘录)。

使用git log -p -S 'string',我可以滚动并搜索所有更改,但我不知道如何将输出限制为某个提交,并且我无法提前过滤删除(我可以使用^- 开始我的正则表达式,但是太乱了)。

【问题讨论】:

    标签: git git-diff


    【解决方案1】:

    使用git log -p -S 'string' 我可以滚动并搜索所有更改,但我不知道如何将输出限制为某个提交...

    这部分很简单:git log 的主要功能是从某个特定的提交开始,一个接一个地遍历(向后,就像 Git 一样)提交。默认是从HEAD 提交开始,如果你没有指定从哪个提交开始,并且一直持续下去。但是如果你确实指定了一个特定的提交,它将从那里开始——并且,使用-n,你可以告诉它有多少提交要遍历,所以如果你将此设置为1,在完成您指定的一个提交后,它将“向后走”零次:

    git log -n 1 -p -S 'string' <hash-id>
    

    例如。

    您也可以使用--no-walk 达到相同的效果。如果您想检查两个或三个特定的提交,这会更有用:

    git log --no-walk -p -S 'string' <hash1> <hash2> <hash3>
    

    例如。

    而且我不能提前过滤删除(我可以用 ^- 开始我的正则表达式,但这很麻烦)。

    在这里,git log 并没有多大帮助。但是,您可以将git log 的输出重定向到一个文件,然后使用任何合适的命令打开该文件,以便您轻松找到删除的内容(grep,您的编辑器等)。

    请注意,^-.*&lt;string&gt; 并不意味着查找删除的更改,而是查找以- 开头的更改文本。除非您正在查看补丁文件本身,以便文件中的文本- 开头,否则这将无济于事。由git log 生成的- 作为所示补丁的一部分不包含在正则表达式搜索中,即使是--pickaxe-regex

    您可以考虑将git blame--reverse 一起使用。

    【讨论】:

      【解决方案2】:

      获得目标提交的哈希值后,您可以使用:

      # to get the list of matches in that commit :
      git grep -e 'string' hash
      
      # to get the list of matches in that commit's parent :
      git grep -e 'string' hash^
      

      git grep 也有一个 -c 选项来打印每个文件的 count 个匹配项,而不是完整的行。

      您可以将其用作脚本的输入:

      • 如果您的意思是“搜索出现次数减少的所有文件”:逐个文件比较 git grep -c ...,并检查次数减少的文件

      • 如果您的意思是“在全球出现次数下降的情况下继续提交”:将个人计数相加并进行比较

      • 等等……

      【讨论】:

        猜你喜欢
        • 2018-11-14
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 2015-11-02
        • 2012-11-22
        • 1970-01-01
        相关资源
        最近更新 更多