您不应该再使用 1.4 版了。Subversion 1.5 中有一个重大变化,将合并跟踪添加到 Subversion。事实上,我很惊讶没有人在您的系统上设置预提交触发器来阻止您提交使用 1.4 版修改的代码。
由于您使用的是 Subversion 1.4,因此可能存在其他问题。例如,您无法分辨哪些已合并,哪些未合并。在 1.5 之前的 Subversion 中,您需要指定要合并的所有修订。手动。最好的方法可能是查找属性svn:mergeinfo
并查看合并的内容:
$ svn propget -R svn:mergeinfo .
这将打印出所有合并以及合并了哪些修订。您可以使用它来确定需要合并哪些修订。例如,如果您看到您正在使用修订版 2300,并且 svn:mergeinfo 说修订版 1230-2298 已经从该分支合并,您需要指定您想要将修订版 2299 合并到 2300:
$ svn merge -r2299:2300 $REPO/$branch/$project
完成此操作后,您需要svn:mergeinfo
使用最新的合并进行更新:
$ svn pe svn:mergeinfo . #And all files/directories where this is set
另一种可能性是有人删除并重新创建了分支/主干。想象一下有人这样做:
$ svn co $REPO/trunk/foo
A foo/bar.txt
A foo/foo.txt
$ cd foo
$ svn delete bar.txt
$ svn commit -m"Deleted bar.txt"
$ svn up
$ vi bar.txt
$ svn add bar.txt
$ svn commit -m"Added bar.txt back in"
在你凡人的眼里,你认为$REPO/trunk/foo/bar.txt
这两个版本都是一样的。毕竟,他们都有 URL $REPO/trunk/foo/bar.txt
。对于 Subversion,这两个bar.txt
是两个完全不同的文件,没有任何共同之处。如果有人进行了更改$REPO/branches/1.2/foo/bar.txt
并且您尝试合并此更改,您将遇到合并冲突。实际上,合并冲突会告诉您本地添加妨碍了更新。
我看到很多地方决定主干需要匹配一个分支,他们删除了主干,并从分支复制了文件。事实上,我见过这样的:
$ svn delete -m"Who needs trunk?" $REPO/trunk #Delete trunk
$ svn add -m"Making a real mess of things" $REPO/trunk #Add a new trunk
$ svn co $REPO/trunk # Check out the now empty trunk
$ cd trunk
$ cp -R $work/branches/1.4 . #Copy a branch 1.4 working directory to trunk
$ svn add . #Now add all of those files back in
$ svn commit -m"A trunk with files that aren't related to anything!"
在这种情况下,开发人员不仅删除了主干,而且他们只是创建了一个新的空主干,将文件复制到 Subversion 背后,然后将它们读回。主干中的每个文件都与您的存储库中的任何文件完全无关即使他们共享相似的 URL。在这种情况下,他们还想知道为什么不能从分支合并回主干。毕竟,那是文件的来源?
如果这样做了,你基本上是在一个相当腐烂的河口,没有任何推进装置。
我可以添加的唯一建议是尝试svn merge --ignore-ancestory
。我还建议您尝试该--dry-run
参数以查看合并将如何发生而不影响任何事情。