Bazaarを試してみた

分散バージョン管理といえばGitやMercurialが有名ですがBazaarというのもあるようなのでちょっと試してみました。

BazaarはPythonで実装されておりUbuntuMySQLで採用されているようです。

本家
http://bazaar-vcs.org/

Mac10.5にportでインストールしてみます。

sudo port install bzr

最近バージョン2.0.0が出たようなのですが、portにあるのは1.13.1のようですね。

$ bzr --version
Bazaar (bzr) 1.13.1
  Python interpreter: /opt/local/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python 2.5.4
  Python standard library: /opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5
  bzrlib: /opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/bzrlib
  Bazaar configuration: /Users/wyukawa/.bazaar
  Bazaar log file: /Users/wyukawa/.bzr.log

Copyright 2005, 2006, 2007, 2008, 2009 Canonical Ltd.
http://bazaar-vcs.org/

bzr comes with ABSOLUTELY NO WARRANTY.  bzr is free software, and
you may use, modify and redistribute it under the terms of the GNU
General Public License version 2 or later.

とりあえずbzrとたたいて下記のようになればインストールはうまくいっているようです。

$ bzr
Bazaar -- a free distributed version-control tool
http://bazaar-vcs.org/

Basic commands:
  bzr init           makes this directory a versioned branch
  bzr branch         make a copy of another branch

  bzr add            make files or directories versioned
  bzr ignore         ignore a file or pattern
  bzr mv             move or rename a versioned file

  bzr status         summarize changes in working copy
  bzr diff           show detailed diffs

  bzr merge          pull in changes from another branch
  bzr commit         save some or all changes
  bzr send           send changes via email

  bzr log            show history of changes
  bzr check          validate storage

  bzr help init      more help on e.g. init command
  bzr help commands  list all commands
  bzr help topics    list all help topics

まずはコミットする人の名前を設定します。

$ bzr whoami "Your Name <email@example.com>"
$ cat .bazaar/bazaar.conf 
[DEFAULT]
email = Your Name <email@example.com>

Gitの基礎練習を真似てやってみます。

まずは作業場所を整え、readme.txtというファイルを作ります。

wyukawa:~ wyukawa$ mkdir work
wyukawa:~ wyukawa$ cd work
wyukawa:work wyukawa$ mkdir myproject
wyukawa:work wyukawa$ cd myproject/
wyukawa:myproject wyukawa$ echo This is a readme file. > readme.txt
wyukawa:myproject wyukawa$ cat readme.txt 
This is a readme file.

myprojectディレクトリ以下のファイルすべてをBazaarの管理下に置きます。
リビジョン番号はハッシュ値ではないようです。

wyukawa:myproject wyukawa$ bzr init
Created a standalone tree (format: pack-0.92)                                  
wyukawa:myproject wyukawa$ bzr status
unknown:
  readme.txt
wyukawa:myproject wyukawa$ bzr add
adding readme.txt
wyukawa:myproject wyukawa$ bzr commit -m "Initial commit."
Committing to: /Users/wyukawa/work/myproject/                                  
added readme.txt
Committed revision 1.                                                          
wyukawa:myproject wyukawa$ bzr log
------------------------------------------------------------
revno: 1
committer: Your Name <email@example.com>
branch nick: myproject
timestamp: Tue 2009-09-29 21:30:22 +0900
message:
  Initial commit.

管理用のディレクトリ .bzr も作られています。

wyukawa:myproject wyukawa$ ls -a
.		..		.bzr		readme.txt

readme.txtファイルに一行追加してから差分を確認してみます。

wyukawa:myproject wyukawa$ echo Nice to meet you. >> readme.txt
wyukawa:myproject wyukawa$ cat readme.txt 
This is a readme file.
Nice to meet you.
wyukawa:myproject wyukawa$ bzr diff
=== modified file 'readme.txt'
--- readme.txt	2009-09-29 12:30:22 +0000
+++ readme.txt	2009-09-29 12:31:03 +0000
@@ -1,1 +1,2 @@
 This is a readme file.
+Nice to meet you.

現在の状態を見てみます。

wyukawa:myproject wyukawa$ bzr status
modified:
  readme.txt

コミットすると編集結果が反映されます

wyukawa:myproject wyukawa$ bzr commit -m "Add a greeting."
Committing to: /Users/wyukawa/work/myproject/                                  
modified readme.txt
Committed revision 2.

作業コピーの状態を確かめます

wyukawa:myproject wyukawa$ bzr status

コミットし忘れているファイルはありません。自分が作業コピーに加えた修正は、リポジトリに反映されています。

新しいhello.txtファイルを作ります

wyukawa:myproject wyukawa$ echo Hello. > hello.txt
wyukawa:myproject wyukawa$ cat hello.txt 
Hello.

新しく作ったファイルはまだBazaarの管理下にありません

wyukawa:myproject wyukawa$ bzr status
unknown:
  hello.txt

bzr statusで、現在の状態がわかります。いま作ったばかりのファイル(hello.txt)が、まだBazaarの管理下にないことがわかります。

hello.txtを追加します

