How-To: Bzr over ssh with no bzr server

2 minute read

Bazaar (bzr) is a distributed version control system (VCS) sponsored by Canonical and thus bzr is widely used by the Ubuntu community.

Like any vcs, bzr will let you track the different version of your code locally and let you push the changes to a remote server.

One cool feature of bzr is that you can maintain a remote copy of your code history without having a bzr server running, nor having a copy of bzr on the remote server running and simply by using ssh to transport the data.

This tutorial will not explain how bzr works, but will show the couple few step to create your local repository, add a few files, commit the changes, push them to a remote server and copy the branch newly created to another machine.

1. Client Requirements

In order to use bzr against a bzr server, only bzr is required, but in our case, we want to use ssh to transport the data without the help of a bzr server, e.g. sftp, which will require python-paramiko.

Type the following to install the required package on the client:

$ sudo apt-get install bzr python-paramiko

2. Creating a local bzr branch

First, let’s create a directory which will be our branch, create a file and commit it:

$ mkdir testbranch; cd testbranch
$ vi hello.c
#include <stdio.h>

int main(int argc, char** argv){

  fprintf(stdout, "Hello World!\n");
  return 0;
}

Now, let’s create the branch, add our file and commit it.

[email protected]: $ bzr init
[email protected]: $ bzr add hello.c
added hello.c
[email protected]: $ bzr commit -m "First commit"
Committing to: /path/to/testbranch/
added hello.c
Committed revision 1.
[email protected]: $ bzr push sftp://[email protected]/path/to/repository/testbranch
Created new branch.

That’s it, we now have branch save on rhost at /path/to/repository/testbranch. Let go to another host and fetch a local copy.

3. Importing a copy locally

[email protected]: $ bzr branch sftp://[email protected]/path/to/repository/testbranch
Branched 1 revision(s).
[email protected]: $ cd testbranch
[email protected]: $ bzr log
------------------------------------------------------------
revno: 1
committer: User1 Host1 <[email protected]>
branch nick: testbranch
timestamp: Thu 2008-08-21 18:55:08 +0100
message:
First commit

Now, let’s modify hello.c and change “Hello World!\n” to “Hello Bazaar!\n”, then commit and push the changes:

[email protected]: $ bzr commit -m "Changed World by Bazaar"
Committing to: /tmp/testbranch/
modified hello.c
Committed revision 2.
[email protected]: $ bzr push sftp://[email protected]/path/to/repository/testbranch
Pushed up to revision 2

4. Importing the new modification

Now back to [email protected] , let’s import the changes locally:

[email protected]: $ bzr pull sftp://[email protected]/path/to/repository/testbranch
M Hello.c
All changes applied successfully.
Now on revision 2.

And check the logs and diff:

[email protected]: $ bzr log
------------------------------------------------------------
revno: 2
committer: User2 Host2 <[email protected]>
branch nick: testbranch
timestamp: Thu 2008-08-21 19:05:37 +0100
message:
Changed World by Bazaar
------------------------------------------------------------
revno: 1
committer: User1 Host1 <[email protected]>
branch nick: testbranch
timestamp: Thu 2008-08-21 18:55:08 +0100
message:
First commit
[email protected]: $ bzr diff -r-2..
=== modified file 'hello.c'
--- hello.c 2008-08-21 17:55:08 +0000
+++ hello.c 2008-08-21 18:05:17 +0000
@@ -3,7 +3,7 @@


int main(int argc, char** argv){


- fprintf(stdout, "Hello World!\n");
+ fprintf(stdout, "Hello Bazaar!\n");
return 0;
}