合并两个不同的存储库

rui*_*eco 28 merge mercurial

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

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

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

你怎么看?此外,一些灵感是我想做的事:1,2.

Mar*_*ler 33

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

$ hg init combined
$ cd combined
$ hg pull ../A
$ hg update
Run Code Online (Sandbox Code Playgroud)

然后强行拉入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"
Run Code Online (Sandbox Code Playgroud)

然后重复C:

$ hg pull ../C --force
$ hg merge --tool internal:other
$ hg revert --all --rev tip
$ hg commit -m "Merge B and C, kept C"
Run Code Online (Sandbox Code Playgroud)

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

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

我会选择第一个选项:它是最明确的,并且显示最好的情况,而不会伪造(转换)历史.

  • 我很好奇“恢复”会完成什么? (2认同)