First Steps with bzr-svn

I'm an SVN nut - love it, use it, talk about it at any opportunity, can't physically write code without it. But as a telecommuting developer who is sometimes travelling around, I've been thinking for a while that one of the distributed systems would really make more sense. I tried git ages ago and decided that I just wasn't smart enough to use it; I'm so comfortable and confident with subversion and it is such a change.

I know there are alternatives out there, I saw a talk about bzr at LUGRadioLive last year and I have some canonical-associated friends who use it so I know the community is good and I can get some help if I need it. I confided in a fellow developer that I'd struggled with git, but that I'd also read that bzr would be more subversion-like which seemed ideal for me since that's my background. His response? "No, bzr isn't easier for people coming from SVN, bzr is just easier". So I figured I'd give it a go.

I'm an ubuntu user so I installed the bzr, bzrtools and bzr-svn packages, and read the user guide - the user guide is absolutely excellent and I wish every tool in the world had instructions like these! Anyway here's a quick outline of how I got started and used bzr against my existing SVN repository (it seems too much like hard work to start migrating repos before I've decided if I like the tool).

Who Am I?

Tell bzr your name and email so it can credit your commits to you:

 bzr whoami "Lorna Mitchell <lorna@lornajane.net>"

Good start :)

Checkout from SVN

There are several ways to set yourself up to work with bzr-svn, I chose the simplest, and checked out from SVN using bzr, then branched locally and worked on that. First we initialise a directory as a bzr repository:

bzr init-repo --default-rich-root snapshot

Then I actually did the checkout.

bzr checkout http://svn.rivendell.local/snapshot/trunk trunk

So at this point I have a current working copy of code.

Bzr Branching

So that I could work locally and commit at intermediate stages between commits to the SVN repo, I then made a local bzr branch of this checkout. This is the bit that's a bit different to subversion, the branch is just local to you, more like a working copy. It was quite easy:

bzr branch trunk working

So I'll now make my changes in the working branch I just created, this becomes my web root if its a web app for example.

Comitting

Using the "bzr commit" command from the branch we created ("working" directory in the examples) only commits locally to the branch. You can do this as many times as you need/want to until your feature is ready (or maybe until you can get back to a connection).

Updating

I realised at this point that I needed to update from the repo to pick up some changes someone else had made, to do this I needed to update my checkout and then pull the changes into my branch:

cd ../trunk
bzr update
cd ../working
bzr pull

To give a clearer idea of how this all goes togehter, I drew a diagram of the repo, the checkout, the branch, and how the process works to get between them all (click to see it at a sensible size):

Status

The "bzr status" command shows what changes are local to the current directory.

Conveying Changes Back To Repo

I made a couple of changes in my working directory and then wanted to put these back to the repo. So from the checkout ("trunk" directory in my example), I merged the changes in and then committed.

bzr merge ../working/
bzr commit

My changes were then in the SVN repo exactly as normal, bzr-svn means extra functionality for me but nobody else necessarily needs to change tools and all the hooks and backup routines and everything that are already in place for this repo can be kept. I'm happy with that outcome!

Next Steps

This is a very basic usage of bzr, really I'm only recording my own experience to make these concepts clearer in my own mind. I plan to do a lot more with this tool and will keep blogging as I go along. Comments, corrections, suggestions and questions are all very welcome - add a comment :)

4 thoughts on “First Steps with bzr-svn

  1. Nice tutorial.

    In your diagram, I think the direction of the arrows for pull and merge are reversed.
    Merge is for when you want to "commit" from the branch directory to the main directory.

  2. Recently I've been using bzr-svn when I'm working with subversion repositories; its a bridge between a local bzr repository and a remote subversion one. I travel fairly frequently and the pain of being disconnected from the server, unable to diff or log,

  3. I am a source control nut, I've been speaking about Subversion for years, I co-lead an active open source project which uses git and GtiHub, and I've also dabbled with Bazaar. So far I'm feeling the limits of Subversion, loving the code-hosting features

Leave a Reply

Please use [code] and [/code] around any source code you wish to share.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>