合并两个不同的存储库

时间:2012-05-04 12:27:44

标签: mercurial merge

我有3个回购,A,B和C,都与同一个项目有关。 A是项目的最早版本,B是一个实际上没有去过的实验,C是最新的工作版本。所有这些回购都有不同的文件 - 它们是同一产品的不同实现。

我想将这3个回购合并为一个保留其历史的回购 - 这是至关重要的。我想我想在B顶部将A和C叠加在B之上,但是当我签出项目时,我只想获得与repo C相关的更改。

我的想法是在A,hg rm *上标记或创建一个命名分支,提交然后在顶部堆积B.用B重复同样的操作,这样我就可以堆积C然后像往常一样继续项目。

你怎么看?此外,我想要做的一些灵感:12

1 个答案:

答案 0 :(得分:31)

您可以将变更集拉入一个大型存储库。从A repo开始:

$ hg init combined
$ cd combined
$ hg pull ../A
$ hg update

然后强行拉入B并虚拟合并两个头,以便保存B中的文件:

$ hg pull ../B --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge A and B, kept B"

然后重复C:

$ hg pull ../C --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge B and C, kept C"

这会给你三行历史和一个合并点,你首先扔掉A,然后是B,最后扔掉C。

或者,您可以将convert extension拼接图一起使用,将三个历史拼接在一起。首先强制将所有变更集拉入单个存储库。然后执行Mercurial到Mercurial转换,其中将A的尖端添加为B的根的第一个父级。类似于B和C.这给出了一个很长的历史,当你从A到A时会有一个非常突然的变化B和B到C.

我会选择第一个选项:它是最明确的,并且显示最佳状态,而不会伪造(转换)历史。