合并重命名文件夹时出现SVN树冲突

12

我正在使用TortoiseSVN将最新的更改(包括文件夹重命名)从trunk合并到branch-B。在此之前,我已将branch-A重新集成到了trunk中。在branch-A中,一个文件夹已被重命名,并对其中的文件进行了更改。Branch-B包含与这些文件不同的修订版本,但该文件夹仍具有原始名称。

当将trunk合并到branch-B时,SVN会将重命名后的文件夹添加为新文件夹,并报告原始命名文件夹上的树冲突。文件修订本身从未被合并,因此我保留了两个文件夹。我尝试了多种选项来获得最干净的合并结果,同时保留所有适当的svn:mergeinfo,但没有任何有效的解决方法。

是否有人知道完成此清晰合并的正确方法?

TortoiseSVN 1.8.10,Subversion 1.8.11

这是一个可视化的示例:

/trunk (before reintegrating branch-A)
  /Folder1
    file1
    file2
    file3

/trunk (after reintegrating branch-A)
  /Folder1-Renamed
    file1-change1
    file2-change1
    file3

/branch-B
  /Folder1
    file1-change2
    file2-change2
    file3

简而言之:当包含文件夹在其中一条分支中被重命名时,如何在两个分支之间干净地合并文件修订版?


啊,抱歉。TortoiseSVN 1.8.10,Subversion 1.8.11。@bahrep - plwalsh88
2个回答

10
在Subversion中,没有真正“干净”的方式来解决结构树冲突。基本上,您需要执行以下操作:
  • trunk 合并到 branch-B 工作副本中
  • 手动创建 branch-B file1 file2 更改的差异,并将其应用于新合并的 Folder1-Renamed 目录中的相应文件
  • 删除现在已过时的 Folder1 目录
  • 确保一切仍然正常工作
  • 接受当前状态为正确状态(也请参见 http://svnbook.red-bean.com/nightly/en/svn.tour.treeconflicts.html
  • 提交
很抱歉,在svn中没有比这更简单的方法了。我非常喜欢在某些团队设置中使用Subversion,但是树冲突的噩梦(以及它们晦涩且容易出错的解决机制)经常让我想哭(并彻底转向git)。

看起来那个过程解决了问题。感谢你为我详细说明! - plwalsh88
每个人都转向Git是有原因的。 - Martin

0

你可以通过命令行这样做。相应的步骤也适用于TortoiseSVN或其他客户端。

假设重命名是在主干的1000个版本中完成的,而你正在将主干合并到分支B:

# merge everything before the rename
svn merge ^/trunk@999
svn commit -m 'merge from trunk up to 999'
svn update

# merge everything starting with the rename
svn merge ^/trunk
# for tree conflicts on directories, accept the incoming deletion, and make note of the path

# for each tree conflict, take your changes to the old folder,
# and re-apply them to the new folder using a two-URL merge,
# then delete the unnecessary mergeinfo.
# e.g. for Folder1 vs Folder1-renamed:
svn merge ^/trunk/Folder1@999 ^/branches/Branch-B/Folder1 ./Folder1-renamed
svn propdel svn:mergeinfo ./Folder1-renamed

svn commit -m 'merge from trunk'

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