我做了些蠢事。我已经将trunk合并到我的分支中进行同步并提交,然后将我的分支合并到trunk而不使用-reintegrate选项并提交。当然我的分支仍处于开发过程中,我需要它,但我得到了
svn:E195016 ...只有先前通过“http://some.pl/trunk”将修订版x合并到重新整合来源时才能使用重新整合,但事实并非如此 缺少范围...
不幸的是,干线从那时开始,所以我的分支机构不是最新的。
解决问题的最佳解决方案是什么?
答案 0 :(得分:1)
你只是那样做了吗?如果是这样,您可以使用svn merge
取消合并您的更改。我们假设你在版本1234中合并了分支到主干:
$ svn co $repo/trunk
$ cd $trunk
$ svn merge -c -1234 . # Removes the merge that took place in revision 1234
让我们了解当您将trunk合并到分支并分支回trunk时会发生什么:
当您将trunk合并到分支时,您正在进行三点合并。也就是说,您正在查看两个开发流的分支,主干和最近的共同祖先(MRCA)。您不仅要查看分支和主干上文件之间的差异,还要查看与最新共同祖先相比发生在主干上的更改。我不希望主干和分支匹配,我希望从MRCA到主干的更改被应用,并忽略从MRCA到该分支尖端的变化。
Subversion使用svn:mergeinfo
来跟踪从主干中合并到您的分支中的内容。它可以使用它来确定您不再需要进入分支的更改。这样,您的分支机构可能已经更改了先前合并的内容,并且您不想从主干重新导入。
现在,让我们看看从分支合并回主干。如果我看着后备箱,我看到我的分支中没有任何东西被合并到后备箱中。毕竟,我刚刚进行了trunk->分支合并。如果我进行了标准合并,将考虑在我的分支上发生的所有更改。
这甚至包括我在trunk上做的更改,然后合并到我的分支。毕竟,Subversion没有真正了解这一点的方法。在主干上没有显示此合并的内容。
但是,我通常希望我的主干和分支在这一点上达成一致。 (假设我在重新整合之前从主干到分支进行了最终合并)。因此,您希望进行两点合并:您希望将分支版本与主干进行比较,并且在合并之后,主干上的版本应该与它在分支上的版本相同。
在旧版本的Subversion中,这就是--reintegrate
参数的作用。它迫使Subversion使用两点合并而不是三点合并。但是,较新版本的Subversion现在可以自动了解何时进行重新集成合并。
那么,重新整合后分支的问题是什么?
svn:mergeinfo
表示从主干到版本100的所有修订都已合并到您的主干中。现在,让您的分支机构上的结帐修订版102,并进行合并。那svn:mergeinfo
说什么?它说从主干到版本99的所有修订都已合并到我的分支中。 Subversion会做什么?它希望将修订版100,101和102中的更改合并到您的分支中。
但等一下!修订版100没有发生在主干上。它发生在分支上。没关系。修订版102包括您在分支上所需的更改。但是,修订版101是您从分支机构返回到主干的合并。 Subversion将尝试合并我最初在我的分支上执行的所有更改,并合并到trunk 回到我的分支上!这不好。
怎么办?有两种解决方案:
最简单的方法是删除分支并重新创建分支。毕竟,在你进行重新整合合并的时候,你的分支和主干应该是相同的。从理论上讲,这没有什么不妥。但是,您将失去分支机构的历史。
您可以做的另一件事是让Subversion认为您已将修订版101中的更改合并到您的分支上,而不实际进行合并。您可以通过自己编辑svn:mergeinfo
来完成此操作,但这可能有点容易出错。
更好的方法是在合并中使用--record-only
选项:
$ svn co REPO/branch/1.2
$ cd 1.2
$ svn merge -r101 --record-only $REPO/trunk
$ svn commit -m"Rev 101 was my reintegration merge from 1.2->trunk"
一切都好。现在,当我尝试进行合并时,Subversion会将主干上的修订版102合并到我的分支中,而不是我的重新整合版本。
事实上,如果我在重新整合合并后立即进行--record-only
合并,我本可以这样做:
$ cd 1.2
$ svn merge --record-only $REPO/trunk
那是因为所有其他修订 - 除了我的重新整合合并 - 已经在分支机构上了。我所做的就是更新svn:mergeinfo
以包含来自主干的修订版101.
所以,对于你的第一个错误,它可能没问题。检查主干和你的分支是否同意。正如我所说的,Subversion的新版本明白,从分支到主干的合并应该是重新整合合并 - 即使你没有包含--reintegration
参数。如果没有,你可能需要做更多工作来解决这个问题。
对于您的第二个错误,请从主干到分支进行--record-only
合并以更新svn:mergeinfo
。如果你不能,你可能需要手动munge svn:mergeinfo
。使用svn propedit
并不困难,您可以在您喜欢的编辑器中编辑该属性。 svn:mergeinfo
的格式非常明显,因此添加额外的修订并不困难。
永远记住。这是版本控制。没有任何东西永久损坏。您始终可以返回到存储库的早期版本,然后重试。你得到的最糟糕的事情就是记录你的顽固方式永久铭刻在svn log
。
如果那是你生命中发生过的最糟糕的事情,那么你就会在这个多岩石的小星球上过着幸福的生活。