如何在rebase之后更新提交消息中的SHA1?

时间:2017-06-15 15:01:32

标签: git rebase

考虑这段历史:

E  BUG: fix regression in <sha-1 of C>
|
D  fixup! Do a thing
|
C  Add a feature
|
B  Do a thing
|
A  Initial commit

是否有git rebase -i --autosquash的变体会调整E的提交消息以匹配以下内容?

E'  BUG: fix regression in <sha-1 of C'>
|
C'  Add a feature
|
BD' Do a thing
|
A   Initial commit

1 个答案:

答案 0 :(得分:3)

我无法真正想到自动方式。在交互式rebase中,您可以将提交E标记为&#34; reword&#34;或&#34;编辑&#34;并自己更改SHA。 (我认为&#34;编辑&#34;可能更简单,以便您可以使用log找到正确的SHA,以便在启动提交消息编辑器之前填写。)

<强>更新

从评论中引入一些想法:如果您正在处理大量历史记录的重写,许多此类参考文献,以及带有手动消息编辑的交互式rebase是不现实的,它会相当多更难以设想解决方案。

虽然你的问题似乎集中在rebase上,但在评论中你提到的可能真的在想filter-branch。 (应该注意的是,这是一个非常不同的操作,所以几乎不容易用一个替换另一个......)

在任何情况下,最好的选择是在导致提交SHA值更改的相同操作中重写提交消息。 (如果您尝试执行此操作&#34;事后&#34;,则重写提交X的消息将再次更改SHA的权限X,以及通过父指针到达X的任何提交;因此,您必须在此时跟踪/处理多个ID映射。)

理论上你想要的是msg-filtersed - 在SHA值上键入搜索和替换;但麻烦的地方在于你将新的沙子带到了新的沙滩上。映射。

有一个shell函数map,torek表示可以提供一些帮助,至少在过滤器脚本中是这样。 (我发现的文档只是确认在执行commit-filter期间可以使用这些文档,但如果torek说其他过滤器可以看到它,那么我倾向于认为他是对的。问题是是否可能在未来的版本中发生变化,如果它确实没有记录。如果这让你担心,你可以将消息编辑转换为提交过滤器,也许......)

因此,您可以编写一个查看旧提交消息的脚本(如果您坚持使用msg-filter,则在STDIN上收到)并搜索可能的SHA值([0-9a-f]中包含40个字符的字符串) )。在找到可能的值时,它将调用map,如果map返回看起来像单个SHA值的值,则编辑消息文本。然后在STDOUT上返回已编辑的文本。 (但是:我相信只有在你的提交消息中确实有完整的40个字符的SHA时才会起作用。如果你缩写,那就是另一个蠕虫......)

(请注意,map 可以返回多个SHA值,但我发现的唯一情况是,如果您正在使用commit-filter做一些奇特的事情。)