我正在使用TortoiseSVN合并到 branch-B 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
TL; DR:当在其中一个分支中重命名包含文件夹时,如何在两个分支之间干净地合并文件修订?
答案 0 :(得分:8)
没有真正的 clean 方法来解决Subversion中的结构树冲突。基本上,您需要做的是:
trunk
合并到branch-B
工作副本file1
中创建对file2
和branch-B
的更改的差异,并将其应用于新合并的{{1}中的相应文件目录Folder1-Renamed
目录抱歉,使用svn并不容易。我非常喜欢将Subversion用于某些类型的团队设置,但树冲突的噩梦(以及他们的神秘和容易出错的解析机制)经常让我们想哭(并转而使用git)。
答案 1 :(得分: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'