そういえば共有リポジトリについてちゃんと説明してナカタヨ

SCMBCとかでも説明せずにはしょったんですが、Bazaarには共有リポジトリという仕組みがあります。DVCSとして運用するためには、この仕組みを使うのと使わないのとで快適さがまるで違うので、そろそろちゃんと説明しておきます。

DVCSとして運用していると、以下のような理由などで、どんどん新しいブランチを作ることになると思います。

  • 複数の新機能追加やバグフィックスを並行してしなければならない
  • うまくいくかどうか分からないけどちょっと試してみたいことがある

なので、いかに簡単にブランチを切ったり切り替えたりできるかが、開発のリズムを保つためにも重要になるんですが、普通の(共有リポジトリを使わない)ワークスペース構成にしていると、新しいブランチを作るときに既存のブランチを丸ごとコピーしなければならず、時間がかかってしまいます。(もちろん、データサイズもその分大きくなります)
それを解消するための仕組みが「共有リポジトリです。

使い方

使い方は簡単です。以下のコマンドを実行すると、REPOS_NAMEというフォルダが作成されて、そこが共有リポジトリになります。

$ bzr init-repo REPO_LOCATION
このREPO_LOCATIONフォルダの中でブランチを作ると、ファイルやコミットの情報がすべて共有されるようになり、そこから別のブランチやチェックアウトを作るときに時間がかからなくなります。
最初に共有リポジトリを作ってしまえば、あとは特別な操作などは一切必要ありません。

仕組み

共有リポジトリを使わなかった場合、ブランチの中身は以下のようになっています。ファイルやコミットの情報をブランチごとに持っているので、ブランチをコピーするときにはその辺も一緒にコピーしなければなりません。

BRANCH_NAME  ・・・ブランチのROOT
├ .bzr      ・・・Bazaarの管理ディレクトリ
| ├ repository ・・・ファイルの履歴情報やコミットの情報
| ├ branch   ・・・ブランチ固有の情報
| └ checkout  ・・・作業ツリーの情報
├ XXXXX   ・・・作業ツリー内のファイル
├ XXXXX
:

共有リポジトリを使った場合、これが以下のようになります。

REPO_NAME ・・・共有リポジトリのROOT
├ .bzr      ・・・Bazaarの管理ディレクトリ
| └ repository ・・・ファイルの履歴情報やコミットの情報
|
├ BRANCH_NAME  ・・・ブランチのROOT
| ├ .bzr      ・・・Bazaarの管理ディレクトリ
| | ├ repository ・・・ファイルの履歴情報やコミットの情報
| | ├ branch   ・・・ブランチ固有の情報
| | └ checkout  ・・・作業ツリーの情報
| ├ XXXXX   ・・・作業ツリー内のファイル
| ├ XXXXX
| :

これで、新しいブランチやチェックアウトを作っても、ファイルやコミットの履歴はコピーする必要がなくなりました。

--no-treeオプション

ワークスペースの使い方として、大きく分けて

  • すべてのブランチに作業ツリーを配置する方法
  • 個々のブランチには作業ツリーを配置せず、ひとつまたは少数の作業ツリーを作って都度参照先のブランチを切り替える方法

の2パターンがあります。2番目のパターンを使う場合、ブランチを作るときに以下のように--no-treeオプションを指定することで、作業ツリーを持たないブランチを作ることができます。

$ bzr branch FROM_LOCATION TO_LOCATION --no-tree
共有リポジトリを使う場合、リポジトリを作るときに --no-treeオプションを指定することもできます。そうすると、ブランチを作るときに毎回--no-treeオプションを指定する必要がなくなります。
$ bzr init-repo REPO_LOCATION --no-tree

まとめ

たくさんブランチを作る場合は、最初にinit-repoってしておくといいですよ。ブランチの作成が軽くなりますし、作業コピーの無いブランチなら一瞬で作成できるようになります。