[plt-dev] Migrating branches to git

From: Eli Barzilay (eli at barzilay.org)
Date: Sat Apr 10 16:15:23 EDT 2010

There is a problem with migrating branches "properly" to git.  (If you
don't care about branches, past or present, you can skip reading the
rest of this message.)

The problem comes from subversion's non-existent recording of merges
(at least pre-1.5, but also post 1.5 it looks like `svn:mergeinfo'
it's not always reliable).  The short story is that when you copy a
file (as happens when you create a branch by copying the trunk), then
subversion keeps the original path it came from, but when you merge
changes from a branch to the trunk, then from the svn pov this is just
like any other commit on the trunk, no formal relation to the branch
it came from.

By now I tried a good number of tools, with numerous configurations
and tweaks, and none of them did the right thing wrt branch merges.
(Debugging this process is extremely expensive: *fast* tools do a
conversion in about 2-3 hours, slow ones take about 12-15 hours.)  So
I'm giving up on this and going back to mirror *only* the trunk and
the release tags.

Note that this means losing some historical commit information (ie,
their diff and the log message), but there is no loss of actual
files.  For example, say that svn has these revisions:

  r10: change on the trunk
  r11: copy trunk to branches/foo/bar
  r12: change on branches/foo/bar
  r13: change on the trunk
  r14: change on branches/foo/bar
  r15: merge branches/foo/bar to the trunk (which is a change on it)
  r16: change on the trunk

the log history that you will see in git (by default, unless you do
the below) is:


with the corresponding log messages.

This leaves two problems that need solutions:

1. Branches that are still live

2. Branches with merges that people actually care to preserve in the
   git history.

So if you have branches in either of these categories, you need to
read on.  Note in particular the first point: if you have a live
branch that was not merged into the trunk you *NEED* to tell me about
it.  (If you don't then it's still possible to recover: just finish
your work and create a patch based on svn which I'll apply on the git
tree, but it's better to deal with it now.)

1. If you have a live branch, you need to tell me its name (= its
   path).  What I will do is arrange for the conversion to preserve
   your branch, which will create it on the central git repository.
   Then when it goes live, you will clone the git repository including
   your branch, and finally I will remove the branch from the server
   (since they're all individual-work branches).

2. If you have branches that you care to include their historical
   information in git, you need to mail me the following information
   for every branch and merge point you want to preserve.  (This works
   only for branches that are copies of trunk.)

     * The branch name
     * The revision it was created in
     * the last revision that took place on it
     * The revision number where it was merged to the trunk

   (I will then use this information to force the same ancestry
   structure in the git repository using grafts.)

   It is also possible to deal with more complicated multiple branches
   (ie, you created foo/bar1, worked some, merged it and the trunk
   into foo/bar2, etc) -- in such cases you will need to tell me the
   exact topology too, in similar terms to the above.

          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

Posted on the dev mailing list.