我正在使用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
中创建对file1
和file2
的更改的差异,并将它们应用于新合并的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'