如何在 git 提交中识别和列出唯一的大块头?



我有一个提交,其中包含大量(数百个)类似的大块头,我想在提交中列出每个独特的大块头以进行比较。

我编写了以下GNU awk脚本,它将每个大块头写入一个唯一的文件(hunk-[md5-of-hunk].txt):

BEGIN {
hunk = ""
buildhunk = 0
}
function writeHunk() {
if (length(hunk) > 0) {
print hunk > "hunk.tmp"
close("hunk.tmp")
cmd = "cat hunk.tmp | md5"
cmd | getline md5
close(cmd)
if (!(md5 in hunkfiles)) {
hunkfilename = "hunk-" md5 ".txt"
print hunk > hunkfilename
hunkfiles[md5] = hunkfilename
}
}
}
/^@@|^diff/ {
writeHunk()
hunk = ""
buildhunk = ($1 == "@@") ? 1 : 0
}
/^[ +-]/ {
if (buildhunk) {
hunk = hunk $0 "n"
}
}
END {
writeHunk()
system("rm hunk.tmp")
for (md5 in hunkfiles) {
print hunkfiles[md5]
}
}

然后我用git show [commit-SHA] | awk -f my_script.awk运行它,它会创建并列出生成的文件。它适用于我的目的,但是有没有办法使用 git 的管道命令更有效地做到这一点。

假设提交的补丁如下所示(为了清楚起见,下面减少到 1 行上下文):

diff --git a/file1.txt b/file1.txt
index a3fb2ed..4d6f587 100644
--- a/file1.txt
+++ b/file1.txt
@@ -3,2 +3,3 @@ context
context
+added line
context
@@ -7,2 +8,3 @@ context
context
+added line
context
@@ -11,2 +13,3 @@ context
context
+added line
context
@@ -15,2 +18,3 @@ context
context
+different added line
context
@@ -19,2 +23,3 @@ context
context
+different added line
context
@@ -23,2 +28,3 @@ context
context
+different added line
context
@@ -27,2 +33,3 @@ context
context
+even more different added line
context
@@ -31,2 +38,3 @@ context
context
+even more different added line
context

我希望能够识别只有 3 个独特的大块头,看看它们是什么。即:

独特的大块头 1:

context
+added line
context

独特的大块头2:

context
+different added line
context

独特的大块头3:

context
+even more different added line
context

提交是快照,因此,它们没有差异大块。

当然,差异确实有差异大块头。 因此,如果您只有一个提交,则根本无法执行此操作。 您需要两次提交。 然后,您只需区分它们并执行您正在做的事情。

请注意,git show <commit-hash>实际上意味着git diff <parent or parents of commit> <commit-hash>。 如果指定的提交是合并提交,这将生成一个组合的差异,这可能对您的目的没有用,因为组合的差异故意完全省略了许多更改。 您可能希望仅针对提交的第一个父级运行显式差异(仅查看作为合并的一部分引入的更改)。

Git 的某些部分在内部会做一些类似于您正在做的事情,用于git rereregit patch-id。 但是,它们并没有完全按照您正在做的事情执行:对于rerere,它们只记录存在合并冲突的差异大块头,并将这些差异大块块(通过哈希ID和文件名保存)与以后记录的分辨率相匹配。 对于patch-id,他们去掉了行号和空格,但将整个更改集从提交累积成一个大块。 如果 Git 有一些管道可以逐个大块地完成git patch-id部分,与计算提交的整体补丁 ID 无关,那可能会很好,但它没有。

相关内容

  • 没有找到相关文章

最新更新