- 存储库的版本为 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 以使用正确的修订范围对其进行修复。但是,不强烈建议手动修改此属性。一个错误,您的合并历史记录将不再有效。
通常,如果我们发现我们把一切都搞砸了,我们只需创建一个分支并使用它。