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

时间:2014-12-21 18:54:53

标签: svn merge

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

我尝试做的是以下内容:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

  
      
  • 存储库位于修订版1000
  •   
  • 我们首先通过创建分支分支/回滚然后执行svn merge -r HEAD:500来回滚到版本500。在分行WC
  •   

好的,我在这里不懂东西。为什么不简单:

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

这将创建rollback分支的版本,该版本与trunk的版本500匹配。

  
      
  • 之后我们想重新应用修订版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选项可以防止合并跟踪,从而忽略mergeinfo,既不考虑也不记录它。

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

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

我不确定重返社会会在这一点上做什么。 集成没有任何内容,因为回滚分支本身没有真正的变化。回滚分支上的所有更改都是在主干中发生的更改。

重要的是,重新整合将进行双向合并,这将迫使主干与分支匹配。但是,Subversion版本1.6或1.7中已经弃用了重新集成(我忘记了)。您尝试使用--reintegration开关,Subversion会抱怨。我不能说Subversion在这种情况下会做什么。

如果你只想回滚trunk,rollback trunk:

$ 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以使用正确的修订范围对其进行修复。但是,不强烈建议手动修改此属性。一个错误,您的合并历史将不再有效。

通常情况下,如果我们发现我们已经把所有事情搞糟了,我们只需要制作一个分支并使用它。

答案 1 :(得分:1)

你至少某些方式在just-trunk中有单独的分支和1路需要的结果

分行方式

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

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