svn merge说绝对一切都有冲突

时间:2013-05-24 23:13:51

标签: svn

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

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

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

-Steve

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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在两个版本中是相同的。毕竟,他们都有网址$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!"

在这种情况下,开发人员不仅删除了trunk,而且还创建了一个新的空主干,将文件复制到Subversion后面的文件中,然后重新读回来。中继中的每个文件都与任何文件完全无关在您的存储库中,即使它们共享相似的URL。在这种情况下,他们还想知道为什么他们无法从分支机构合并回主干。毕竟,那是文件来自哪里?

如果这样做了,你基本上是一个相当腐烂的河口,没有任何推进力。

我可以添加的唯一建议是尝试svn merge --ignore-ancestory。我还建议您尝试使用--dry-run参数来查看合并将如何发生而不会影响任何内容。

答案 2 :(得分:0)

感谢您的帮助。鉴于我无法将服务器subversion更新为当前版本,我输入了修订号。事实证明,合并很简单。我回头查看日志以找到分支的位置,然后输入“merge -r2050:2121 https://myserver.org/users/steve/myproject/trunk”。然后它就应该发生了。

-Steve