Hi Eric, I have two "test cases" here (attached), which I actually wrote months ago, but forgot to sent, as I wanted to clean them up/turn them into something suitable for the test suite, but honestly, I'll probably never get around to do that, so here they are, as they are. They show git-svn messing up merge commits when dcommitting a branch that is not up-to-date WRT the svn repo. The basic history for both cases (before dcommit) is: C---D (master) / / /---E (side) / A---B (trunk) \ X (revision in SVN, not yet fetched) So the dcommit (which would send C and D to the svn repo) needs to "rebase" C and D. In the first test case, this rebasing causes conflicts, and leads to a linearized history: E (side) / A---B---X---C' (trunk) \ D (master) The merge is broken apart. This is probably expected, but I thought I'd tell anyway. The second test case is a bit more interesting, there are no conflicts between the local commits to be dcommitted and the new commit X in the svn repo. In this case, git-svn manages to dcommit the merge commit just fine, keeping the history correct, but it messes the merge commit's commit message up. So the history becomes: A---B---X---C'--D' (trunk) (master) \ / --------E (side) But D' has the same commit message as C/C', not the one from D. I hope that makes any sense to you (or you can figure it out from the testing scripts). Björn
#!/bin/sh mkdir git-svn-test cd git-svn-test SVN="file://$PWD/svnrepo" svnadmin create svnrepo svn co "$SVN" co cd co svn mkdir trunk tags branches svn ci -m init echo 123 > trunk/foo svn add trunk/foo svn ci -m "SVN 1" cd .. git svn clone -s "$SVN" git cd co echo 456 >> trunk/foo svn ci -m "SVN 2" cd .. cd git git checkout -b side echo 123 >> foo git add foo git commit -m "On side" git checkout master echo 123 > foo3 git add foo3 git commit -m "On master" git merge --no-ff side gitk --all& git svn dcommit echo resolved > foo git add -u git rebase --continue gitk --all
#!/bin/sh mkdir git-svn-test cd git-svn-test SVN="file://$PWD/svnrepo" svnadmin create svnrepo svn co "$SVN" co cd co svn mkdir trunk tags branches svn ci -m init echo 123 > trunk/foo svn add trunk/foo svn ci -m "SVN 1" cd .. git svn clone -s "$SVN" git cd co echo 456 >> trunk/foo svn ci -m "SVN 2" cd .. cd git git checkout -b side echo 123 >> foo2 git add foo2 git commit -m "On side" git checkout master echo 123 > foo3 git add foo3 git commit -m "On master" git merge --no-ff side gitk --all& git svn dcommit gitk --all&