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

map*_*ppu 2 mercurial

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

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

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

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

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

Mar*_*ler 8

您可以使用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从压缩包的提交是t1tM.目前他们没有历史记录 - 就像你曾经hg pull -f把一个不相关的存储库拉到当前存储库中一样.

转换的扩展,现在可以用来做水银到您改写父修订水银转换c1tM.使用此--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 rebaseKindread建议的使用.不同之处在于转换器不会尝试合并任何东西:它只是将父指针重写c1tM.由于不涉及合并,因此奇怪的合并冲突不会失败.