Wednesday, June 24, 2009

My current method for tracking/gitifying changes in foriegn VCSes

In vmbuilder.git we deal with a lot of upstream branches on launchpad being tracked with bazzar. So, I have to convert those revisions to git commits. This is how I handled importing a new branch from launchpad that branched from Bzed's r344 today:

#grab the revision
bzr branch lp:~ckaenzig/+junk/lenny
cd vmbuilder
#go to the point this revision branches from - note that this is a tag and not a branch
git checkout bzed_vmbuilder_debian-r344
#make a new branch for the underlying bzr branch
git checkout -b ckaenzig_junk_lenny
#clear out the current git working area, to reflect any RMs in the bzr revision
git rm * -r
#clear out any untracked files, such as .pyc and .py~
rm * -rf
#copy the revision over to the git repo, and stage it
cp ../lenny/* . -r
git add * -r
#make a new commit on this branch, which should now reflect the underlying bzr revision.
git commit -m "New bzr branch lp:~ckaenzig/+junk/lenny"
#tag the commit by it's underlying bzr revision number for easy reference
git tag ckaenzig_junk_lenny-r346 -a

This process generally works, but it requires careful attention and is easy to screw up. For example, I have to do a second rm to remove files that aren't being tracked by git (.pyc, .py~ files) , otherwise I end up committing junk that might be from another branch entirely when I stage the new revision. Not to mention that I may miss a revision this way. Say I have a branch A in bzr that I've manually imported this way for revisions r100, r123, and I wanna import branch B which breaks off from branch A at r112, I have to either put the new git branch at r100 (and have slightly inaccurate commit history) or start moving commits around, which I've never tried and probably doesn't push well. Fortunately VMbuilder doesn't get that many commits per day so I usually am able to keep on top of 'em.

Is there an easier way to convert bzr revisions into git commits? I'm horribly unfamiliar with bzr, so I haven't really investigated automating this process.


  1. What about something like git-bzr?

  2. I don't use it myself, but tailor can synchronize changes between many different kinds of repositories.

  3. For cleaning the git files I suggest:

    git clean -d -x

    This command cleans all untracked files, even the ones git has ignored. A -q flag can be applied to make it less noisy.

  4. includes a fast-export command, that can be used with git fast-import

    IIRC it supports incremental updates of a bzr repository