我在Mercurial存储库中有一个包含24个月源代码控制历史的项目.
我最近发现了一些早于源代码控制的项目的旧tar包,我认为将它们作为"史前"变更集导入存储库会很有用.
我能以某种方式将父母添加到我的初始提交中吗?
或者,是否可以在tar包之上重新播放我的整个存储库历史记录,保留所有元数据(时间戳等)?
是否有可能让新的父提交使用这些旧tar包的时间戳?
您可以使用convert扩展来构建一个新的存储库,其中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'
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的addremove让Mercurial有机会检测每个tarball之间的重命名(查看--similarity
标志以对其进行微调并hg rename --after
手动使用以帮助Mercurial进一步).此外,我在导入新的tarball之前删除了工作副本中的所有文件:这样下一次提交将包含您解压缩的tarball中存在的快照.
在导入上述所有tar包之后,您的存储库中有一个并行历史记录:
[c1] --- [c2] --- [c3] ... [cN]
[t1] --- [t2] --- [tM]
Run Code Online (Sandbox Code Playgroud)
您的旧提交的c1
,以cN
从压缩包的提交是t1
来tM
.目前他们没有历史记录 - 就像你曾经hg pull -f
把一个不相关的存储库拉到当前存储库中一样.
转换的扩展,现在可以用来做水银到您改写父修订水银转换c1
为tM
.使用此--splicemap
标志.它需要一个文件
<full changeset hash for c1> <full changeset hash for tM>
Run Code Online (Sandbox Code Playgroud)
使用hg log --template '{node} ' -r c1 -r tM > splicemap
产生这样的文件.然后跑
$ hg convert --splicemap splicemap . spliced
Run Code Online (Sandbox Code Playgroud)
生成spliced
具有组合历史记录的新存储库.存储库是新的,因此您需要让每个人重新克隆它.
该技术类似于hg rebase
Kindread建议的使用.不同之处在于转换器不会尝试合并任何东西:它只是将父指针重写c1
为tM
.由于不涉及合并,因此奇怪的合并冲突不会失败.