我尝试使用“svn merge”将我的主干更改同步到我的分支,但是subversion说每个文件都有冲突。大多数这些文件在主干或分支中都没有更改。我也没有改变目录结构。我做错了什么?
更详细地说,我在计算机的分支机构/ Users / steve / myproject / nsvbranch中。我输入“svn merge https://myserver.org/users/steve/myproject/trunk”。这是nsvbranch所在目录的trunk版本; “ls”在两种情况下返回相同的文件。服务器需要一点时间,然后绝对列出每个文件旁边都有一个“C”。对于他们中的一些人,但不是全部,它问我如何处理冲突。在几乎所有的文件中,包括几个文件,它询问我如何处理冲突,自分支机构以来,在主干或分支中都没有进行任何更改。
我显然犯了一个非常简单的初学者错误,但我似乎无法弄清楚它是什么。谢谢你的帮助!
-Steve
答案 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