在不破坏文件历史记录的情况下合并两个mercurial存储库

时间:2015-04-29 08:32:31

标签: mercurial

我需要将两个mercurial存储库合并到一个全新的第三个存储库中。

项目A:

1--2--3

项目A':

4--5--6

我想要的是什么:

项目B:

1--2--3--4--5--6

由于我的服务器上的大小限制,已从项目A中删除了历史记录。 我没有尺寸限制了。 我想带回来

类似于this question,除了我需要一个mercurial

的解决方案

1 个答案:

答案 0 :(得分:2)

你当然可以这样做并保留历史记录,但你的变化集合哈希几乎肯定会从原文中改变 此外,在我继续之前,备份,备份,备份。确保你保留原件以防万一这一切都非常糟糕,这很可能。

在我的头顶,你有两个选择 两者都是从使用--force选项将项目A'拉入项目A开始,以允许您引入不相关的存储库。例如。

hg pull --force ProjectA'

让我们称之为新的组合回购项目A +。

<强>衍合

然后您可以使用Rebase扩展(需要在Mercurial扩展设置中启用)来更改变更集4,并将其后代更改为变更集3.例如:

hg rebase --source 4 --dest 3

您可能还想使用--keepbranches选项,或者可能会将所有分支名称重置为修订版本3的名称。
我自己从未使用过这种特殊的策略,但我不明白为什么它不起作用。

<强>转换

我之前使用的第二个选项是带有splicemap的hg convert splicemap选项允许您为变更集指定新父项,因此您可以指定rev 3是rev 4的父项,而现在rev 4可能没有父项。

splicemap基本上是一个文本文件,内容的格式如下:

revision-hash new-parent-hash

文件中的每个地图都用新行分隔 您必须使用完整哈希,友好修订号或短哈希将不起作用。

然后要实际使用splicemap,请执行以下操作:

hg convert --splicemap splicemap_filepath.txt ProjectA+ ProjectB

这将会产生具有统一历史的Project B回购。

根据您的回购的大小,这些都不会很快。