【问题标题】:Add additional changesets prior to changeset 0 (zero)?在变更集 0(零)之前添加其他变更集?
【发布时间】:2012-03-23 12:04:13
【问题描述】:

我有一个 Hg 存储库,其中变更集 0 仅表示“添加 .hgignore”。从变更集 1 开始,我通过脚本从多个 Subversion 修订版中逐步添加变更集。然后我和 Hg 一起工作了一段时间。

现在我决定需要更多的 Svn 修订,这些修订在历史上比最初的修订更早(Hg 中的变更集 1)。

是否可以在 0 和 1 之间插入新的变更集?如果是:如何?

【问题讨论】:

    标签: svn version-control mercurial dvcs


    【解决方案1】:

    您可以为此使用 Mercurial 到 Mercurial 转换。您需要为此启用convert extension。作为转换的一部分,该扩展程序可让您将历史拼接在一起。这仅仅意味着您可以为现有变更集指定新父项。

    所以如果你从

    开始
    $ hg glog
    @  changeset:   1:aaee9686dedf
    |  tag:         tip
    |  user:        Martin Geisler <mg@lazybytes.net>
    |  date:        Fri Mar 23 15:08:11 2012 +0100
    |  summary:     bar
    |
    o  changeset:   0:17474bd28fe5
       user:        Martin Geisler <mg@lazybytes.net>
       date:        Fri Mar 23 15:08:05 2012 +0100
       summary:     foo
    

    您可以先从 SVN 导入所需的修订:

    $ hg update null
    $ run-your-script.sh
    

    这将创建第二个根变更集 - 现在您的存储库中实际上有两个不相交的历史记录。我做了一个变更集,在其中添加了一个 baz 文件:

    $ hg glog
    @  changeset:   2:515e1292862b
       tag:         tip
       parent:      -1:000000000000
       user:        Martin Geisler <mg@lazybytes.net>
       date:        Fri Mar 23 15:09:19 2012 +0100
       summary:     baz
    
    o  changeset:   1:aaee9686dedf
    |  user:        Martin Geisler <mg@lazybytes.net>
    |  date:        Fri Mar 23 15:08:11 2012 +0100
    |  summary:     bar
    |
    o  changeset:   0:17474bd28fe5
       user:        Martin Geisler <mg@lazybytes.net>
       date:        Fri Mar 23 15:08:05 2012 +0100
       summary:     foo
    

    最后一步是将历史链接在一起:我们希望 17474bd28fe5 将 515e1292862b 作为其第一个父节点。使用 hg log --debug 查看完整的变更集哈希并使用

    制作切片映射文件
    17474bd28fe535c15c7dad3659994ab048146e99 515e1292862ba2d6776294ffb00c533dc6850c66
    

    然后运行

     $ hg convert --splicemap map.txt your-repo your-spliced-repo
    

    您将在your-spliced-repo 中找到修改后的历史记录。

    【讨论】:

    • 感谢马丁的详细回答!这很好用,但最后一步不起作用。 Hg convert 告诉我它找不到特定文件(作为大文件添加;大文件扩展名在用户级别启用)。
    • @ChristophJüngling:啊哈,这是一个大文件?这有很大的不同——大文件扩展是一个非常具有侵入性的扩展。恐怕hg convert 不知道大文件。当您想要重命名/包含/排除 foo/bar 时,请尝试重命名 .hglf/foo/bar。也就是说,对替代文件而不是您在工作副本中看到的文件进行操作。
    • 再次感谢。我在hg convert --splicamap ... 之前尝试过hg lfconvert --to-normal,然后就可以了!
    • @ChristophJüngling:太棒了!我没想过先转换回正常的回购。我很高兴你能成功。
    • Martin,可以公平地说,使用 splicemap 与hg rebase 基本相同,只是在 splicemap 情况下操作的来源没有改变?
    【解决方案2】:

    如被问及:是的,您可以

    我看到至少 3 种方法可以做到这一点。全部 - 带有扩展名

    将一组修订导入到提示中,导入后使用任何一个

    • 变基(rebase -s tip -d X 用于每个可移动修订,N 个操作用于 N 个修订)
    • Histedit(从 start-revision 编辑,在编辑器窗口中重新排序修订,N 个修订需要 1 次操作)
    • MQ(选择所有修订版,导入到 MQ,在补丁堆栈中重新排序修订版,根据需要编辑内容,完成所有修订版,N 个修订版的 N+2 操作)

    我更喜欢 MQ 作为最强大的选择(在 MQ 内部,我将能够完善以前的变更集以消除冲突和/或以更好的方式拆分变更)

    【讨论】:

    • 很好!请给我解释一下这三种方法好吗? :-)
    • @ChristophJüngling - 添加到 cmets 的回答中
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2012-07-11
    相关资源
    最近更新 更多