On May 25, 2011, at 1:35 , David Tombs wrote:

> On 05/24/2011 11:05 AM, Stefan Sperling wrote:
>> On Tue, May 24, 2011 at 10:45:09AM -0400, David Tombs wrote:
>>> Hi Subversion Gurus,
>>> 
>>> I have a question about merging with a tree conflict.
>>> 
>>> I created the same directory, called 'config' on two branches. The
>>> directory had different files on each branch, let's call them 'foo.java'
>>> on branch A and 'bar.java' on branch B.
>>> 
>>> When I merged branch A -> branch B, I got a "tree conflict" saying "local
>>> add, incoming add upon merge." I can understand this error: the merge
>>> tried to add the directory as expected but it was already there. My
>>> desired resolution is to keep the 'config' directory and just add the file
>>> from branch A. That is, 'config' would contain both foo.java and bar.java.
>>> 
>>> The only way to achieve this I found was to delete 'config' (with no
>>> commit), do the merge, and then revert the deletion of bar.java. It
>>> worked, but it seems weird to do a delete just to revert it. Do you know
>>> any better way of doing it?  It took me a while to figure out the
>>> solution, with lots of fruitless Googling.
>> 
>> The problem with tree conflicts is that each one is unique.
>> You might always find more creative ways of solving them.
>> But I think that you've taken a very good approach.
>> 
>> In short, whatever works for you is best :)
>> 
> 
> Hi Stefan,
> 
> Thanks for the response. Unfortunately, I don't think my solution turned
> out very well. I ended up with a corrupted working copy that thought
> bar.java was there but the server disagreed whenever I did a
> server-hitting command.
> 
> I guess what I should have done instead was delete config and then
> re-add bar.java instead of reverting it.

Hi David,

Attached is a reproduction script.  I could reproduce the corrupted working
copy in 1.6.16.

With 1.7 (r1127008), the corruption doesn't occur, but there's still a bug:
'svn status' displays bar.java (as deleted) after the merge.  The revert of
bar.java has no effect.

Anyway, making local changes to a working copy just to avoid tree
conflicts, is a sign that Subversion's conflict resolution is lacking.  There's
no way to tell the merge command to resolve add-vs-add tree conflicts by
merging the trees.  

I guess we need 'svn merge --accept theirs-conflict' (or mine-conflict) to 
apply to tree conflicts.  That would be useful for 'svn update', too.  This
falls under issue 3144:

  http://subversion.tigris.org/issues/show_bug.cgi?id=3144
  "interactive conflict resolution does not know about tree-conflicts"

Note: At the end of the script I include an alternate workaround: 'svn copy 
^/trunk/config/foo' to the branch.  This has the advantage of preserving 
each file's history.



Steve

Attachment: merge-dir-add-add.sh
Description: Binary data



--
Stephen Butler | Senior Consultant
elego Software Solutions GmbH
Gustav-Meyer-Allee 25 | 13355 Berlin | Germany
tel: +49 30 2345 8696 | mobile: +49 163 25 45 015
fax: +49 30 2345 8695 | http://www.elegosoft.com
Geschäftsführer: Olaf Wagner | Sitz der Gesellschaft: Berlin
Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194


Reply via email to