我需要将两个mercurial存储库合并到一个全新的第三个存储库中。在不破坏文件历史的情况下合并两个mercurial存储库
项目A:
1--2--3
A计划“:
4--5--6
我想要什么:
项目B:
1--2--3--4--5--6
由于服务器上的大小限制,从项目A中删除了历史记录。 我没有尺寸限制了。 我想带回
类似于this question只是我需要善变
我需要将两个mercurial存储库合并到一个全新的第三个存储库中。在不破坏文件历史的情况下合并两个mercurial存储库
项目A:
1--2--3
A计划“:
4--5--6
我想要什么:
项目B:
1--2--3--4--5--6
由于服务器上的大小限制,从项目A中删除了历史记录。 我没有尺寸限制了。 我想带回
类似于this question只是我需要善变
的解决方案你当然可以做到这一点,保存历史,但你的变更哈希几乎肯定会从原件改变。
另外,在我继续之前,备份,备份,备份。确保你保留原件,以防万一这一切出现可怕的错误,这很可能。
关闭我的头顶上有两个选项。
两者都是从您使用--force
选项将项目A'拉入项目A开始,以允许您拉入不相关的存储库。例如。
hg pull --force ProjectA'
让我们称之为新的联合回购项目A +。
再次基于
那么你可以使用底垫的扩展(这需要在您的水银扩展设置中启用)衍合变更4和它的后代在变更3.例如:
hg rebase --source 4 --dest 3
您可能还想使用--keepbranches
选项,或者它可能会将所有分支名称重置为修订版本3.
我从未使用过这种特殊策略,但我不明白为什么它不起作用。
转换
第二个选项,这是我以前所使用的,是hg convert
与splicemap。
splicemap选项允许你为变更集指定新的父母,所以你可以指定rev3是rev4的父母,而现在rev4可能没有父母。
的splicemap基本上是一个文本文件,并且将内容的格式为:
revision-hash new-parent-hash
和文件中的每个映射由一个新行分开。
你必须使用完整散列,友好版本号或短散列将不起作用。
然后实际使用您做以下的splicemap:
hg convert --splicemap splicemap_filepath.txt ProjectA+ ProjectB
这会吐出一个项目B回购有统一的历史。
根据您的回购协议的规模,这些都不会很快。
谢谢@Nanhydrin我会试试这个 –
我认为splicemap是一个很好的方式去这里(从最近的经验)。不过,我认为splicemap文件格式是“父亲”,而不是相反。 – DaveInCaz
@DaveInCaz感谢您指出。我已经交换了他们,我不认为孩子哈希值作为一个名字特别清晰,所以我也重命名了它。 – Nanhydrin