将父项添加到Mercurial中的原始变更集

时间:2013-10-07 00:35:57

标签: mercurial

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

我最近发现了一些早于源代码控制的项目的旧tar包,我认为将它们作为“史前”变更集导入存储库会很有用。

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

或者,是否可以在tar包之上重新播放整个存储库历史记录,保留所有元数据(时间戳等)?

是否可以让新的父提交使用这些旧tar包的时间戳?

2 个答案:

答案 0 :(得分:8)

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

首先,根据null修订版

导入tarball
$ 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中存在的快照。

在导入上述所有tar包之后,您的存储库中有一个并行历史记录:

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

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

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

转换扩展程序现在可用于执行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。不同之处在于转换器不会尝试合并任何内容:它只是将c1中的父指针重写为tM。由于不涉及合并,因此不会因为奇怪的合并冲突而失败。

答案 1 :(得分:1)

你应该看看使用rebase。这可以让你在你的仓库中进行第二个变更集的更改(你必须从第一个变更集)。

https://www.mercurial-scm.org/wiki/RebaseExtension

但是,请注意,如果存在此repo的其他克隆(例如对于其他开发人员或在repo服务器上),那么他们将在修改后的回购中遇到问题。您可能需要与这些克隆的所有者协调,以便将所有工作集成到单个克隆中,克隆该rebase,然后让每个人从修订的克隆中重新克隆。您还必须更改变更集的阶段。

https://www.mercurial-scm.org/wiki/Phases

老实说,我只是将它们添加到你的“现代”回购中,我不认为将它们作为历史记录会给你带来任何明显的优势,而不是将它们添加到顶层。