svn - 如何重新应用之前回滚的变更集

标签 svn merge

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

我尝试做的是以下内容:

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

  • 有任何想法吗?

    最佳答案

    • The repository is at revision 1000
    • We begin with the trunk rollback to revision 500 by creating a branch branches/rollback and then executing svn merge -r HEAD:500 . in the branch WC


    好吧,我不明白这里的东西。为什么不简单:
    $ svn cp -r500 $REPO/trunk@500 $REPO/branches/rollback
    

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

    • Afterwards we would like to reapply the changeset of revision 700, which we try to accomplish by executing svn merge -c 700 ^/trunk, which does not work (actually: does nothing at all)


    如果您在回滚分支的工作副本上执行此操作:
    $ svn merge -c 700
    

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

    • If we add the --ignore-ancestry option to the previous command, it does what we want, but does not feel right.


    以下是 Subversion 书中关于 --ignore-ancestry 的说明:

    The --ignore-ancestry option prevents merge tracking and thus ignores mergeinfo, neither considering it nor recording it.



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

    • Afterwards, we would reintegrate the branch back to the trunk to have it in the needed state: revisions 501-1000 rolled back, revision 700 reapplied.


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

    过去,重新集成会进行双向合并,这将强制主干与分支匹配。但是,在 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以正确的修订范围修复它。但是,不鼓励手动修改此属性。一个错误,您的合并历史将不再有效。

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

    关于svn - 如何重新应用之前回滚的变更集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592640/

    相关文章:

    linux - 防止 svn 提交,命令行

    java - 如何合并几个列表?

    R根据具有添加条件的特定列合并两个数据集

    git - TFS Git - pull 请求 'Merge failed'

    tsql - MERGE - 条件 "WHEN MATCHED"输出

    svn - 在 Subversion 1.5 中将分支重新集成到主干时出现缺少范围错误消息

    svn - 从 ClearCase 迁移到 SVN/Mercurial

    svn - 为所有存储库添加颠覆提交 Hook

    svn - 如何使用 AnkhSVN 2.x 更改存储库 url

    ios - Xcode 10 不支持 Subversion **[SVN]**