Git 跟踪文件中的代码块 moved/removed

Git tracking block of code moved/removed in a file

我在 myfile.extension 上有一个旧提交 md5hash,提交正文中有 SOME CHANGE(不是提交 title/metadata)。

如何在从 md5hashHEAD 的提交中生成一个修改了 SOME CHANGE(不仅仅是存在)的提交列表,而不必检查每个差异? (不幸的是,在当前案例中有很多。)

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

git blame 似乎没有用,因为行已经改变并且 SOME CHANGE 已经移动。

这仍然需要费力地查看结果,但这可能会让您更接近:

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

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

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

我想你正在寻找:

git log -S<string>

Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.

It is useful when you’re looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block.

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

起初我想到了git log -S,但它只涵盖了add/remove。 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