移动源代码文件的SVN合并

15

我觉得我的SVN使用案例非常简单:

  • 我有一个文件Test.java在SVN的trunk目录中。
  • 我将trunk分支到dev-branch
  • 我将Test.java移动到trunkcom/mycompany文件夹中。
  • 我在dev-branch中更改Test.java
  • 我将dev-branch合并到trunk
  • 导致树冲突。

为什么SVN不能处理这个问题?我们做错了什么吗?这感觉应该很容易,但是我公司的每个工程师都被卡住了。

在此寻求与SVN相关的答案(不要回答“转移到Git”等)。


在执行合并操作之前,尝试在dev-branch上执行SVN更新。 - Gilbert Le Blanc
我正在使用以下标注将dev分支合并到主干:svn merge url-of-dev-branch -r rev1:rev2 . - Josh Harness
如果你的意思是在主干上进行svn更新,我已经完成了。 - Josh Harness
1
为什么这会有帮助呢?我正在将分支合并到主干。分支是一个远程URL,因此根据定义应该是最新的。我唯一拥有的本地文件夹是主干,并且在执行合并之前,我确保它是最新的。 - Josh Harness
1
我认为@GilbertLeBlanc的意思是先将主干合并到分支,这听起来就像完全相同的问题——只不过顺序颠倒了。 - David Harkness
显示剩余3条评论
2个回答

8
在SVN中,移动操作是删除和添加的组合。当你在分支中进行合并时,它会执行您的移动中的添加部分,但由于冲突无法执行删除操作。因此,您现在需要手动解决冲突,具体步骤如下:
  1. Test.java复制到com/mycompany/Test.java,覆盖旧文件。这样可以解决与该文件的冲突。
  2. 从旧位置删除Test.java文件,这是SVN在合并时无法执行删除的手动方式。使用svn delete Test.java命令。
  3. 使用svn resolve --accept working .命令告诉SVN冲突已经解决,并且您的工作目录正确。最后的“.”表示当前目录。
  4. 使用svn resolve --accept working Test.java命令告诉SVN Test.java文件的冲突也已解决。
完成上述步骤后,您就可以提交合并后的版本,使其与代码库同步。

今天我们在谈话中的一位工程师指出了这个问题。 这很不幸。 当然,这个问题并非棘手无解。 在svn中是否有计划支持真正的svn移动,而不是采用删除和添加的实现方式? - Josh Harness
9
无望了。来自SVN文档的描述:‘通常需要重构源代码,特别是在基于Java的软件项目中。文件和目录被重新排列和重命名,这经常会对所有参与该项目的人造成巨大的干扰。听起来完美的情况下,使用分支就可以解决问题了,对吧?只需创建一个分支,重新排列文件和目录,然后将分支合并回主干就好了,对吗?然而,遗憾的是,这种情况现在不能很好地实现,被认为是Subversion目前的一个弱点。’ - Josh Harness
实际上,mvcprm 的组合。 - aerkenemesis

0
在 SVN 1.14 中,这个合并应该可以正常工作。SVN 将能够检测到 trunk 中移动的文件夹。因此,简单地进行合并就可以了。
但如果不是这种情况,另一种选择就是先将 trunk 的“树变更”合并到分支中,然后再将分支合并回 trunk。所以基本上你需要将分支与 trunk 中最新的更改对齐(这样文件夹就会被创建,文件也会被移动到其中),然后才能合并回 trunk。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接