2

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

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

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

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

是否可以让新的父提交使用这些旧 tarball 的时间戳?

4

2 回答 2

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'

我在上面使用addremove让 Mercurial 有机会检测每个 tarball 之间的重命名(查看--similarity标志以微调它并hg rename --after手动使用以进一步帮助 Mercurial)。此外,我在导入新的 tarball 之前删除了工作副本中的所有文件:这样下一次提交将包含您解压缩的 tarball 中存在的快照。

像上面一样导入所有 tarball 后,您的存储库中有一个并行历史记录:

[c1] --- [c2] --- [c3] ... [cN]

[t1] --- [t2] --- [tM]

您的旧提交是c1tocN并且来自 tarball 的提交是t1to tM。目前他们没有共享历史——就好像你曾经hg pull -f将一个不相关的存储库拉到当前的存储库中一样。

convert 扩展现在可用于执行 Mercurial 到 Mercurial 的转换,您可以在其中重写c1to be的父版本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具有组合历史记录的新存储库。该存储库是新的,因此您需要让每个人都重新克隆它。

这种技术类似于hg rebaseKindread 建议的使用方法。不同之处在于 convert 不会尝试合并任何东西:它只是将父指针重写c1为 be tM。由于不涉及合并,因此不会因奇怪的合并冲突而失败。

于 2013-10-07T06:52:41.060 回答
1

你应该看看使用变基。这可以让您将更改作为您的 repo 上的第二个变更集(您必须从第一个变基)。

https://www.mercurial-scm.org/wiki/RebaseExtension

但是,请注意,如果存在此 repo 的其他克隆(例如对于其他开发人员,或在 repo 服务器上),您将在他们拉取修订后的 repo 时遇到问题。您可能必须与那些克隆的所有者协调,以将所有工作集中到一个克隆中,重新设置该克隆的基础,然后让每个人都从修改后的克隆中重新克隆。您还必须更改变更集的阶段。

https://www.mercurial-scm.org/wiki/Phases

不过老实说,我只是将它们添加到您的“现代”存储库中,我不认为将它们设为史前会比将它们添加到顶部给您带来任何显着的优势。

于 2013-10-07T05:34:48.023 回答