wyukawa:myproject wyukawa$ bzr add
adding hello.txt
wyukawa:myproject wyukawa$ bzr status
added:
  hello.txt

bzr addで、ファイルhello.txtをBazaarの管理下に置きました。でも、まだリポジトリには反映していません。

bzr statusを実行すると、追加したけれどまだコミットしていないファイルがわかります(added:という印がつきます)。

コミットしてリポジトリに反映します

yukawa:myproject wyukawa$ bzr commit -m "Add hello.txt."
Committing to: /Users/wyukawa/work/myproject/                                  
added hello.txt
Committed revision 3.
wyukawa:myproject wyukawa$ bzr status

bzr commitでリポジトリにコミットしました。

再度bzr statusしてみると、さっきコミットしてないと言われたファイル(hello.txt)の名前は、もう表示されません。すでにコミットされたからです。


新しいディレクトリに新しいファイルを作り、リポジトリにコミットしてみます。

wyukawa:myproject wyukawa$ mkdir src
wyukawa:myproject wyukawa$ cd src
wyukawa:src wyukawa$ vi Good.java
wyukawa:src wyukawa$ cat Good.java 
public class Good {
    public static void main(String[] args) {
        System.out.println("Good");
    }
}

wyukawa:src wyukawa$ bzr add Good.java 
adding src
adding src/Good.java
wyukawa:src wyukawa$ bzr status
added:
  src/
  src/Good.java
wyukawa:src wyukawa$ cd ..
wyukawa:myproject wyukawa$ bzr status
added:
  src/
  src/Good.java
wyukawa:myproject wyukawa$ bzr commit -m "Add a Java source file."
Committing to: /Users/wyukawa/work/myproject/                                  
added src
added src/Good.java
Committed revision 4.
wyukawa:myproject wyukawa$ bzr status

新しいブランチを作ります

wyukawa:work wyukawa$ ls
myproject
wyukawa:work wyukawa$ bzr branch myproject/ mytrial
Branched 4 revision(s).                                                        
wyukawa:work wyukawa$ ls
myproject	mytrial

ブランチmytrialで作業します。

wyukawa:work wyukawa$ cd mytrial/
wyukawa:mytrial wyukawa$ ls -a
.		.bzr		readme.txt
..		hello.txt	src
wyukawa:mytrial wyukawa$ cd src
wyukawa:src wyukawa$ vi Good.java 
wyukawa:src wyukawa$ bzr diff
=== modified file 'src/Good.java'
--- src/Good.java	2009-09-29 12:36:02 +0000
+++ src/Good.java	2009-09-29 12:48:01 +0000
@@ -1,6 +1,8 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good");
+        System.out.println("Good!!!!!!!!!");
+        System.out.println("Try!Try!Try!");
+        System.out.println("Good!Good!Good!");
     }
 }
wyukawa:src wyukawa$ bzr status
modified:
  src/Good.java
wyukawa:src wyukawa$ bzr commit -m "Add messages."
Committing to: /Users/wyukawa/work/mytrial/                                    
modified src/Good.java
Committed revision 5.
wyukawa:src wyukawa$ bzr status
wyukawa:mytrial wyukawa$ bzr log
------------------------------------------------------------
revno: 5
committer: Your Name <email@example.com>
branch nick: mytrial
timestamp: Tue 2009-09-29 21:49:14 +0900
message:
  Add messages.
------------------------------------------------------------
revno: 4
committer: Your Name <email@example.com>
branch nick: myproject
timestamp: Tue 2009-09-29 21:36:02 +0900
message:
  Add a Java source file.
------------------------------------------------------------
revno: 3
committer: Your Name <email@example.com>
branch nick: myproject
timestamp: Tue 2009-09-29 21:34:18 +0900
message:
  Add hello.txt.
------------------------------------------------------------
revno: 2
committer: Your Name <email@example.com>
branch nick: myproject
timestamp: Tue 2009-09-29 21:32:04 +0900
message:
  Add a greeting.
------------------------------------------------------------
revno: 1
committer: Your Name <email@example.com>
branch nick: myproject
timestamp: Tue 2009-09-29 21:30:22 +0900
message:
  Initial commit.

mytrialブランチの変更をマージします。

wyukawa:work wyukawa$ cd myproject/
wyukawa:myproject wyukawa$ cd src
wyukawa:src wyukawa$ cat Good.java 
public class Good {
    public static void main(String[] args) {
        System.out.println("Good");
    }
}
wyukawa:myproject wyukawa$ bzr merge ../mytrial/
 M  src/Good.java                                                              
All changes applied successfully.
wyukawa:myproject wyukawa$ cat src/Good.java 
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}

wyukawa:myproject wyukawa$ bzr diff
=== modified file 'src/Good.java'
--- src/Good.java	2009-09-29 12:36:02 +0000
+++ src/Good.java	2009-09-29 12:50:51 +0000
@@ -1,6 +1,8 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good");
+        System.out.println("Good!!!!!!!!!");
+        System.out.println("Try!Try!Try!");
+        System.out.println("Good!Good!Good!");
     }
 }

いじょ。