I believe distributed revision control is essential for healthy free software community development and I’ve been funding some R&D in that regard, which has turned into “bzr” (short for Bazaar-NG Version Control System). The latest release, bzr 0.8, has all the core functionality that we wanted and performs pretty darn well too for something that has had no optimisation and is written in Python with no C extensions.
The new release will be in Dapper, and in fact they hope to get a 0.8.1 out the door before Dapper ships so please test 0.8 and if you do find any issues let them know.
We’ve put a lot of effort into the “feel” of the system. Version control has to be like Goldilocks porridge – “just right” – but it’s difficult to describe exactly what just right is all about other than that it should be a smooth experience from start to finish. I think with 0.8 the Bzr guys are nearly there.
It’s trivial to start versioning a directory or tree of directories, and then to start passing those versions around to collaborate with friends. It has some unique capabilities, like the ability to work on a shared branch (like subversion) and then trivially to split off and work on your own branch, then merge back to the shared branch. This ability to be online and collaborative, and offline when I need to be, is what really makes me more productive. The new version supports a more efficient file storage format, called knits, which has radically improved the speed of network pushes and merges.
Here’s the short version of how to use bzr:
- Start versioning files in a directory with bzr init
- Make changes, and commit locally with bzr commit
- Get status on that tree with bzr status
- Push the branch to an sftp server with bzr push sftp://where.com/here/
- Merge from another branch with bzr merge http://there.com/thatbranch/
In short, it’s fast, easy to use and “just works” the way you expect it to. I’m really pleased with the work that Martin and the bzr team have done. The community is shaping up to be nice and vibrant too. There are about 40 regular participants in discussions about bzr implementation, and there’s a nice plugin model with lots of interesting plugins coming from the community to do cool stuff like graphical representations of trees and merges.
It does a really fast annotate, so if A changes a line, and B merges that change from A, and C merges that change from B, and you merge from C, you can still quickly see that the line was changed by A. That still blows my mind. Gets and pushes are not as fast as git but the guys want to focus on network latency optimisation and local performance in the next major version, for now the emphasis is on the “revision control experience”.
To test Bzr you can:
- Download the latest release
- On Ubuntu Dapper, apt-get install bzr bzrtools
And of course it’s all under the GPL. Now, if only we could merge some of the good work being done in the Mercurial project into Bzr we would have one kickass Python VCS… I like their single-tree performance but far prefer our user experience.