我在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]
您以前的提交是
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
。由于不涉及合并,因此不会因奇怪的合并冲突而失败。关于mercurial - 将父级添加到Mercurial中的原始变更集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19215571/