31

我有 3 个 repos,A、B 和 C,都与同一个项目相关。A 是该项目的最旧版本,B 是一个没有真正去任何地方的实验,C 是最新的工作版本。所有这些存储库都有不同的文件——它们是同一产品的不同实现。

我想将这 3 个存储库合并为一个,以保留它们的历史记录——这很重要。我想我想将 B 堆叠在 A 之上,将 C 堆叠在 B 之上,但是当我签出项目时,我只想获得与 repo C 相关的更改。

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

你怎么看?另外,我想做的一些灵感:1 , 2

4

1 回答 1

37

您只需将变更集拉入一个大存储库即可。从 A 回购开始:

$ 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。

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

我会选择第一个选项:它是最明确的,并且最好地展示了在不伪造(转换)历史的情况下会发生什么。

于 2012-05-04T14:14:04.810 回答