如何从 'git filter-branch' 获取旧->新重写提交的SHA列表?

14

运行 git filter-branch 后,如何获取旧的提交 SHA 列表,这些提交已经被 filter-branch 重写为它们对应的新提交 SHA?

例如,类似于以下内容:

b19fd985746c1f060f761d42d353e387bec243fb -> c8ab40ef9bae3b58642a8d1e5b90720d093a60b5
c5ebba1eeb92ca76c0effa32de14178ec7f07db6 -> 4d5a9958b98dbcfa47ce1354bb2af4cc77904639
705f71543235b872ca3e1067538e36d14044429d -> d2aafbd6e5b91955b62dee34f4a0abf0171ba016

左列是原始的SHA列表,右列是经过filter-branch重写后的新SHA。

我发现filter-branch的man页提到了一个map函数,但我不知道它在这里是否有用,如果有用,该如何使用它。

谢谢你的帮助!

1个回答

19

为了解决这个问题,我不得不查看git-filter-branch的源代码。据我所知,它没有被记录下来,但旧的提交ID明确地导出为$GIT_COMMIT。以下方法适用于我:

$ git filter-branch --your-filters-here --commit-filter 'echo -n "${GIT_COMMIT}," >>/tmp/log; git commit-tree "$@" | tee -a /tmp/log' your-branch-here
[...]
$ cat /tmp/log
70d609ba7bc58bb196a2351ba26afc5db0964ca6,d9071b49743701c7be971f76ddc84e76554516c7
0d1146dcabc00c45fb9be7fe923c955f7b6deb50,cb6813f9aca5e5f26fcc85007c5bb71552b91017
[...]

(当然,那个文件的格式是 <原提交哈希值>,<新提交哈希值>。)

不过我有点好奇你使用它的意图是什么。如果你正在 "正确" 使用 filter-branch(即不操纵已发布的历史记录),似乎并不需要了解这种信息。


太棒了,非常感谢!由于某种原因,-n也被打印出来了,所以我把它去掉了。我不介意输出在交替行上。别担心,这不是公共存储库。 :-) - Walt D
1
哦,看起来$GIT_COMMIT已被记录下来了:“环境变量$GIT_COMMIT将被设置为包含正在重写的提交的ID”。 - Walt D
啊,好的。这让我感到放心——让我不那么担心这将在下一个 Git 版本中突然停止工作。 :-) - impl
那么,为什么会打印出“-n”?我不喜欢输出在交替的行上。 - Iulian Onofrei
我通过将该命令替换为echo "${GIT_COMMIT},\c" >>/tmp/log; git commit-tree "$@" | tee -a /tmp/log来实现它。 - Iulian Onofrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接