你没有向我们提供太多关于正在发生的事情的信息。最好在您的场景中提供更多详细信息以及您收到的确切错误消息。您是否进行了新的结帐?你用什么命令来做你的合并?你有什么版本的 Subversion 客户端和服务器?
否则,我们无法确定您的问题。将主干合并到来自主干的功能分支通常应该没有任何问题。
我的第一个问题是您是如何创建分支的。在 Subversion 中创建分支时,应在 URL 表单中使用 svn copy 创建它:
$ svn copy --parent $REPO/trunk $REPO/branches/feature
我已经看到人们通过svn mkdir 创建一个分支,然后在该分支上复制他们想要的文件,然后在该分支上添加所有这些文件。 Subversion 无法合并这些项目,因为它不知道它们的共享历史。对于 Subversion,它们包含完全不同的文件。它们可能具有相同的名称和相似的内容,但它们是不同的文件。合并是行不通的。
那么,您是这样创建分支的吗?如果是这样,你做得很好。
第二个问题:您是否将功能分支直接从主干分支?这不是必需的,但如果您要合并到的分支不在您要合并的分支之外,则合并会更干净。
第三个问题:您的功能分支是干净的结帐吗? svn status --no-ignore 是否向您展示了什么?你做过svn update吗?确保您的工作副本是干净的可以为您节省很多麻烦。事实上,我建议开发人员尽可能重新结帐。
您的服务器 Subversion 版本和您的客户端 Subversion 1.6 或更高版本。合并跟踪是在 1.5 版中添加的,但它有点成问题。客户端和服务器都应至少为 1.6 版。 (当前版本是1.8,1.9版本快要发布了,所以1.6版本比较老了)。
如果所有这些都是真的,那么合并应该很简单。您检查了 feature 分支。然后,将 trunk 合并到功能分支中。
$ svn co $REPO/branches/feature
$ cd feature
$ svn merge $REPO/trunk
Subversion 合并通常是三方面的事情。您将 trunk 上的内容与功能分支上的内容进行比较,和 这两个版本的最后一个共同祖先的样子。通过在分支发生之前查看原始文件,Subversion 可以知道更改发生在哪个分支上,以及是否应将其视为合并的一部分。
在 Subversion 合并中事情变得有点棘手,因为还会检查目录更改。
在你的场景中,我可以想象这样的事情:
- 在最初的最后一个共同祖先目录中,该文件就在那里。
- 在主干中,文件已被删除。
- 它也已从功能分支中删除,但随后又重新加入。
现在,Subversion 尝试合并。最后一个共同祖先有那个文件。 Subversion 查看主干,发现该文件已被删除。 Subversion 查看分支,发现文件已添加。
所以,Subversion 看到了冲突。自最后一个共同祖先以来,它被添加到功能分支中,但它也被从主干中删除。它应该怎么做?它不能简单地删除文件,因为它是在功能分支中添加的。由于主干和功能分支都发生了变化,因此发生了冲突。
如果您的工作副本中碰巧有一个不在 Subversion 中的文件,也会发生这种情况。 (如数据文件),并且在主干上删除了类似的文件。 Subversion 想删除文件,但不能。这就是为什么从干净签出您要合并的分支开始如此重要的原因。
您也可能有其他原因。很难说。对功能分支进行干净的检查。确保 svn status -no-ignore 不返回任何内容。确保您的工作副本完全是最新的。在上面做一个svn up。
然后,如果您收到错误消息,请向我们提供完整的错误消息。检查你的行李箱,看看它长什么样。同时在您的功能分支工作副本上运行以下两个命令:
$ svn mergeinfo --show-revs eligible $REPO/trunk
$ svn mergeinfo --show-revs merged $REPO/trunk
第一个将显示主干上符合合并条件的修订。第二个将显示之前合并的版本。
然后,查看这些更改的日志,看看是否有任何问题。有时我会在主干和分支上看到错误修复。这是两个独立的版本,但修复了相同的问题,因此修复了此错误的主干修订不应合并到分支中。您可以通过svn merge --record-only -c $rev 将这些修订合并到您的功能分支中,这样 Subversion 就不会再次尝试合并它们。