我在Mercurial存储库中有一个包含24个月源代码控制历史的项目。
我最近发现了一些早于源代码控制的项目的旧tar包,我认为将它们作为“史前”变更集导入存储库会很有用。
我可以以某种方式将父母添加到我的初始提交中吗?
或者,是否可以在tar包之上重新播放整个存储库历史记录,保留所有元数据(时间戳等)?
是否可以让新的父提交使用这些旧tar包的时间戳?
答案 0 :(得分:8)
您可以使用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中存在的快照。
在导入上述所有tar包之后,您的存储库中有一个并行历史记录:
[c1] --- [c2] --- [c3] ... [cN]
[t1] --- [t2] --- [tM]
您的旧提交是c1
到cN
,来自tarball的提交是t1
到tM
。目前他们没有共享历史记录 - 就像你使用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
老实说,我只是将它们添加到你的“现代”回购中,我不认为将它们作为历史记录会给你带来任何明显的优势,而不是将它们添加到顶层。