SVN如何在两个分支上添加文件时解决新的树冲突

时间:2009-04-20 10:49:26

标签: svn merge tree-conflict

合并两个分支(使用SVN 1.6.1)时,在两个分支上添加了一个文件(然后在那些单独的分支中处理),我遇到了一个新的树冲突:

      C foo.txt
  >   local obstruction, incoming add upon merge

我需要来自两个分支的更改,但是树冲突并没有给我通常的.working,.merge-left& .merge-right files - 由于冲突的性质,这是可以理解的。这些冲突中有很多,并且每个分支上都删除了相同的文件,但它们很容易解决。

如何解决此问题? SVN redbean一书(1.6)不包括这种情况。

4 个答案:

答案 0 :(得分:159)

我找到了post suggesting a solution for that。它即将运行:

svn resolve --accept working <YourPath>

将声明本地版本文件为OK 您可以为单个文件或整个项目目录运行它。

答案 1 :(得分:39)

正如"Tree Conflict" design文档的旧版本(2009年)所述:

  

来自添加版本化文件的合并的XFAIL冲突

     

此测试执行合并,将没有历史记录的文件添加到   现有版本文件
  这应该是“local obstruction, incoming add upon merge”变体文件的树冲突。修正了r35341的预期。

(顺便说一句,这在ClearCase中也被称为“邪恶的双胞胎”):
一个文件在两个不同的分支中创建两次(这里“添加”两次),为两个不同的元素创建两个不同的历史,但名称相同。

理论解决方案是在目标分支“B2”中手动合并这些文件(使用外部差异工具)。

如果您仍在处理源分支,理想情况是从源分支B1中删除该文件,从B2合并到B1以便制作该文件在B1上可见(您将使用相同的元素) 如果由于仅从B1B2进行合并而无法进行合并,则每个B1->B2合并都需要手动合并。

答案 2 :(得分:9)

  

如果传入的更改是您想要的更改怎么办?我无法运行svn resolve --accept theirs-full

svn resolve --accept base

答案 3 :(得分:1)

我只是设法完全依赖用户619330的建议。情况是:(1):我在处理我的初始分支时添加了一些文件,branch1; (2)我创建了一个新的分支,branch2用于进一步开发,从trunk中分离出来然后合并我的更改来自branch1(3)一个同事将我的mods从branch1复制到他自己的分支,添加了更多的mod,然后合并回主干; (4)我现在想将trunk中的最新更改合并到我当前的工作分支branch2中。这是svn 1.6.17。

合并与新文件存在树冲突,我希望新版本来自它们不同的主干,所以从branch2的干净副本,我做了svn删除冲突文件,提交了这些branch2更改(因此在没有相关文件的情况下创建branch2的临时版本,然后从trunk中进行合并。我这样做是因为我希望历史记录与trunk版本匹配,以便稍后在尝试合并回trunk时我不会遇到更多问题。 Merge很好,我得到了文件的trunk版本,svn st显示一切正常,然后我尝试提交更改时遇到更多树冲突,在我之前完成的删除和从合并添加之间。 svn解决了冲突,支持我的工作副本(现在有文件的主干版本),并让它提交。一切都应该好,对吗?

嗯,不。对branch2的另一个副本的更新导致了旧版本的文件(pre-trunk merge)。所以现在我有两个不同的branch2工作副本,据说更新到同一版本,有两个不同版本的文件,并且都坚持认为它们是完全最新的!签出branch2的干净副本导致文件的旧(前主干)版本。我手动将这些更新到trunk版本并提交更改,返回到我的第一个工作副本(我最初提交了trunk更改),尝试更新它,现在得到有问题文件的校验和错误。打破有问题的目录,通过更新得到一个新版本,最后我有一个好的版本的branch2与主干更改。我希望。警告开发者。