Svn 如何重新应用以前回滚的变更集

Svn 如何重新应用以前回滚的变更集,svn,merge,Svn,Merge,如何重新应用已回滚到以前版本的变更集?当然,我会使用另一个具有所需修订的合并,但该命令似乎是一个no op-不合并任何内容,svn status显示合并后没有任何更改。我发现唯一的方法就是使用--ignore estority选项,但它似乎并不正确 我尝试做的是以下几点: 存储库处于修订版1000 我们首先创建一个分支branchs/rollback,然后在分支WC中执行svn merge-r HEAD:500,从而执行trunk回滚到修订版500 之后,我们希望重新应用修订版700,我们试图

如何重新应用已回滚到以前版本的变更集?当然,我会使用另一个具有所需修订的合并,但该命令似乎是一个no op-不合并任何内容,
svn status
显示合并后没有任何更改。我发现唯一的方法就是使用
--ignore estority
选项,但它似乎并不正确

我尝试做的是以下几点:

  • 存储库处于修订版
    1000
  • 我们首先创建一个分支
    branchs/rollback
    ,然后在分支WC中执行
    svn merge-r HEAD:500,从而执行
    trunk
    回滚到修订版
    500
  • 之后,我们希望重新应用修订版
    700
    ,我们试图通过执行
    svn merge-c 700^/trunk来完成该修订集。
    ,但该修订集不起作用(实际上:根本不起作用)
  • 如果我们在前面的命令中添加
    --ignore eschority
    选项,它会做我们想做的事情,但感觉不对
  • 之后,我们将分支重新整合回
    主干
    ,使其处于所需状态:回滚版本501-1000,重新应用版本700
有什么想法吗?

您至少有一些方法可以通过单独的分支和仅主干中的一种方式获得所需的结果

分支机构的方式

  • 最接近您的:正确使用cherry pick merge(定义合并源URL-它可以是主干/甚至分支?未测试/)
  • 更多SVN方式:在单个命令中反向合并两个范围(跳过版本700)
  • 自然方式

    在主干中的单个命令(跳过版本700)中反向合并两个范围

    • 存储库的修订版本为1000
    • 我们从主干回滚到修订版500开始,首先创建分支/回滚,然后执行svn merge-r HEAD:500。在分店里
    好吧,我有点不明白。为什么不简单地:

    $ svn cp -r500 $REPO/trunk@500 $REPO/branches/rollback
    
    这将创建一个版本的
    回滚
    分支,该分支与主干中的修订版500相匹配

    • 之后,我们希望重新应用修订版700的变更集,我们试图通过执行
      svn merge-c 700^/trunk
      来完成该变更集,但该变更集不起作用(实际上:根本不起作用)
    如果在回滚分支的工作副本上执行此操作:

    $ svn merge -c 700
    
    如果您的分行工作副本中包含700版。这不起作用的原因是
    svn:mergeinfo
    说修订版700已经在回滚分支中,因此Subversion不会重新应用它
    svn:mergeinfo
    不受反向合并的影响,因此版本501到1000的回滚不会影响
    svn:mergeinfo

    • 如果我们在前面的命令中添加--ignore祖先选项,它会做我们想做的事情,但感觉不对
    以下是《颠覆》一书中关于
    ——忽略祖先的内容:

    --ignore祖先选项阻止合并跟踪,因此忽略mergeinfo,既不考虑也不记录它

    因此,当您使用<代码>--忽略祖先,Subversion将合并修订版700,无论它是否已应用

    • 之后,我们会将分支重新整合回主干,使其处于所需状态:回滚版本501-1000,重新应用版本700
    我不确定重返社会在这一点上会有什么作用。由于回滚分支本身没有真正的更改,因此没有需要集成的内容。回滚分支上的所有更改都是在主干中发生的更改

    以前的情况是,重新整合将进行双向合并,这将迫使主干匹配分支。然而,在Subversion版本1.6或1.7中(我忘了是哪一个版本)已经不推荐重新整合。您试图使用
    --replication
    开关,Subversion会抱怨。我不能说在这种情况下Subversion会做什么

    如果只想回滚主干,请回滚主干:

    $ svn co $REPO/trunk
    $ cd trunk
    $ svn merge -r1000:701 .   # Rolls back revisions 701 to 1000
    $ svn merge -r699:500  .   # Rolls back revisions 500 to 699
    $ svn commit -m" Removed all changes since Rev 500 except 700"
    
    您可以将其自动化一点,并分别回滚和提交每个修订。这样,如果您决定重新应用某个更改,您可以反向合并执行原始反向合并的反向合并修订,然后。。。好的,举个例子:

    for revision in {1000..500}
    do
        [[ $revision -eq 700 ]] && continue  # Skip Revision #700
        svn merge -c -$revision
        svn commit -m "Backing out Revision $revision"
    done
    
    假设您决定现在要将修订版823包含回主干中。执行
    svn日志
    并查看:

    ------------------------------------------------------------------------
    r1230 | mike | ......
    
    Backing out Revision 823
    
    您现在知道,在回购协议中,1230版已从823版中退出。所以

    $ svn merge -c -1230
    
    这将删除修订版1230所做的更改,该修订版正在备份修订版823。因此,在您提交更改后,修订版823现在返回到repo中

    您可以编辑
    svn:mergeinfo
    以使用正确的修订范围对其进行修复。但是,不鼓励手动修改此属性。一个错误,您的合并历史将不再有效


    通常,如果我们发现自己把一切都搞得一团糟,我们只需创建一个分支并使用它。

    我们已经在源URL中使用了cherry picking(问题代码中已修复)。跳过不是一个选项,因为我们希望能够在两者之间进行测试,并且有大约30个修订需要重新应用。还有其他想法吗?