【问题标题】:Add a parent to the original changeset in Mercurial在 Mercurial 中将父级添加到原始变更集
【发布时间】:2013-10-07 00:35:56
【问题描述】:

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

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

我可以以某种方式在我的初始提交中添加父级吗?

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

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

【问题讨论】:

标签: mercurial


【解决方案1】:

您可以使用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 中的快照。

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

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

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

您的旧提交是 c1cN,来自 tarball 的提交是 t1tM。目前他们没有共享历史记录 - 就好像您使用 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 &gt; splicemap 生成这样的文件。然后运行

$ hg convert --splicemap splicemap . spliced

使用合并的历史生成一个新的存储库spliced。存储库是新的,因此您需要让所有人重新克隆它。

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

【讨论】:

  • 如果您使用 TortoiseHG,生成拼接图文件的一种简单方法是从 Workbench GUI 工具中选择散列。您可以右键单击历史记录中的任何修订,并且有一个选项可以选择所需的确切哈希值,称为## Copy Hash
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 有道理,谢谢。我没有考虑只将它们添加到顶部 - 除了错误的顺序之外,至少将文件历史记录到工具链中,即使制作差异变得有点奇怪。仍然这两种解决方案都不是很理想。
  • @mappu。嗯,hg 也有一个调试模式,它可以给你一些历史的权力。我实际上并没有使用它,所以我不能说该怎么做,或者即使它可以完全完成你想要的。不小心做自己不想做的事也很容易……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多