-1

我尝试使用“svn merge”将我的主干更改同步到我的分支中,但 subversion 说每个文件都有冲突。大多数这些文件在主干或分支中都没有更改。我也没有更改目录结构。我究竟做错了什么?

更详细地说,我在我的计算机上的分支中,位于 /Users/steve/myproject/nsvbranch。我输入“svn merge https://myserver.org/users/steve/myproject/trunk ”。那是与nsvbranch相同目录的主干版本;"ls" 在这两种情况下返回相同的文件。服务器需要一点时间,然后绝对列出每个带有“C”的文件。对于他们中的一些人,但不是全部,它问我想如何处理冲突。在几乎所有文件中,包括几个询问我如何处理冲突的文件,自创建分支以来,主干或分支都没有进行任何更改。

我显然犯了一个非常简单的初学者错误,但我似乎无法弄清楚它是什么。谢谢你的帮助!

-史蒂夫

4

3 回答 3

0

最可能的原因是 SVN 错误地选择了要合并的修订范围。

SVN 1.4 版本对合并的支持很弱。如果您要定期合并,我建议您更新 SVN。

如果您决定继续使用 SVN 1.4,则必须在合并时手动指定修订范围。

于 2013-05-27T19:07:07.890 回答
0

谢谢您的帮助。鉴于我无法将服务器颠覆更新到当前版本,我输入了修订号。事实证明,以这种方式合并非常容易。我在日志中查看了创建分支的位置,然后输入了“merge -r2050:2121 https://myserver.org/users/steve/myproject/trunk ”。然后它应该发生了。

-史蒂夫

于 2013-05-29T21:25:44.080 回答
0

您不应该再使用 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参数以查看合并将如何发生而不影响任何事情。

于 2013-05-27T19:53:23.300 回答