gpt4 book ai didi

mercurial - 在 Mercurial 中将父级添加到原始变更集

转载 作者:行者123 更新时间:2023-12-03 08:05:53 25 4
gpt4 key购买 nike

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

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

我能否以某种方式向我的初始提交添加父项?

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

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

最佳答案

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

像上面一样导入所有压缩包后,您的存储库中就有了平行历史:

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

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

您的旧提交是 c1cN,压缩包中的提交是 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 > splicemap 生成这样的文件。然后运行

$ hg convert --splicemap splicemap . spliced

用 merge 的历史生成一个新的存储库拼接。存储库是新的,因此您需要让每个人重新克隆它。

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

关于mercurial - 在 Mercurial 中将父级添加到原始变更集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com