4

I'm trying to follow the release branching model described at http://svnbook.red-bean.com/en/1.7/svn.branchmerge.commonpatterns.html, but on attempting to do the merge I get a merge conflict.

# Normal SVN Structure
svn-testing2> ls -l
total 12K
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 branches/
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 tags/
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 trunk/

# Create & commit some  data
svn-testing2> echo "line1" > trunk/file1; svn add trunk/file1; svn commit -m "created file1 " trunk/file1
Adding         trunk/file1
Transmitting file data .
Committed revision 2.

# Create the release branch
svn-testing2> svn copy trunk branches/release
A         branches/release
svn-testing2> svn commit -m "created release branch" branches/release
Adding         branches/release
Adding         branches/release/file1

Committed revision 3.

# Make & commit a change to trunk
svn-testing2> echo "line1-file2" > trunk/file2; svn add trunk/file2; svn commit -m "created file2" trunk/file2
A         trunk/file2
Adding         trunk/file2
Transmitting file data .
Committed revision 4.

# Attempt to merge the change to trunk:
svn-testing2> cd branches/release/
svn-testing2/branches/release> svn merge ^/trunk
--- Merging r2 through r4 into '.':
   C file1
A    file2
Summary of conflicts:
  Tree conflicts: 1
bumjvr@mbs-p:~/svn-testing/svn-testing2/branches/release> svn st
 M      .
      C file1
      >   local add, incoming add upon merge
A  +    file2

I can fix this with

svn-testing2> svn resolve --accept=working *

But it seems wrong that I have to do this.

If I then apply a "hotfix" (e.g. create "release/file3") to my release branch, how do I port that back to trunk? If I merge "release" into "trunk" it merges OK but when merging "trunk" back to "release", I get another local add, incoming add upon merge conflict on e.g. "file3"

I'm not trying to "reintegrate" a feature branch, as these are both long running branches.

It's frustrating that the SVN redbook (which is generally excellent) describes this common branching pattern, with no worked examples of what commands to actually run!

What exactly do I need to run to follow this branching pattern without all these incorrect merge conflicts? Or are there any worked examples of this branching pattern anywhere - I can't find any!

1
  • I think one of your comments is off. Attempt to merge the change to trunk should say ... to release instead, right? Commented Jan 13, 2015 at 18:36

1 Answer 1

2

This is due to your copy operation being done completely on the client-side. This operation does not include any merge tracking information and so when you attempt the merge it tries to add file1 on top of itself. This behavior is described in the disclaimer in the help for the copy command:

> svn help copy

copy (cp): Copy files and directories in a working copy or repository.
usage: copy SRC[@REV]... DST

  SRC and DST can each be either a working copy (WC) path or URL:
    WC  -> WC:   copy and schedule for addition (with history)
    WC  -> URL:  immediately commit a copy of WC to URL
    URL -> WC:   check out URL into WC, schedule for addition
    URL -> URL:  complete server-side copy;  used to branch and tag
  All the SRCs must be of the same type. When copying multiple sources,
  they will be added as children of DST, which must be a directory.

  WARNING: For compatibility with previous versions of Subversion,
  copies performed using two working copy paths (WC -> WC) will not
  contact the repository.  As such, they may not, by default, be able
  to propagate merge tracking information from the source of the copy
  to the destination.

If you change the copy to a server-side copy, the merge will succeed:

# This is the difference, the copy happens on the server
> svn copy ^/trunk ^/branches/release2 -m "Creating release2"
Committed revision 5.

# Update our working copy to get the new release
> svn update branches
Updating 'branches':
A    branches\release2
A    branches\release2\file1
A    branches\release2\file2
Updated to revision 5.

> echo blah>trunk\file3; svn add trunk\file3; svn commit -m "created file3"
A         trunk\file3
Adding         trunk\file3
Transmitting file data .
Committed revision 6.

> cd branches\release2
> svn merge ^/trunk
--- Merging r5 through r6 into '.':
A    file3
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
1
  • argh thanks! I was reading the svn redbook, I hadn't read the help for 'copy'.
    – Mark
    Commented Jan 14, 2015 at 9:31

Not the answer you're looking for? Browse other questions tagged or ask your own question.