您可以使用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 中的快照。
在您像上面那样导入所有 tarball 后,您的存储库中有一个并行历史记录:
[c1] --- [c2] --- [c3] ... [cN]
[t1] --- [t2] --- [tM]
您的旧提交是 c1 到 cN,来自 tarball 的提交是 t1 到 tM。目前他们没有共享历史记录 - 就好像您使用 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。由于不涉及合并,因此不会因奇怪的合并冲突而失败。