【问题标题】:How to reapply changeset that was rolled back before如何重新应用之前回滚的变更集
【发布时间】:2014-12-21 18:54:52
【问题描述】:

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

我尝试做的是:

  • 存储库的修订版为1000
  • 我们从trunk 回滚到修订版500 开始,创建一个分支branches/rollback,然后在分支WC 中执行svn merge -r HEAD:500 .
  • 之后我们想重新应用修订版700 的变更集,我们尝试通过执行svn merge -c 700 ^/trunk . 来完成,但它不起作用(实际上:什么都不做)
  • 如果我们在前面的命令中添加--ignore-ancestry 选项,它会执行我们想要的操作,但感觉不对。
  • 之后,我们会将分支重新集成回 trunk 以使其处于所需状态:回滚修订版 501-1000,重新应用修订版 700。

有什么想法吗?

【问题讨论】:

    标签: svn merge


    【解决方案1】:
    • 存储库的版本为 1000
    • 我们从主干回滚到修订版 500 开始,创建一个分支分支/回滚,然后执行 svn merge -r HEAD:500 。在分公司 WC

    好的,我不明白这里的一些东西。为什么不简单:

    $ svn cp -r500 $REPO/trunk@500 $REPO/branches/rollback
    

    这将创建一个与主干修订版 500 匹配的 rollback 分支版本。

    • 之后我们想重新应用修订版 700 的变更集,我们尝试通过执行 svn merge -c 700 ^/trunk 来完成,但它不起作用(实际上:什么都不做)

    如果您在回滚分支的工作副本上执行此操作:

    $ svn merge -c 700
    

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

    • 如果我们在前面的命令中添加 --ignore-ancestry 选项,它会执行我们想要的操作,但感觉不对。

    这是 Subversion 书中关于--ignore-ancestry 的内容:

    --ignore-ancestry 选项阻止合并跟踪,因此忽略合并信息,既不考虑也不记录。

    因此,当您使用--ignore-ancestry 时,Subversion 会合并修订版 700,无论它是否已被应用。

    • 之后,我们会将分支重新集成回主干,使其处于所需状态:回滚修订版 501-1000,重新应用修订版 700。

    目前我不确定重新整合会起到什么作用。没有什么可以集成,因为回滚分支本身并没有真正的变化。回滚分支上的所有更改都是在主干中发生的更改。

    过去,重新集成会进行双向合并,这将强制主干与分支匹配。但是,重新集成在 Subversion 1.6 或 1.7 版本中已被弃用(我忘了是哪个)。你尝试使用--reintegration 开关,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 log 看看:

    ------------------------------------------------------------------------
    r1230 | mike | ......
    
    Backing out Revision 823
    

    您现在知道版本 1230 已在您的存储库中退出了版本 823。所以...

    $ svn merge -c -1230
    

    这将删除修订版 1230 所做的更改,即撤销修订版 823。因此,在您提交更改后,修订版 823 现在又回到了存储库中。

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

    通常,如果我们发现我们把一切都搞砸了,我们只需创建一个分支并使用它。

    【讨论】:

      【解决方案2】:

      您至少有 一些方法 需要使用单独的分支和 1 种方式在 just-trunk 中的结果

      分行之道

      1. 离您最近:正确使用cherry-pick 合并(定义合并源 URL - 它可以是主干/甚至是分支?未经测试/)
      2. 更多 SVN 方式:在单个命令中反向合并两个范围(跳过 rev.700)

      自然方式

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

      【讨论】:

      • 我们已经使用带有源 URL 的樱桃采摘(固定在问题代码中)。跳过不是一个选项,因为我们希望能够在两者之间进行测试,并且有大约 30 个修订版需要重新应用。还有其他想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2014-04-24
      • 2011-05-04
      相关资源
      最近更新 更多