Bazaarを試してみた
分散バージョン管理といえばGitやMercurialが有名ですがBazaarというのもあるようなのでちょっと試してみました。
BazaarはPythonで実装されておりUbuntuやMySQLで採用されているようです。
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!"); } }
いじょ。