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?
To create a merge of a branch and create a single commit for each commit in the branch you can use a script, I'm using the following:
#/bin/bash
BRANCH="http://your branch url"
for i in {1127..1138} # list of revisions
do
REV=$i
echo $REV $BRANCH
echo merged $REV from $BRANCH > tmps.commit
svn log -c $REV $BRANCH >> tmps.commit
svn up
svn merge -c $REV $BRANCH ./
svn commit -F tmps.commit
rm tmps.commit
done
This will check out each revision you specify for the specific branch and perform a commit on the current directory, thus preserving each single change with the corresponding message.
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)
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
It sounds like you want to:
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...)
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.