tags:

views:

164

answers:

4

How to merge branch back to trunk in SVN with all commit history? I know in Git I can use merge -squash. Is there any equivalent command in SVN? I am using SVN 1.6.

+1  A: 

You can save each changeset as a diff and then commit each one atop the trunk. This is commonly called "transplanting", and there are various tools to do this automatically.

Borealid
+4  A: 

I'm a bit rusty with merging, but shouldn't that do the trick ?

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc

See:

svn merge --help
DarkDust
it will just merge into your working copy, that you'll then commit - but the trunk history will remember only this commit - without the ones from the branch
Dmitry Yudakov
I think you're right... I was confusing with `copy` which preserves history.
DarkDust
Isn't this what `svn:mergeinfo` is for?
detly
With Subversion 1.5 or later the merge is recorded on your local working copy in the svn:mergeinfo property. So this information is not lost. You can see the merged revisions if you use svn log -g instead of the normal svn log.
Bert Huijben
@Bert Huijben: Interesting to know, thanks for that !
DarkDust
@Bert Huijben: I think you gave the correct answer. Please make it an answer so that I can give you the bounty. Thanks.
sza
A: 

It sounds like you want to:

  1. Merge from possibly several branches.
  2. Have all the merges properly recorded as such.
  3. Commit as one new revision only.

I think this is supported by the underlying SVN architecture. But I don't know if there are any clients that provide it (though svnmucc will do it for multiple cp, mv, rm commands). Unless you want to do more research than I have (which would not take much), or write your own client which can drive the SVN libraries to do it (which may be hard but still doable); then I think you will have to sacrifice one of 2. and 3. above.

(If you sacrifice 3 you could dump the repository immediately after and hack the dump file to use one revision only, but I don't think it's worth the risk just to have a minutely simpler revision history...)

Edmund
+4  A: 

With Subversion 1.5 or later the merge is recorded on your local working copy in the svn:mergeinfo property. So this information is not lost.

You can see the merged revisions if you use svn log -g instead of the normal svn log.

Normal merges are performed as

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

But if you use a branch it is sometimes more convenient to use a reintegration merge. In this case you should first merge all trunk changes to the branch using something like

svn merge svn://server/trunk my_branch_wc

(This merges everything that is not already merged)

And after you commit this change to the branch you can use

svn merge --reintegrate svn://server/branch my_trunk_wc

To move all changes over as a single commit. (After this operation you should remove the branch)

Bert Huijben