我有3个回购,A,B和C,都与同一个项目有关。 A是项目的最早版本,B是一个实际上没有去过的实验,C是最新的工作版本。所有这些回购都有不同的文件 - 它们是同一产品的不同实现。
我想将这3个回购合并为一个保留其历史的回购 - 这是至关重要的。我想我想在B顶部将A和C叠加在B之上,但是当我签出项目时,我只想获得与repo C相关的更改。
我的想法是在A,hg rm *上标记或创建一个命名分支,提交然后在顶部堆积B.用B重复同样的操作,这样我就可以堆积C然后像往常一样继续项目。
你怎么看?此外,我想要做的一些灵感:1,2。答案 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.
我会选择第一个选项:它是最明确的,并且显示最佳状态,而不会伪造(转换)历史。