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.
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:
"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.
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
Received on 2011-05-25 13:46:07 CEST