如何重新应用回滚到先前版本的变更集?自然地,我会使用与所需修订版的另一个合并,但该命令似乎是一个空操作 - 没有任何内容被合并,并且 svn status
合并后显示没有变化。我发现这样做的唯一方法是使用 --ignore-ancestry
选项,但它似乎不正确。
我尝试做的是以下内容:
1000
trunk
开始回滚到修订版 500
通过创建分支 branches/rollback
然后执行 svn merge -r HEAD:500 .
在分行WC700
的变更集,我们尝试通过执行 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/