我们正在开发一个巨大的项目。在开发初期,我们决定使用Mercurial以及子库特征。经过2年的发展,我们有10个独立的模块,每个模块都有一个存储库。我们发现,子库不是我们的最佳解决方案,并且还发现Git对我们比Mercurial更好。Git:重写历史以使用相同的消息和时间提交崩溃提交(合并子模块)
所以,我们要:1。 水银加入到subrepositories一个主要 Mercurial库与保留完整的历史 2.转换此主要库来的Git仓库(也有保存历史)
第一步已经完成(在stackoverflow上有一个很好的答案),对每个子库使用hg-convert扩展并将它们合并为一个。
第二步也是使用快速导出/ hg-fast-export工具完成的。而且......一切都很好,除了一件事。由于具有子库的Mercurial具有使用一个命令承诺所有子库的功能,所以我们使用它的频率很高。而现在的历史看起来是这样的:
commit c6a33eb195c574cfa81469f2109c0840852a5571
Author: John
Date: Mon Jul 1 20:26:14 2013 +0200
Add another one feature
commit fc5390a726847ef2971edd591020c5c1d2aa168b
Author: John
Date: Mon Jul 1 20:26:14 2013 +0200
Add another one feature
commit 2477c27b361657dabeb28802f5f510f170378fc0
Author: John
Date: Mon Jul 1 20:26:14 2013 +0200
Add another one feature
原因是这些提交中的每一个都来自不同的原始子库。我们的历史树如下所示:
subrepo_1/master: -A-B-C-D-E--EJ---EJM---merged---->
/ /
subrepo_2/master: -F-G-H-I-J-- /
/
subrepo_3/master: -K-----L-M------
因此,不同子模块的主分支完全分离。如果我结帐,例如提交F那么工作目录不包含* subrepo_1 *和* subrepo_3 *的任何代码。
我们希望只有一个主分支,应该看起来像:
master: -AFK-BGK-CHK-DIL-EJM----->
所以一个承诺应该在几个模块代表分组的变化。
问题:
是否有可能由任何单一命令的Git崩溃各组在历史上一个提交的?这些提交具有相同的时间,消息和作者。
注意:“git rebase -i”似乎不是一个解决方案,因为我们有太多的提交手动压扁。
如果它是不可能有一个的Git命令做的,那么是不是可以编写基于几个的Git命令的脚本?
我的想法(感谢@Chronial回复)是:收集所有主分支的提交列表并按时间对它们进行排序,从列表中选择每个提交到新的干净分支。然后使用filter-branch和commit-filter来过滤每个提交的相同时间/消息组,只留下一个提交。可以吗?
在此先感谢。
不,它不是 - autosquash需要'fixup!'或'squash!'在提交信息中。 – Chronial
我们的回购仅约5000个提交和700Mb的大小,所以git可以轻松处理这个问题。 –