git/list[1] front-page[2] threads[3] people[4] search[5] about
 

git-svn messing up merge commits on dcommit

From
Björn Steinbrink <b.steinbrink@gmx.de>
Date
Aug 30, 2009, 01:32 UTC
Message-ID
<20090830013225.GA6475@atjola.homenet>
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&

Next: Eric Wong
Message 1 of 2 in “git-svn messing up merge commits on dcommit”
  1. Björn SteinbrinkAug 30, 2009
  2. Eric WongAug 31, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.