Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial中的重租:如何将两个独立的svn克隆重新组合在一起?_Mercurial_Rebase_Reparenting - Fatal编程技术网

Mercurial中的重租:如何将两个独立的svn克隆重新组合在一起?

Mercurial中的重租:如何将两个独立的svn克隆重新组合在一起?,mercurial,rebase,reparenting,Mercurial,Rebase,Reparenting,情况是这样的:开发者Foo从我们的svn回购中创建了一个hg回购。Foo的hg repo只是svn中主干的一个浅克隆(没有svn分支、标签等,历史记录不完整[大约100个变更集])。开发人员Bar也做了同样的事情,但克隆了整个svn repo,包括整个历史、分支、标记等。Foo和Bar都在其存储库上进行了branchy开发 这两个存储库都有一个共同的SVN祖先,但每个hg repo都有不同的版本号。我想将Foo的变化从共同祖先重新移植到Bar的回购协议上。这是我要找的东西的图表: 富氏回购协议:

情况是这样的:开发者Foo从我们的svn回购中创建了一个hg回购。Foo的hg repo只是svn中主干的一个浅克隆(没有svn分支、标签等,历史记录不完整[大约100个变更集])。开发人员Bar也做了同样的事情,但克隆了整个svn repo,包括整个历史、分支、标记等。Foo和Bar都在其存储库上进行了branchy开发

这两个存储库都有一个共同的SVN祖先,但每个hg repo都有不同的版本号。我想将Foo的变化从共同祖先重新移植到Bar的回购协议上。这是我要找的东西的图表:

富氏回购协议:

C'-D'-E-F---G
       \   /
        H-I
大律师公会回购:

...A-B-C-D-J-K---L
            \   /
             M-N
C、 C'和D,D'的内容相同,但版本号和注释不同

目标是:

...A-B-C-D--E-F---G
          \  \   /
           \  H-I
            \
             J-K---L
              \   /
               M-N
关于如何实现这一点,我已经没有主意了。我尝试转换--splicemap splice.map[splice.map文件包含ed](没有执行任何操作)。克隆-f设法把所有的东西都放到一个回购协议中,但它们似乎是独立的树。在克隆-f之后,我尝试了rebase--source E--dest D--detach,但它崩溃了:(

想法

我知道更改历史记录将使任何人对存储库的克隆无效,在这种情况下这不是问题。所有用户都将从这项工作的结果中重新克隆。

您可以使用

  • 将repo
    Foo
    中的每个变更集导入修补程序队列
  • 转到
    repo
  • Bar
    更新为作为公共祖先的变更集
  • 将修补程序队列导入
  • 应用修补程序队列

  • 这将改变所有
    Foo
    补丁的提交ID,但仍然允许您保留整个历史记录并将它们的开发repo合并在一起。

    我们今天在IRC中讨论了这一点,我的建议是将两者拉到同一个repo中,并让它有两个根。头将完全符合您的要求,其余部分实际上不符合您的要求呃

    如果你无法忍受(你想象人们使用历史/指责的次数比实际情况要多),那么我认为你的地图应该有:

    E D
    
    在中,因为您正试图使E的父对象为D(而不是D’)

    已解决!

    一开始我没有注意到的一点是,我假定的共同祖先毕竟并不完全相同。在Foo的repo的svn->hg转换过程中,$ID$字符串被扩展,但不是在Bar的repo的创建过程中。下面的步骤1是创建真正共同祖先的简单修复

    以下步骤使我能够实现我的目标:

    1-确保假定的共同祖先(D和D')实际上是相同的。如果不是,则在棒材回购中为它们创建一个新的拼接点。S应与我的示例中D'的内容完全匹配

    ...A-B-C-D--J-K---L \ \ / S M-N …A-B-C-D--J-K--L \ \ / S M-N 2-修剪Foo回购的历史记录,以删除重复的历史记录,包括D',带有

    hg convert --splicemap TrimSplicemap Foo FooTrimmed hg convert—拼接贴图修剪拼接贴图Foo FooTrimmed 映射内容:(其中E是E的完整散列)

    E 0000000000000000000000000000000000 3-使用hg strip删除断开连接的冗余历史记录

    cd FooTrimmed hg strip C' cd脚框 汞带C' 4-再次使用hg convert将Foo的剥离回购拼接到提交时的Bar回购上

    cd ../Bar hg convert --splicemap FooBarSplicemap ../FooTrimmed . cd../Bar hg convert—拼接贴图foobar拼接贴图../FooTrimmed。 FooMap内容:(其中E'是FooTrimmed中E的新哈希,S是S的哈希)

    E'S
    应该可以了!:D

    是的,ed是正确的,我昨天编辑了图表,没有更新文本。谢谢你指出。回购中有两棵独立的树是我的退路,如果需要的话,准备好解决方案。我认为‘责备’对这两棵树很好……如果这是我们对历史的唯一需要的话恩,我们的状态会很好。听起来不错。记住,你也可以让SVN保持只读。它已经满足你的历史要求多年了,所以让它可用可能会很好地处理它们,直到过渡点。最终人们会停止查阅它,但保留它用于考古是没有成本的我很好用。非常正确,谢谢你帮我把事情放在正确的角度。很容易陷入挑战。问题是合并变更集不能很好地与MQ一起工作,所以在他的例子中,G和l不能适用于他们的父母双方。移植也有同样的问题。当我尝试这一点时,它不会这样做未转换接头映射修订,正在忽略 cd ../Bar hg convert --splicemap FooBarSplicemap ../FooTrimmed . E' S