【问题标题】:Git tracking block of code moved/removed in a fileGit跟踪文件中移动/删除的代码块
【发布时间】:2016-02-14 09:38:55
【问题描述】:

我在myfile.extension 上有一个旧的提交md5hash,提交正文中有SOME CHANGE(不是提交标题/元数据)。

如何在从md5hashHEAD 的提交中生成带有SOME CHANGE 修改(不仅仅是存在)的提交列表,而无需检查每个差异? (不幸的是,在目前的情况下有很多。)

我尝试了git rev-list --all | xargs git grep 'SOME CHANGE',但这似乎找到了文件中SOME CHANGE 的所有提交。

git blame 似乎没用了,因为行已更改,SOME CHANGE 已移动。

【问题讨论】:

    标签: git git-log git-blame


    【解决方案1】:

    我认为您正在寻找的答案是git --no-pager log --pretty="%H" -G"SOME CHANGE" -- myfile.extension

    起初我想到了git log -S,但它只涉及添加/删除。 git log -G 可能会接近你想要的。在这里您可以看到-S-G 之间的区别,我还包含了完整的提交历史记录,因此您可以查看未涵盖的内容。阅读提交消息,了解我在正文中所做的操作。

    # git --no-pager log --oneline -S"SOME CHANGE"
    12e24ed Remove text
    9427ffc Add the text
    # git --no-pager log --oneline -G"SOME CHANGE"
    12e24ed Remove text
    6a33653 Change other text on same line
    ac09bbb Append other text to same line
    484b447 Move the text two lines down
    9427ffc Add the text
    # git --no-pager log --oneline
    12e24ed Remove text
    9c7f7d5 Change text on adjacent line
    6a33653 Change other text on same line
    ac09bbb Append other text to same line
    484b447 Move the text two lines down
    377936f Add other text on adjacent line
    9427ffc Add the text
    1929648 Initial commit
    

    仅使用哈希来获取它:

    # git --no-pager log --pretty="%H" -G"SOME CHANGE"
    12e24ed749e499bc2d8920c5d8a3ca98a6422e3f
    6a336532210ca85dea86968c34cef516345b8ab4
    ac09bbb5c95bbea65e7c99c730653d27f90397f4
    484b4478e4cb16c839dac558f3e958683b428a64
    9427ffc7dd60a3cfb1d9880083e6262faea0eefb
    

    【讨论】:

      【解决方案2】:

      我想你正在寻找:

      git log -S<string>
      

      寻找改变文件中指定字符串出现次数(即添加/删除)的差异。供脚本编写者使用。

      当您正在寻找一个确切的代码块(如结构)并想知道该代码块自其诞生以来的历史时,它很有用:迭代地使用该功能来提供有趣的代码块preimage 回到 -S 中,并继续执行,直到获得第一个版本的块。

      【讨论】:

        【解决方案3】:

        这仍然需要对结果进行一些研究,但这可能会让您更接近:

        git rev-list --all | xargs git show | egrep '(^ ?[+-].*(SOME CHANGE)|^commit)' | egrep -B1 '^ ?[+-]' | uniq
        

        这会显示每个提交的补丁,显示它正在查看的 sha,然后吐出匹配的代码行。匹配的相关 sha 在匹配之上。

        如果这是可行的方法,您可以进一步清理结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-09
          • 2020-11-18
          • 1970-01-01
          • 1970-01-01
          • 2019-04-19
          • 2022-01-27
          • 2018-07-21
          • 2014-02-12
          相关资源
          最近更新 更多