合并重命名的文件夹时 SVN 树冲突
SVN tree conflict when merging renamed folder
我正在使用 TortoiseSVN 将来自 trunk 的最新更改合并到 branch-B,包括文件夹重命名。
在此之前,我将branch-A重新整合到trunk中。在该分支中,一个文件夹已被重命名并且对其中的文件进行了更改。 Branch-B 包含对这些文件的不同修订,但文件夹仍具有原始名称。
将trunk合并到branch-B时,SVN只是将重命名的文件夹添加为新的,并报告原来的树冲突命名的文件夹。文件修订本身永远不会合并,我只剩下两个文件夹。我已经尝试了多个选项来获得尽可能干净的合并,同时保留所有适当的 svn:mergeinfo,但似乎没有任何效果。
有人知道彻底完成合并的正确方法吗?
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'
我正在使用 TortoiseSVN 将来自 trunk 的最新更改合并到 branch-B,包括文件夹重命名。
在此之前,我将branch-A重新整合到trunk中。在该分支中,一个文件夹已被重命名并且对其中的文件进行了更改。 Branch-B 包含对这些文件的不同修订,但文件夹仍具有原始名称。
将trunk合并到branch-B时,SVN只是将重命名的文件夹添加为新的,并报告原来的树冲突命名的文件夹。文件修订本身永远不会合并,我只剩下两个文件夹。我已经尝试了多个选项来获得尽可能干净的合并,同时保留所有适当的 svn:mergeinfo,但似乎没有任何效果。
有人知道彻底完成合并的正确方法吗?
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'