Git差异和压缩的电子邮件补丁

时间:2019-02-22 22:42:28

标签: git squash

在某些情况下,git format-patch将不包括合并提交或将以无法彻底应用的方式生成补丁。在这些情况下,我想使用git diff生成电子邮件/ mbox格式的压缩补丁,并希望将提交消息压缩为一个,以便至少保留 some 历史记录。有方便的方法吗?

1 个答案:

答案 0 :(得分:2)

您说的是某些情况,但是实际上git format-patch不会 格式化合并提交,因为它不知道该怎么做。它也不会格式化一个空补丁(这可能解释了Git对不作“空”(即,无更改,提交)的强烈要求)。但是,是的,如果您的提交范围包括合并(实际上是一个或多个),那么您就容易陷入麻烦。

  

在这些情况下,我想使用git diff生成电子邮件/ mbox格式的压缩补丁,并希望将提交消息压缩为一个,以便至少保留一些历史记录。有方便的方法吗?

简短的回答是“否”,因为它至少在机械意义上从来都不是显而易见的。

保留此类提交并在不允许git fetchgit push的网络间隙中传输这些提交的最佳方法(至少是最好的内置方法)是将它们变成Git < em> bundle 。束实际上是git fetchgit push操作的一半。您可以通过任何喜欢的传输机制将分发包发送到另一台计算机,然后在另一台计算机上使用git fetch将其提交提交到另一端的存储库中。另请参见Why can't I git bundle all parents?

如果失败,您可以尝试使用git cherry-pick或为您运行的命令git rebase(可能在交互模式下)将您的commits-include-merger字符串转换为更线性的提交字符串。 因为围绕合并点执行操作从来都不是很明显,所以您必须以其他方式自己处理。然后,可以将生成的一系列线性提交提交给git format-patch

如果您愿意将所有内容变成一个单一的大规模提交,则可以在两个端点(开始提交和结束提交)上运行git diff,也可以运行git log来进行汇总日志消息。将它们格式化为邮箱样式的消息非常简单。或者,如果需要,可以使用git commit-tree来编写使用最终树但将其父级设置为所需起点的提交,然后使用git format-patch格式化该提交。由于git commit-tree会读取stdin的提交消息,因此您可以使用git log(也许与--pretty=format:%B一起)从合并的提交中收集所有提交消息。