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

Mic*_*per 4 svn merge

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

我尝试做的是以下内容:

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

有任何想法吗?

Dav*_* W. 5

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

好的,我不是在这里理解一些东西.为什么不简单:

$ svn cp -r500 $REPO/trunk@500 $REPO/branches/rollback
Run Code Online (Sandbox Code Playgroud)

这将创建一个rollback与trunk中的版本500匹配的分支版本.

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

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

$ svn merge -c 700
Run Code Online (Sandbox Code Playgroud)

如果在您的分支的工作副本中包含修订版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"
Run Code Online (Sandbox Code Playgroud)

您可以自动执行此操作,并分别回滚和提交每个修订.这样,如果您决定重新应用某个更改,您可以反向合并执行原始反向合并的反向合并修订,并且... ...好的,一个示例:

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
Run Code Online (Sandbox Code Playgroud)

假设你现在决定将版本823包含在主干中.你做了一个svn log看到:

------------------------------------------------------------------------
r1230 | mike | ......

Backing out Revision 823
Run Code Online (Sandbox Code Playgroud)

您现在知道修订版1230已在您的仓库中退出了修订版823.所以...

$ svn merge -c -1230
Run Code Online (Sandbox Code Playgroud)

这将删除修订版1230所做的更改 - 这是对版本823的修订.因此,在您提交更改后,修订版823现在又回到了回购中.

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

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