我在Mercurial存储库中有一个具有24个月源代码控制历史记录的项目。

我最近发现了该项目的一些旧版本,这些版本早于源代码控制,我认为它们可以作为“史前”变更集导入到存储库中。

我可以以某种方式在初始提交中添加父母吗?

或者,是否可以在tarball顶部重播我的整个存储库历史记录,并保留所有元数据(时间戳等)?

是否有可能使新的父提交使用这些旧tarball的时间戳?

最佳答案

您可以使用convert extension来构建新的存储库,在该存储库中,将tarball作为修订版本导入到当前根修订版之前。

首先,基于null修订版导入压缩包:

$ hg update null
$ tar -xvzf backup-2010.tar.gz
$ hg addremove
$ hg commit -m 'Version from 2010'
$ rm -r *
$ tar -xvzf backup-2011.tar.gz
$ hg addremove
$ hg commit -m 'Version from 2011'


我在上面使用addremove使Mercurial有机会检测每个tarball之间的重命名(请查看--similarity标志以对其进行微调,并用手使用hg rename --after进一步帮助Mercurial)。另外,我在导入新的tarball之前删除了工作副本中的所有文件:这样,下一次提交将完全包含您解压缩的tarball中存在的快照。

像上面那样导入所有压缩包之后,您的存储库中就有并行的历史记录:

[c1] --- [c2] --- [c3] ... [cN]

[t1] --- [t2] --- [tM]


您以前的提交是c1cN,而来自tarball的提交是t1tM。目前,它们没有共享历史记录-就像您使用hg pull -f将不相关的存储库拉入当前存储库一样。

现在,可以使用convert扩展名执行从Mercurial到Mercurial的转换,您可以在其中将c1的父修订版重写为tM。为此使用--splicemap标志。它需要一个文件

<full changeset hash for c1> <full changeset hash for tM>


使用hg log --template '{node} ' -r c1 -r tM > splicemap生成这样的文件。然后跑

$ hg convert --splicemap splicemap . spliced


生成具有合并历史记录的新存储库spliced。该存储库是新的,因此您需要让所有人重新克隆它。

此技术类似于Kindread建议的使用hg rebase。区别在于convert不会尝试合并任何内容:它只是将c1中的父指针重写为tM。由于不涉及合并,因此不会因奇怪的合并冲突而失败。

关于mercurial - 将父级添加到Mercurial中的原始变更集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19215571/

10-15 10:26