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



我正在使用TortoiseSVN将trunk的最新更改合并到branch-B中,包括文件夹重命名。

在此之前,我将分支A重新整合到主干中。在该分支中,一个文件夹已被重命名,并对其中的文件进行了更改。branch-B包含对这些文件的不同修订,但该文件夹仍具有原始名称。

当将trunk合并到branch-B时,SVN只需将重命名的文件夹添加为新文件夹,并报告原始命名文件夹上的树冲突。文件修订本身从未合并,我只剩下两个文件夹。我尝试了多种选项来获得尽可能干净的合并,同时保留了所有适当的svn:merginfo,但似乎都不起作用。

有人知道如何干净地完成合并吗?

TortoiseSVN 1.8.10,子版本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

TL;DR:当其中一个分支中的包含文件夹被重命名时,我如何在两个分支之间干净地合并文件修订?

在Subversion中,没有真正干净的方法来解决这样的结构树冲突。基本上,你需要做的是:

  • trunk合并为branch-B工作副本
  • 手动branch-B中创建对file1file2的更改的差异,并将它们应用于新合并的Folder1-Renamed目录中的相应文件
  • 删除现已废弃的Folder1目录
  • 确保一切正常
  • 接受当前状态为正确状态(另请参阅http://svnbook.red-bean.com/nightly/en/svn.tour.treeconflicts.html)
  • 提交

抱歉,使用svn不会比这更容易。我非常喜欢在某些类型的团队设置中使用Subversion,但树冲突的噩梦(及其神秘且容易出错的解决机制)经常让我们想哭(并永远改用git)。

您可以通过这种方式在命令行上执行此操作。等效步骤应适用于TortoiseSVN或其他客户端。

假设重命名是在主干中的修订版1000中完成的,您正在将主干合并到Branch-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'

最新更新