合并结构更改时避免树冲突

Avoiding tree conflicts when merging structural changes

我创建了一个分支来对网站进行一些清理和结构更改。主干的内容只是网站文件,如下所示(为简洁起见缩写):

/trunk/css/
/trunk/images/
/trunk/js/
/trunk/index.html

分支后,我将内容下移了一层并为非网站内容(主要是 PSD 文件)创建了另一个目录,我仍然需要保留和使用这些内容。现在的结构是:

/branches/cleanup/www/css/
/branches/cleanup/www/images/
/branches/cleanup/www/js/
/branches/cleanup/www/index.html
/branches/cleanup/support/psd/

如何在没有大量树冲突的情况下将它干净地合并回主干?我确定我以前做过这个。问题是,我这辈子都记不起来了。

自创建分支以来,我对主干进行了多次更改,所以我被树冲突所淹没。

此时我很乐意接受一个不太理想的解决方案,所以我的备份计划是忘记合并,而是在主干上执行 svn move/branches/old-trunk/ 之类的东西,然后 svn move 清理分支进入 /trunk/ 并从那里开始。

除了必须手动将主干更改应用到清理分支之外,这样做会有任何令人讨厌的副作用吗?

如果 trunk 中的文件没有变化,您将不会遇到任何冲突。

如果您更改了 trunk 内的任何文件,并且这些文件也在分支内移动,则无法在 Subversion 中解决此问题而不会产生树冲突。

更新

如果您移动分支以将其用作新的 trunk,它会破坏您可能拥有的任何其他分支的自动合并解决方案。除此之外,此移动应该没有问题,因为 trunk 绝不 "special" 或与 svn 相关的任何其他目录不同。

如果您愿意放弃创建分支后对主干所做的更改,您可以使用 --accept 选项到 svn merge 来指定您始终希望使用该分支冲突时的版本:

svn checkout TRUNK_URL WC_PATH
svn merge --accept theirs-full BRANCH_URL WC_PATH

您也可以尝试 theirs-conflict 而不是 theirs-full 以仅从分支中获取冲突的 区域 文件,而不是整个文件.在您的情况下,由于您将所有内容都移到了一个单独的目录中,所以我认为不会有任何区别,但我会尝试两者并进行比较。

不过,最终,您可能出于某种原因对主干进行了这些更改。我只会硬着头皮解决冲突,而不是把你的工作扔进垃圾桶。还有其他可能的解决方法可以减轻这个过程的痛苦,比如将分支中的东西移回与主干相同的目录结构,进行合并,重新分支,以及只是更改目录结构,但随后你引入了额外的并发症。

顺便说一句,这就是为什么你应该经常合并。 SVN 1.5 引入了自动合并跟踪,使得这个过程比以前少了很多痛苦。