Bazaarユーザーガイド¶
Contents
紹介¶
Bazaarの紹介¶
Bazaarとは?¶
Bazaarはみんなのコラボレーションを手助けするツールです。 これは(たとえばソフトウェアのソースコードなどの)ファイルのグループの変化の段階のスナップショットを提供するためにファイルの変更を追跡します。 この情報を利用することで、Bazaarはあなたの作業と他の人の作業の成果を簡単にマージします。
Bazaarのようなツールはバージョン管理ツール(version control systems: VCS)と呼ばれ長い間ソフトウェアの開発者の間で人気がありました。 Bazaarは使いやすく、柔軟で簡単にセットアップできるので、ソフトウェアの開発者だけでなく、テクニカルライター、ウェブデザイナー、翻訳者のようなファイルとドキュメントに取り組む人達にも理想的なツールです。
このガイドは、個人で使うのかチームで使うのかに関わらずBazaarのインストールと使い方の手引きをします。 すでに分散型のバージョン管理システムに慣れ親しんでおりすぐとりかかりたいのであれば、このセクションを流し読みして さらに学ぶ のセクションに移動するとよいでしょう。
バージョン管理システムの小史¶
バージョン管理ツールは数十年の間に進化してきました。 簡単に説明すると、ツールは4世代に渡ります:
- ファイルのバージョン管理ツール、たとえばSCCS、RCS
- ファイルのバージョン管理ツール - 集中型、たとえばCVS
- ファイルのバージョン管理ツール - 第二世代集中型、たとえばSubversion
- ファイルのバージョン管理ツール - 分散型、たとえばBazaar
Bazaarの設計と実装は前世代のすべてのツールから学んだことに基づいています。 とりわけ、Bazaarは集中型と分散型の両方のバージョン管理モデルをサポートするのでツールを変更せずに複数のモデルに対応できます。
集中型 vs 分散型¶
従来の多くのVCSツールはファイルのツリーに対する履歴(リポジトリ, repository) を提供する中央サーバーが必要です。 ファイルに対する作業に取り組むために、ユーザーはサーバーに接続してファイルをチェックアウト (checkout) する必要があります。 チェックアウトにより、ユーザーが修正できるツリー(作業ツリー, working tree)ができます。 これらの変更を記録(コミット, commit)するためには、集中型のサーバーにアクセスする権限が必要で、コミットをする前に作業内容を最新バージョンとマージしなければなりません。 このアプローチは集中型モデルとして知られます。
集中型モデルは長期にわたって有用であることを示してきましたが顕著な欠点がいくつかあります。 先ず第一に、集中型のVCSはバージョン管理機能を利用するためにはサーバーに接続できることを要求します。 二番目に、集中型のモデルは変更の スナップショットの記録 のふるまいと変更の 公開 のふるまいと密接にリンクさせます。 これは状況によってはよいこともありますが別の状況では品質にわるい影響を与えることがあります。
分散型のVCSツールは単独の集中型のレポジトリではなく複数のレポジトリをユーザーとチームに持たせます。 Bazaarでは通常、履歴はバージョン管理されているコードと同じ場所に保存されます。 これによってユーザーは、オフラインであってもコミットするべきタイミングで変更をコミットできます。 ネットワークのアクセスは変更を公開するもしくは別の場所の変更にアクセスするときのみ求められます。
実際、分散型VCSツールを賢く使うことでオフライン作業を超えたいくつかの開発者にとっての利点があります。
- 開発者が実験用のブランチを作るのが簡単になります
- 仲間とのアドホックなコラボレーションが簡単になります
- ルーチンタスクの時間が減ります - より創造的な活動に時間を割けます
- “feature-wide” コミットの利用を通してリリース管理の柔軟性が増します
- トランクの質と安定性を高い水準で維持でき、それによって作業者のストレスが少なくなります
- オープンなコミュニティにおいて:
- コア開発者ではない人が作成と変更の維持をしやすくなります
- コア開発者が外部の開発者と共同作業をしてコアのチームに組み込むことが楽になります
- 会社において、分散されたチームや外部のチームと連携するのが簡単になります
分散型VCSツールの集中型より優れた点の詳細な一覧に関しては、 http://wiki.bazaar.canonical.com/BzrWhy を参照してください。
Bazaarの主要な機能¶
Bazaarは現存する唯一のVCSツールではありませんが、多くのチームとコミュニティにとってよい選択肢になる優れた機能をいくつか持ちます。 別のVCSツールとの比較の要約はBazaarのWiki、 http://wiki.bazaar.canonical.com で見つかります。
多くの機能の中で、とりわけ強調するものがあります: BazaarはPythonで書かれた完全にフリーなソフトウェアです。 結果として、改善に貢献することは簡単です。 手を貸して頂けるのであれば、 http://wiki.bazaar.canonical.com/BzrSupport を参照して頂くようお願いします。
さらに学ぶ¶
このマニュアルではBazaarの簡単な紹介と効果的な使い方を提供します。 すべてのユーザーは、少なくとも次の点について書かれたこの章の残りを読むことが推奨されます:
- ユーザーが知る必要のある中心的な概念を説明します
- Bazaarを利用した人気のある方法をいくつか紹介します
2-6章ではさまざまなタスクを実現するためにBazaarを使う方法を詳しく説明します。 Bazaarを使い始めた後で最初から最後まで読むことをほとんどの方にお勧めします。 7章とそれ以降はコアの機能を理解した上でBazaarを利用する際に手助けになる追加情報を提供します。 この教材は必要なときに任意の順番で読むことができます。
すでに他のバージョン管理ツールに慣れ親しんでいるのであれば、次のドキュメントを読んですぐに始めるとよいでしょう:
- 5分でBazaar - ミニチュートリアル
- Bazaarクィックスタートカード - よく使われるコマンドを1ページにまとめた要約。
加えて、オンラインのヘルプと Bazaarユーザーリファレンス は利用可能なコマンドとオプションのすべての詳細を提供します。
このマニュアルがお役に立てることを願っております。Bazaarの残りのドキュメントの改善を提案したいのであれば、 メーリングリスト(bazaar@lists.canonical.com)に連絡して頂けるようお願いします。
コアの概念¶
単純なユーザーモデル¶
Bazaarを使うために理解する必要のある概念は4つあります:
- リビジョン(Revision) - 取り組むファイルのスナップショット
- 作業ツリー(Working tree) - バージョン管理されたファイルとサブディレクトリを含むディレクトリ
- ブランチ(Branch) - ファイルの履歴を記述する、順序づけされたリビジョンの集合
- リポジトリ(Repository) - リビジョンの貯蔵場所
それぞれを詳しく見てみましょう。
リビジョン¶
リビジョンはファイルとディレクトリの内容と形を含むそれらのツリーの状態の スナップショット です。 リビジョンはそれ自身に関連づけされたメタデータをいくつか含みます。メタデータには次のようなものが含まれます:
- コミットした人
- コミットした時間
- コミットメッセージ
- そのリビジョンの元になった親のリビジョン
リビジョンは不変で、グローバルかつユニークに リビジョンid (revision-id) で識別できます。 リビジョンidの例は次のとおりです:
pqm@pqm.ubuntu.com-20071129184101-u9506rihe4zbzyyz
リビジョンidはコミットする、もしくは他のシステムからインポートする時点で生成されます。 リビジョンidは内部で利用するときや外部ツールとの統合に必要ですが、 ブランチ固有の リビジョン番号 (revision numbers)の方が人間に好まれるインタフェースになります。
リビジョン番号は 1 や 42 や 2977.1.59 のようにドットで区切られた10進法の識別子でブランチに対するリビジョン番号のグラフを通してパスを追跡します。 リビジョン番号は一般的にリビジョンidよりも短く、単独のブランチの範囲では それらの関係を理解するためにそれぞれを比較できます。 たとえば、リビジョン10はリビジョン9の直後のメインライン(下記を参照)のリビジョンです。 リビジョン番号はコマンドが実行されているときに生成されます。 これらはブランチ内でどのリビジョンがチップ(すなわち最新のリビジョン)であるかに依存するからです。
Bazaarで指定できるリビジョンとリビジョンの範囲のいくつかの方法に関しては、付録の リビジョンを指定する を参照してください。 リビジョンの番号付けの詳細に関しては リビジョン番号を理解する を参照してください。
作業ツリー¶
作業ツリー(working tree)は ユーザーが編集できるファイルを保持する バージョン管理されたディレクトリ です。 作業ツリーは ブランチ に関連付けされます。
多くのコマンドは作業ツリーをそれぞれの文脈で使います。
たとえば、 commit
コマンドは作業ツリーの中のファイルの現在の内容を利用して新しいリビジョン番号を作ります。
ブランチ¶
最もシンプルな場合、ブランチは 順序づけされた一連のリビジョン です。 最終リビジョンは チップ(tip) として知られます。
ブランチは分かれたりその後再結合(marged back)されたりして、グラフの形をとります。 技術的にいえば、グラフは(親と子のリビジョンの間)の有行な関係を表し、ループが存在しないので、 directed acyclic graph (DAG) として言及されるかもしれません。
この名前にギョッとするかもしれませんが、ご心配なく。 覚えておくべき重要なことは次のとおりです:
- DAGの範囲内での開発の主要なラインは メインライン(mineline), トランク(trunk), もしくは単に 左側(left hand side: LHS) と呼ばれます。
- ブランチはメインラインではない開発ラインを持つことがあります。 そのとき、別のラインはある時点で始まり別の時点で終わります。
レポジトリ¶
レポジトリはシンプルにいえば リビジョンの保管場所 です。 最もシンプルな事例では、それぞれのブランチが独自のレポジトリを持ちます。別の事例では、ディスクの使用量を最適化するためにブランチに対してレポジトリを共用しています。
概念をまとめる¶
上記の概念を把握したら、Bazaarのさまざまな使い方が理解しやすくなります。 Bazaarの最もシンプルな使い方は スタンドアロンツリー(standalone tree) で、これは1つの位置に作業ツリー、ブランチとレポジトリのすべてが含まれます。 他のよくあるシナリオには次のようなものがあります:
- 共用リポジトリ(shared branch) - 作業ツリーとブランチは同じディレクトリにありますが、リポジトリは高い階層のディレクトリに存在します。
- スタックブランチ(stacked branch) - 親のリポジトリと共通なリビジョンは親のリポジトリのものを利用することで、 ブランチはユニークなリビジョンだけを保存します。
- 軽量チェックアウト(lightweight checkout) - 作業ツリーとは別の場所にブランチが保存されます。
Bazaarを使う最良の方法は、あなたのニーズ次第です。 次に共通のワークフローを見てみましょう。
ワークフロー¶
Bazaarはただのツール¶
Bazaarは多くの異なる共同作業の方法を支援します。 このことはあるワークフローで始めて状況が変われば別のワークフローを採用できることを意味します。 “唯一の正しい方法”は存在しませんし今後も現れることはりません。 このセクションではBazaarによってサポートされる人気のあるいくつかのワークフローの手短な概要を提供します。
これらのワークフローはBazaarの使い方の 一部 であることを念頭にお願いします。 ここに記載されていないワークフローを利用したいのであれば、下記に記載されているアイディアを足場にします。
ソロ¶
ソフトウェアを開発する、ドキュメントを編集するもしくは設定ファイルを変更するのであれ、簡単に使えるVCSは手助けになります。 投稿者が1人であるプロジェクトを複数管理するために単独のユーザーはこのワークフローを効率的に利用できます。

まったくバージョン管理を使わない場合と比べたこのワークフローの利点は次のとおりです:
- 古いバージョンのバックアップ
- 前の状態へのロールバック
- 履歴の追跡
このワークフローに適切なBazaarの主要な機能は管理作業が少ない(サーバーのセットアップは不要)ことと簡単に利用できることです。
パートナー¶
時に2人で変更を共有して共同作業をする必要があります。 これは一般的に ソロ のワークフロー (上記を参照) もしくはチーム指向のワークフロー(下記を参照)として始まります。 ある時点で、2人目の人が最初の人が行った内容(履歴も含む)を含むブランチを作ります。 適切なときにマージして変更内容を交換することで並行して作業できます。

ソロ を上回る利点は次のとおりです:
- 変更の共有が簡単
- それぞれのテキストファイルのそれぞれの行は変更した人、時間と理由を含む特定の変更と結びつけられています。
このワークフローを採用する場合、BazaarはCVSとSubversionに対して 次のような利点があります:
- サーバーのセットアップが不要
- インテリジェントなマージ機能により複数回のマージ作業が苦痛では なくなります。
集中型¶
lock-step としても知られますが、これはCVSとSubversionによって推奨/強制されるワークフローと本質的に同じです。
すべての開発者が同じブランチに取り組みます。
最新の内容をチェックアウトするために bzr update
を実行し、変更内容を中心位置にコミットするために bzr commit
を実行します。

このワークフローを導入するのであればSubversionとCVSも簡単なのでよい選択肢です。 Bazaarはこのワークフローも直接サポートしていて、CVSとSubversionを上回る利点をいくつかもちます:
- よりよいブランチとマージ
- よりよいリネームのサポート
ローカルなコミットで集中型¶
このワークフローは、開発者が commit --local
もしくはチェックアウトをunbindして一連の変更を行うこと以外は、 集中型 モデルと基本的に同じです。
こういった一連の変更が完了するとき、開発者は作業内容を共用のメインラインにコミットします。

集中型 を越える利点:
- 旅行の間にネットに接続していないなどのオフラインで作業できます
- 誰かの作業を妨げる良くないコミットをする機会が少なくなります
SubversionとCVSはこのモデルをサポートしません。 他の分散型VCSツールはこれをサポートしますが、Bazaarよりも直接的ではありません。
共用のメインラインで分散型¶
このワークフローにおいて、それぞれの開発者は独自のブランチを持ち、加えてメインブランチにコミットする権限があります。 開発者は個人のブランチに取り組み、準備ができたらそれをメインラインにマージします。

ローカルコミットつきの集中型 を越える利点は次のとおりです:
- 作業内容の編成が簡単になる - それぞれのブランチで個別の変更を開発できます。
- 開発者は共同作業に取り組むときに別の人の個人ブランチをマージできます。
SubversionとCVSはこのモデルをサポートしません。他の分散型VCSツールはサポートします。 Bazaarの多くの機能は、簡単な利用、共用レポジトリ、統合されたマージ機能とリッチなメタデータ(ディレクトリのリネームの追跡を含む)を含めてこのワークフローに有効です。
人間のゲートキーパーで分散型¶
このワークフローにおいて、それぞれの開発者は独自のブランチを持ち、それに加えてメインのブランチに対してリードオンリーのアクセス権限を持ちます。 1人の開発者(ゲートキーパー)はメインのブランチにコミットする権限を持ちます。 1人の開発者が彼らの作業をマージしたい場合、ゲートキーパーにマージしてくれるように頼みます。 ゲートキーパーはコードのレビューを行い、必須の基準を満たすのであれば作業内容をメインブランチにマージします。

共用のメインラインによる分散型 に対する利点は次のとおりです:
- 常にコードはメインラインに入る前にレビューされます。
- 変更をメインラインに組み込むときに厳格なコントロールができます
Bundle Buggyと呼ばれるBazaarのコンパニオンツールはどんな変更がレビュー待ちになっているのか、その変更のステータスとレビューアのコメントを追跡するのにとても便利です。
自動的なゲートキーパーで分散型¶
このワークフローにおいて、それぞれの開発者は独自のブランチを持つのに加えて、メインストリームにリードオンリーのアクセス権限を持ちます。 ソフトウエアのゲートキーパーはメインのブランチにコミットする権限を持ちます。 開発者が作業内容をマージしたいとき、開発者は別の人にレビューを頼みます。 レビューに合格したら、チームの方針によって、オリジナルの著者もしくは レビューワがゲートキーパーソフトウェアにマージするように頼み、 ゲートキーパーソフトウェアはマージし、コンパイルし、テストスィートを実行します。コードがパスする場合のみ、メインラインにマージされます。
注: 代替として、レビューのステップをスキップして著者は変更を自動化されたゲートキーパーに投稿できます。 (これはコードのレビューを別のステップとしてではなくジャストインタイムのレビューを効果的に推進するペアプログラミングといった習慣を利用しているときにとりわけ適切です。)

人間のゲートキーパーによる分散型 に対する利点は次のとおりです:
- コードはメインラインに入る前に常にテストされます (メインラインの完全性が高まります)
- チームの規模の成長に対応できます
BazaarのコンパニオンツールであるPatch Queue Manager (PQM) は自動化ゲートキーパーの機能を提供します。
ワークフローを実施する¶
上記のそれぞれのワークフローを実施する方法を詳しく知りたいのであれば、このマニュアルの3章から6章までを参照してください。最初に、2章で、インストール方法、一般的な使い方の手引きと設定方法に関するティップスが説明されています。
始める¶
Bazaarをインストールする¶
GNU/Linux¶
Bazaar のパッケージは Ubuntu/Debian, Red Hat と Gentoo を含む人気のある 大抵の GNU/Linux ディストリビューションで利用できます。 最新の手引きは http://wiki.bazaar.canonical.com/Download を参照してください。
Windows¶
Windowsユーザーは、Bazaarのコアパッケージと一緒に必要な前提要件と いくつかの便利なプラグインを含むインストーラが利用できます。 最新の手引きは http://wiki.bazaar.canonical.com/Download を参照してください。
注: Windows上でCygwinを動かしている場合、Cygwin用のBazaarパッケージをWindows版の代わりに使わなければなりません。
他のオペレーティングシステム¶
BazaarのパッケージはLinuxとWindowsだけでなく、Mac OS X, FreeBSD, Solarisを含む広い範囲のオペレーティングシステムで利用可能です。 最新の手引きに関しては http://bazaar-vcs.org/Download を参照してください。
ゼロからインストールする¶
予めビルドされたパッケージよりもソースからBazaarをビルドしたい場合、手順は次のとおりです:
- まだインストールしていなければ、バージョン2.4以降のPythonをインストールします。
- http://wiki.bazaar.canonical.com/Download もしくは Launchpad (https://launchpad.net/~bzr/)から
bazaar-xxx.tar.gz
ファイル (xxxはバージョン番号)をダウンロードします。- tar、WinZipもしくは同等のコマンドを用いてアーカイブを解凍します。
- 作成されたディレクトリをPATHに登録します。
インストールが成功したことを確認するために、次のように bzr コマンドを試します:
bzr version
このコマンドによってインストールされているBazaarのバージョンが表示されます。 このコマンドが動作しない場合、開発者が正常な動作の手助けをできるように EメールかIRCを通して開発者に連絡をして頂くようお願いします。
site-wide な場所にインストールする¶
ディレクトリにPATHを設定する代わりに、次のコマンドでにbzrをインストールすることができます。:
python setup.py install
もしあなたがコンパイラやPythonの開発ツールを持っていない場合、 bzrは全ての拡張モジュールに対して(遅い)pure-pythonの実装を提供します。 次のコマンドを使って拡張モジュールのコンパイルなしにインストールできます:
python setup.py install build_ext --allow-python-fallback
開発バージョンを稼働させる¶
Bazaarの最新の開発バージョンを常に利用したい場合があります。 バグの危険性が増すので大半のユーザーにはお勧めできないことに注意してください。 一方で、開発バージョンは(開発プロセスのおかげで)非常に安定しているので、 これを動かすことで、バグと改善内容のための変更内容を開発者に送ることが楽になります。 より多くの人が最新のソフトウェアをテストすることで開発者の手助けにもなります。
従うべき手順は次のとおりです:
上記の方法の1つを利用してBazaarをインストールする。
次のように開発バージョンのコピーを入手します:
bzr branch http://bazaar-vcs.org/bzr/bzr.dev作成されたディレクトリ(bzr.dev)をPATHに登録します
上級ユーザーはより早く動かすためにC言語の拡張機能をビルドもしたいことでしょう。
これは make
と pyrex
とCコンパイラを利用することで実現できます。
このことに関して手助けが必要であればEメールかIRCを通して連絡をして下さるようお願いします。
複数のバージョンを稼働させる¶
Bazaarの複数のバージョンをインストールしてそれらを切り替えることは簡単です。 これを行うためには、実行したい bzr のフルパス名を入力するだけです。 関連ライブラリは自動的に検出されます。もちろん、パス名を提供しない場合、 通常のシステムパスで見つかる bzr のコマンドが使われます。
この機能は最新バージョンと開発バージョンの両方を走らせたい(テストしたい)場合にとりわけ役立ちます。
コマンドを入力する¶
ユーザーインターフェイス¶
Bazaarに対して利用可能な数多くのユーザーインターフェイスが存在します。 コアパッケージは bzr と呼ばれるコマンドラインツールを提供し グラフィカルユーザーインターフェイス(GUI)はプラグインとして利用できます。
bzrを使う¶
構文は次のとおりです:
bzr [グローバルオプション] command [オプションと引数]
グローバルオプションはBazaarの動作方法に影響を与え command
の前後に現れます。コマンド特有のオプションはコマンドの後で指定しなければなりませんが、コマンド固有の引数の前後と間で指定することができます。
共通のオプション¶
下記で示されるいくつかのオプションはすべてのコマンドに対して有効です。
短い形式 長い形式 説明 -h –help get help -v –verbose be more verbose -q –quiet be more quiet
Quietモードはエラーと警告のみを表示します。これはスクリプトで使う際に便利です。
注: 大抵のコマンドは1つのレベルの冗長性だけをサポートします。今後これは変更されるかもしれません。 高度な冗長性を求めるためには、-vオプションを複数回指定するだけです。
helpを表示する¶
Bazaar は組み込みのオンラインヘルプシステムを搭載していて、 次のコマンドでアクセスできます。
bzr help
help コマンドで、コマンドやコマンド以外のトピックに着いて調べることができます。 それぞれのヘルプの一覧を見るには次のようにします。
bzr help commands
bzr help topics
特定のコマンドのヘルプを見るには、次の2つの形式を使うことができます。
bzr help status
bzr status --help
ヘルプを検索するもしくは大きなドキュメントとして読みたい場合、 情報はBazaarのユーザーリファレンスでも手に入ります。
Bazaarを設定する¶
Bazaarにあなたの名前を教える¶
バージョン管理システムの機能の1つは誰が何を変更したのかを追跡することです。
分散型のシステムでは、その機能を実現するためにグローバルにユニークなそれぞれの著者のための識別子が必要です。
大抵の人はそれらの1つを持っています: Eメールアドレスです。
Bazaarはあなたのユーザー名とホスト名を探し出してEメールアドレスを自動的に生成します。
Bazaarが行う推測を望まないのであれば、あなたが望む識別子を設定するために
whoami
コマンドを使います:
% bzr whoami "Your Name <email@example.com>"
whoami
は引数なしで使われると、現在の値が表示されます。
ネットワークプロクシを使う¶
ネットワークが外部への接続に HTTP プロクシを必要とする場合、
http_proxy
という環境変数を設定しなければなりません。
https 接続にもプロクシが必要なら、 https_proxy
も設定しなければなりません。
プロクシが必要なのにこれらの環境変数が設定されていない場合、
Launchpad やその他の外部のサーバーへの接続ができなかったりタイムアウトしたりします。
Unix では、たいていこれらの設定は /etc/environment
か
~/.bash_profile
に書いて、 Windows ではたいていユーザープロファイルで
設定します。
http_proxy=http://proxy.example.com:3128/
https_proxy=http://proxy.example.com:3128/
The no_proxy
variable can be set to a comma-separated list of hosts
which shouldn’t be reached by the proxy. (See
<http://docs.python.org/library/urllib.html> for more details.)
no_proxy
という環境変数に、プロクシを利用しないで到達するホスト名の
リストをカンマ区切りで設定できます。
(詳細は <http://docs.python.org/library/urllib.html> を参照してください)
いろいろな設定方法¶
上の例で示したように Bazaar を設定する方法はたくさんありますが、 全てに共通している属性があります。オプションは全て以下のように なっています。
- 名前は有効な Python の識別子です。
- a value which is a string. In some cases, Bazaar will be able to recognize special values like ‘True’, ‘False’ to infer a boolean type, but basically, as a user, you will always specify a value as a string.
- 値は文字列です。いくつかの場面では、真偽値を得るために Bazaar は True, False のような特別な値を認識しますが、基本的にはユーザーは値として ただの文字列を渡します。
オプションはコンテキストによってグループ化されており、オプション名は そのコンテキスト内ではユニークに識別することができます。 必要な場合、オプションは設定ファイルに保存され永続化されます。
設定ファイル¶
設定ファイルは Unix の場合 $HOME/.bazaar
に、 Windows の場合
C:\Documents and Settings\<username>\Application Data\Bazaar\2.0
にあります。
この場所には3つの主要な設定ファイルがあります:
bazaar.conf
はデフォルトの設定オプションを記述します。locations.conf
は特定のブランチの位置を記述しますdauthentication.conf
はリモートサーバーのためのクレデンシャルな情報を記述します
それぞれのブランチも特定の値をそのブランチに設定する設定ファイルを含みます。
このファイルはブランチの中の .bzr/branch/branch.conf
で見つかります。
このファイルは ブランチのすべてのユーザー に見えます。
あなたに固有の設定を持つブランチのための値の1つを上書きしたいのであれば、
locations.conf
でそれを行うことができます。
whoami
コマンドを使用してEメールアドレスを設定した後の bazaar.conf
の内容のサンプルは次のとおりです:
[DEFAULT]
email = Your Name <email@example.com>
サポートされる構文と構成設定の詳細については、 Bazaar のユーザーリファレンスの 構成設定 の項目を参照してください。
アクティブな設定を確認する¶
現在定義されている全てのオプションを確認するには、次のコマンドを実行します。
bzr config
bzr
は設定オプションをどこから取得するかを決定するためのいくつかのルールを
持っています。
現在のポリシーでは、以下の順序でマッチする定義を設定ファイルから探します。
- 最初に
location.conf
の中の、セクション名が場所(作業ツリー、ブランチ、 リモートブランチ)にマッチするセクションが探されます。- 次に現在の
branch.conf
が探されます。- 次に
bazaar.conf
が探されます。- 最後に、いくつかのオプションはコード中で定義されたデフォルト値が設定され、 この設定は
bzr config
には表示されません。 (構成設定 を参照してください。)
この動作は、 bzr config
を引数なしで実行すると理解しやすいはずです。
このコマンドを実行すると次のような表示をします。
locations:
post_commit_to = commits@example.com
news_merge_files = NEWS
branch:
parent_location = bzr+ssh://bazaar.launchpad.net/+branch/bzr/
nickname = config-modify
push_location = bzr+ssh://bazaar.launchpad.net/~vila/bzr/config-modify/
bazaar:
debug_flags = hpss,
各オプション定義のグループの前に表示されているスコープが、 そのオプションを定義している構成設定ファイルを表しています。
ルールベースのプリファレンス¶
いくつかのコマンドとプラグインは特定のパターンにマッチするファイルのカスタムの処理機能を提供します。
ユーザーごとにルールベースのプリファレンスが BZR_HOME/rules
で定義されます。
ルールが検索される検索方法と関連ファイルの詳細な構文に関する詳細については、 Bazaarのユーザープリファレンスの ルール の項目を参照してください。
コマンドラインのエスケープ¶
設定ファイルの中にプログラム名やコマンドラインを記述する場合、特殊な文字や スペースをその中に含めるためにクォートすることができます。 同じルールが全てのプラットフォームで有効です。
そのルールとは、ダブルクォートで囲まれた文字列はスペースが含まれていたとしても 1つの「語」として認識され、クォート文字をクォートの中に含めるためにバックスラッシュ (訳注: 日本語環境では多くの場合バックスラッシュではなく円記号(ASCII文字の0x5c)です) を使います。例えば:
BZR_EDITOR="C:\Program Files\My Editor\myeditor.exe"
エイリアスを利用する¶
エイリアスとは?¶
エイリアスは良く入力するコマンド用のショートカットを作る もしくはコマンド用のデフォルトを設定するための手軽な方法です。
エイリアスを定義する¶
コマンドのエイリアスは bazaar.conf
ファイルの [ALIASES]
セクションで定義されます。
エイリアスはエイリアスの名前で始まり、等号(=)、コマンド列が続きます。
次のコードはALIASESセクションの例です:
[ALIASES]
recentlog=log -r-3..-1
ll=log --line -r-10..-1
commit=commit --strict
diff=diff --diff-options -p
上記の例の説明は次のとおりです:
- 最初のエイリアスは最新の3つのリビジョンに対するログを表示する新しい
recentlog
コマンドを作りますll
エイリアスは行形式で最新の10件のログエントリを表示します。commit
エイリアスはツリーの中の新しいファイルが認知されない場合コミットを拒絶するデフォルトのcommitを設定します。diff
エイリアスは -pオプションをdiffに追加します
エイリアスのためのルール¶
- コマンドライン上で新しいオプションを指定することでエイリアスに渡されるオプションの一部をオーバーライドできます。 たとえば、
lastlog -r-5..
を実行すると 10の代わりに行ベースのログエントリが5つだけ得られます。 すべての論理値型のオプションは暗黙的に逆のオプションがあるので、commit --no-strict
でcommitのエイリアスをオーバーライドできます。- エイリアスの名前をオリジナルのコマンドと同じものにすることでエイリアスは既存のコマンドの標準のふるまいをオーバーライドできます。 たとえば、デフォルトのコミットは
commit=commit --strict
で変更されます。- エイリアスは他のエイリアスを参照できません。言い換えると エイリアスの
lastlog
を作りそれをll
で参照しても動作しません。 これは標準のコマンドをオーバーライドするエイリアスを含みます。--no-aliases
オプションをbzrのコマンドに渡すと実行時にエイリアスは無視されます。 たとえば、bzr --no-aliases commit
を実行するとcommit --strict
ではなく標準のcomitコマンドが実行されます。
プラグインを利用する¶
プラグインとは?¶
プラグインは主にサードパーティによって作られたBazaarのための外部コンポーネントです。 プラグインは新しい機能を追加することでBazaarを補強する能力があります。 プラグインは現在の機能を置き換えることでBazaarのふるまいを変更することもできます。 プラグインのサンプルのアプリケーションは次のとおりです:
- コマンドをオーバーライドする
- 新しいコマンドを追加する
- 追加のネットワーク転送機能を提供する
- ログの出力をカスタマイズする
プラグインを通してできるカスタマイズの可能性は際限がありません。 実際、開発者が新しい機能を公式のコードベースに含める前にテストするための方法としてプラグインは機能します。 プラグインは機能の引退時でも同様に役立ちます。たとえば廃止されたファイルのフォーマットがある日Bazaarのコアから除外されるかもしれませんが代わりにプラグインとして利用できます。
プラグインはユーザーにとって、外部の開発者にとっても、Bazaar自身にもよいものです。
プラグインが見つかる場所¶
http://wiki.bazaar.canonical.com/BzrPlugins ページで プラグインのリストが見つかります。
プラグインをインストールする方法¶
プラグインのインストール作業はとても簡単です! まだ作られていなければ、
Bazaarの設定ディレクトリの元で plugins
ディレクトリを作ります。
Unix の場合は ~/.bazaar/
でWindowsの場合は
C:\Documents and Settings\<username>\Application Data\Bazaar\2.0\
です。
このディレクトリの範囲内では(下記では$BZR_HOMEとして言及される) それぞれのプラグインは独自のサブディレクトリに設置されます。
プラグインはとりわけBazaarのブランチとよく連携します。 たとえば、 GNU/Linux のメインのユーザーアカウント用に bzrtools プラグインをインストールするためには、次のコマンドを実行します:
bzr branch http://panoramicfeedback.com/opensource/bzr/bzrtools
~/.bazaar/plugins/bzrtools
プラグインをインストールするディレクトリの名前はPythonの有効な識別子でなければなりません。
このことはディレクトリは特定の文字だけを含まなければならないことを意味します。とりわけハイフン (-
) を含んではなりません。
bzr-gtk
を $BZR_HOME/plugins/bzr-gtk
にインストールするよりも、 $BZR_HOME/plugins/gtk
にインストールします。
プラグインの代替用の場所¶
必要なパーミッションがあれば、プラグインをシステム全体のベースに インストールすることもできます。
環境変数 BZR_PLUGIN_PATH
をプラグインが含まれるディレクトリに
設定することで個人のプラグインの場所を上書きできます。
(詳細な解説は
ユーザーリファレンス
を参照してください。)
インストールされたプラグインの一覧を表示する¶
これを行うためには、次のようにpluginsコマンドを使います:
bzr plugins
それぞれのプラグインの名前、場所とバージョンが表示されます。
プラグインによって追加された新しいコマンドは bzr help commands
を実行することで見ることができます。
プラグインによって提供されたコマンドはブラケットの中のプラグインの名前に従って表示されます。
人気のあるプラグイン¶
次の表は人気のあるプラグインのサンプルです。
カテゴリ 名前 説明 GUI QBzr QtベースのGUIツール GUI bzr-gtk GTKベースのGUIツール GUI bzr-eclipse Eclipseとの統合 General bzrtools その他。shelfを含めた機能の強化 General difftools 外部の差分ツールヘルパー General extmerge 外部のマージツールヘルパー Integration bzr-svn Subversionをリポジトリとして利用する Migration cvsps CVSパッチセットを移行させる
あなた独自のプラグインを書きたい場合、難しいことではありません。 始めるためには付録の プラグインを書く の項目をご覧ください。
Bazaarの哲学¶
Bazaarを完全に理解する¶
Bazaarは多くの点で他のVCSに似ていますが、最初見たときに必ずしも明らかではない大きな違いがいくつかあります。 このセクションでは Bazaarを”grok”するため、すなわち深く理解するために、 ユーザーが知る必要のあるいくつかの内容の説明を試みます。
注: Bazaarを使うためにこのセクションを十分に理解する必要はありません。 このセクションをさっと読んで後で戻るとよいでしょう。
リビジョン番号を理解する¶
ブランチのメインラインのすべてのリビジョンは単純に増加する整数を持ちます(最初のコミットは1、10番目のコミットは10などです)。 これによって “私のブランチから10番目のリビジョンを獲得する”、もしくは “リビジョン3050で修正した” という言い方が自然になります。
ブランチにマージされるリビジョンに関しては、ドットつきのバージョンが使われます(たとえば、3112.1.5)。 ドットつきのリビジョン番号は3つの番号を持ちます [2]. 最初の番号はメインのリビジョンの変更の由来を示します。 2番目の番号はブランチのカウンターです。 同じリビジョンから多くのブランチが由来することがあり得るので、それらのブランチはユニークな番号を取得します。 3番目の番号はブランチの開始以降のリビジョン番号です。 たとえば、3112.1.5はリビジョン3112からの最初のブランチで、そのブランチ上の5番目のリビジョンです。
[2] | バージョン1.2以前のbzrでは少し異なるアルゴリズムが使われていました。 いくつかの入れ子のブランチはよりシンプルな3つの番号システムではなく追加の番号(たとえば1.1.1.1.1)を取得します。 |
階層形式の履歴はよいものである¶
多くの変更が一連のコミットで構成される状況で複数の開発者が変更を投稿するプロジェクトを想像してください。 具体例を示すために、次の事例を考えてみましょう:
- プロジェクトのトランクのチップはリビジョン100です。
- Maryは機能Xを配信するために3つの変更を行う
- Billは機能Yを配信するために4つの変更を行う
開発者が並行して作業して伝統的な集中型のVCSのアプローチを利用する場合、 大抵の場合プロジェクトの履歴は次のようにMaryの変更とBillの変更が交互に混ざります:
107: Add documentation for Y
106: Fix bug found in testing Y
105: Fix bug found in testing X
104: Add code for Y
103: Add documentation for X
102: Add code and tests for X
101: Add tests for Y
100: ...
多くのチームはこのアプローチを利用します。彼らのツールではブランチの作成とマージが難しいからです。 結果として、開発者はトランクからの更新とコミットを頻繁に行い、すべてのコミットを通してそれを広げることで統合の苦痛を最小化します。 望むのであれば、このようにBazaarを使うことができます。 Bazaarは考慮すべき別の方法を提供します。
分散型のVCSツールによって推奨される代替のアプローチは機能ブランチを作り、準備ができたらそれらを統合することです。 この場合、Maryの機能ブランチは次のようになります:
103: Fix bug found in testing X
102: Add documentation for X
101: Add code and tests for X
100: ...
そしてBillのものは次のようになります:
104: Add documentation for Y
103: Fix bug found in testing Y
102: Add code for Y
101: Add tests for Y
100: ...
機能が独立していてリニアな履歴を維持したいのであれば、変更はバッチでトランクにpushされます。 (技術的には、これを行う方法は無数にありますがこの検討内容の範囲を超えます。) 結果の履歴は次のようになります:
107: Fix bug found in testing X
106: Add documentation for X
105: Add code and tests for X
104: Add documentation for Y
103: Fix bug found in testing Y
102: Add code for Y
101: Add tests for Y
100: ...
これを実現するために少し努力が必要な一方で、リビジョンをランダムに織り交ぜるよりもいくつかの利点があります。 よりベターですが、non-linearな履歴を形成してブランチは一緒にマージできます。 結果は次のようになります:
102: Merge feature X
100.2.3: Fix bug found in testing X
100.2.2: Add documentation for X
100.2.1: Add code and tests for X
101: Merge feature Y
100.1.4: Add documentation for Y
100.1.3: Fix bug found in testing Y
100.1.2: Add code for Y
100.1.1: Add tests for Y
100: ...
もしくは次のようになります:
102: Merge feature X
100.2.3: Fix bug
100.2.2: Add documentation
100.2.1: Add code and tests
101: Merge feature Y
100.1.4: Add documentation
100.1.3: Fix bug found in testing
100.1.2: Add code
100.1.1: Add tests
100: ...
多くの理由からこれはよいものと考えられます:
- プロジェクトの履歴を理解するのが楽になります。 関連した変更はクラスターを形成し明確に区切られます。
- ブランチのメインライン上のコミットだけを見るために履歴を簡単に折りたたむことができます。 (このレベルでは興味のない膨大な数のコミットの代わりに) このようなトランクの履歴を閲覧するとき、高いレベルのコミットだけ見えます。
- 必要であれば、より簡単に機能の変更を取り消します
- 継続的インテグレーション(Continuous integration: CI)ツールは マージをメインラインにコミットするためにすべてのテストが合格することを保証するために使われます。 (多くの場合、すべての単独のコミットの後でCIツールの引き金を引くのは適切ではありません。 テストの中には開発の間に失敗するものがあるからです。 実際、テストファーストの追加 - テスト駆動開発(TDD)のスタイル - によってこれが保証されます!)
要約すると、重要な点は次のとおりです:
ブランチを利用してあなたの作業内容を編成する
マージ機能を利用して変更を統合する
順序つきの番号と階層によって履歴を追跡するのが楽になる
それぞれのブランチは履歴の独自のビューを持つ¶
上述のように、Bazaarは次の内容を区別します:
- メインラインのリビジョン、すなわちブランチにコミットしたもの
- マージしたリビジョン、マージをコミットすることで祖先として追加されるもの
それぞれのブランチは効率的に履歴の独自ビューを持ち、すなわち、 異なるブランチは同じリビジョンに異なる”ローカルな”リビジョン番号を与えます。
マージされたリビジョンは常にドットつきのリビジョン番号を入手するのに対して メインラインのリビジョンは常に単独の数字のリビジョン番号が割り当てられます。
上記の例を拡張するためには、Maryが変更を完了させた後でプロジェクトのトランクにマージした後に Maryのブランチのリビジョンの履歴は次のようになります:
104: Merge mainline
100.2.1: Merge feature Y
100.1.4: Add documentation
100.1.3: Fix bug found in testing
100.1.2: Add code
100.1.1: Add tests
103: Fix bug found in testing X
102: Add documentation for X
101: Add code and tests for X
100: ...
繰り返しますが、Maryはこの変更を開発するためにステップを見るために彼女の履歴のトップレベルを調べることが簡単になります。 この文脈では、トランクのマージ(とそれを行うことによる衝突の解消)はこのブランチの履歴に関しては単なる1つのステップです。
Bazaarは履歴を変更するのでなければグローバルなリビジョン識別子を変更するのでもないことを覚えておくのは大事です。 本当に望むのであれば常に後者を使用できます。 実際、ブランチのURLをコンテクストとして提供する 限り コミュニケーションをするときに特定のリビジョン番号を使うことができます。 (多くのBazaarのプロジェクトでは、開発者はブランチURLなしでリビジョン番号を交換するとき中心のトランクのブランチをほのめかします)
マージはブランチのリビジョン番号を変更しません。それらはローカルのリビジョン番号を新しくマージしたリビジョンに割り当てるからです。 Bazaarがブランチのリビジョン番号を変更する唯一のときはあなたが明示的に別のブランチをミラーリングするように頼むときです。
注: リビジョンは安定した方法で番号づけされます: 2つのブランチがメインラインで同じリビジョン番号を持つとき、 そのリビジョンの祖先のすべてのリビジョンは同じリビジョン番号を持ちます。 たとえば、AliceとBobのブランチがリビジョン10に一致するのであれば、それらはそれ以前のすべてのリビジョンで一致します。
要約¶
一般的に、前に示されたアドバイスに従うのであれば - ブランチの中で作業し、連携するためにマージを使う - Bazaarが一般的にあなたが期待することを行うことがわかります。
次の章では、Bazaarを利用したさまざまな方法: もっとも単純なプロジェクト、個人プロジェクトなどを試します。
個人用途のバージョン管理¶
単独で始める¶
個人の生産性を向上させるツール¶
ツールの中には個人を生産的にする(たとえばエディタ)ためや チームもしくは会社全体を生産的にする(たとえばバックエンドサービス)ために設計されたものがあります。 バージョン管理ツールは伝統的に後者の陣営にありました。
Bazaarがクールであることの1つはセットアップが簡単なのでバージョン管理ツールを個人の生産性を上げるツールとして扱うことができることです。 既知のよい状態であるかチェックする、もしくは履歴を追跡するために変更を保存したい場合、簡単に行うことができます。 この章では方法を説明します。
単独用途のワークフロー¶
あなた独自の名作を作っているのであれば、ソフトウェア、プロジェクトもしくはドキュメントの一式であれ、典型的なワークフローは次のようになります:

チームの一員として常に作業をするとしても、この章でカバーされるタスクはあなたが行うことの基本になるので、よいスタート地点です。
プロジェクトを始める¶
既存のプロジェクトをバージョン管理する¶
バージョン管理下に置きたいソースコードのツリー(ドキュメントのディレクトリ)をすでにお持ちなら、 使うコマンドは以下のとおりです:
cd my-stuff
bzr init
bzr add
bzr commit -m "Initial import"
bzr init
はトップレベルのディレクトリで .bzr
ディレクトリを作ります(上記の例では my-stuff
)。
次のことに注意してください:
- Bazaarは必要なすべてのものをそのディレクトリに置きます - データベース、ウェブサーバー、特別なサービスをセットアップする 必要はありません
- Bazaarは
.bzr
を1つのディレクトリだけに作り、他のすべてのサブディレクトリの中には作らないぐらい礼儀正しいです。
bzr add
はバージョン管理化におくべきと考えられるすべてのファイルとディレクトリを見つけ内部で登録します。
bzr commit
はこれらの内容のスナップショットとその情報をコミットメッセージと一緒に記録します。
init
、 add
と commit
に関する詳細な情報は後で提供します。
現時点で、覚えておくべき大事なことは上記のレシピです。
新しいプロジェクトを始める¶
プロジェクトをゼロから始める場合、最初の段階で空のディレクトリを作った後で上述のレシピを使うこともできます。 後の章で詳しく探求する効率の理由から、プロジェクトのためにトップレベルでレポジトリを作り その中で メイン のブランチを入れ子にすることはよいアイディアです。次のようになります:
bzr init-repo my.repo
cd my.repo
bzr init my.main
cd my.main
hack, hack, hack
bzr add
bzr commit -m "Initial import"
main の代わりに trunk もしくは dev のような名前を好む人もいます。 何であれあなたにとって最も有用な意味のある名前を選んでください。
init-repo
と init
コマンドの両方はパスを引数としてとり、すでに存在していなければそのパスを作ることに留意してください。
ファイルの登録を制御する¶
Bazaarは何を追跡するのか?¶
前に説明したように、 bzr add
は現在のディレクトリの元でBazaarがバージョン管理すべきだと考える
すべてのものを見つけ登録します。登録するものは次のようなものになります:
- ファイル
- ディレクトリ
- シンボリックリンク
Bazaarは興味を持つファイルと興味を持たないファイルに関してデフォルトのルールを持ちます。 後で説明される ファイルを無視する のようにこれらのルールを調整できます。
他の多くのVCSツールとは異なり、Bazaarはディレクトリを第一級の項目として扱います。 結果として、空のディレクトリは正しくサポートされます - ディレクトリが追跡されプロジェクトのエクスポートに含まれることを保証するために ディレクトリ内部にダミーファイルを作る必要はありません。
シンボリックリンクに関しては、シンボリックリンクの値は追跡され、 シンボリックリンクが指し示すものの内容は追跡されません。
注: プロジェクトの中のプロジェクトを追跡するサポート機能 (“入れ子ツリー”) は現在開発中です。 この機能の開発を手伝うもしくはテストすることにご興味がありましたらBazaarの開発者に連絡して下さるようお願いします。
登録を選ぶ¶
いくつかの事例において、登録したいものをBazaarに発見を任せるよりも明示的に指名したいことがあります。
これを行うためには、パスを引数として add
コマンドに提供します:
bzr add fileX dirY/
ディレクトリを追加すると暗黙的にそのディレクトリの中の関心のあるすべてのものが追加されます。
ファイルを無視する¶
エディタのバックアップ、オブジェクト、バイトコードのファイル、ビルドされたプログラムなど、
多くのソースツリーはバージョン管理する必要のないファイルを含みます。
単純にこれらを追加しないでおくと、これらは常に未知のファイルとして現れます。
ツリーのトップでこれらを .bzrignore
と呼ばれるファイルに追加することでBazaarにこれらのファイルを無視するように指示することもできます。
このファイルは一行ごとにファイルのワイルドカード(もしくは “globs”)の一覧を含みます。典型的な内容は次のとおりです:
*.o
*~
*.tmp
*.py[co]
globがスラッシュを含む場合、ツリーのトップからのパス全体がマッチします;
さもなければファイルの名前だけにマッチします。以前の例では
すべてのサブディレクトリ内の .
の拡張子を持つファイルが無視されますが、
次の例ではトップレベルでは config.h
だけと doc/
の中のHTMLが無視されます:
./config.h
doc/*.html
どのファイルが無視され何のパターンにマッチするのかについての一覧表を得るためには、 bzr ignored
を使います:
% bzr ignored
config.h ./config.h
configure.in~ *~
無視するパターンがバージョン管理されていないファイルのみにマッチし、それらが”unknown”もしくは”ignored”として扱われるのかを制御します。 ファイルが明示的に追加されると、無視するパターンにマッチするかに関わらずバージョン管理されたままです。
.bzrignore
ファイルは通常はバージョン管理されるので、ブランチの新しいコピーは同じパターンを見ます:
% bzr add .bzrignore
% bzr commit -m "Add ignore patterns"
bzr ignore PATTERN
コマンドはPATTERNを .bzrignore
ファイルに手軽に追加するために使われます
(必要でBazaarによって追跡するために登録する場合、作られます)。
.bzrignore
ファイルを直接編集することでパターンの除去と修正が行われます。
グローバルで無視する¶
プロジェクト固有のものではないが、ユーザー固有の無視されるファイルがいくつかあります。
編集者用の一時ファイルもしくは個人の一時ファイルのようなものです。
これらを無視するようにすべてのプロジェクトに追加するよりも、
bzrは ~/.bazaar/ignore
の中でグローバルで無視するファイルをサポートします [3] 。
これはプロジェクト単位で無視するファイルと同じ構文を持ちます。
[3] | Windowsにおいて、ユーザーの設定ファイルはアプリケーションデータディレクトリで見つかります。
~/.bazaar/branch.conf の代わりに、設定ファイルは次のように見つかります:
C:\Documents and Settings\<username>\Application Data\Bazaar\2.0\branch.conf
同じことが locations.conf 、 ignore 、と plugins ディレクトリにも当てはまります。 |
変更をレビューする¶
リープする前にロックする¶
作業が完了したら、恒久的に記録することに先駆けて変更をレビューするのはよい考えです。 この方法で、何を意図しているのかをコミットすることを確認できます。
2つのbzrコマンド: status と diff はとりわけ便利です。
bzr status¶
status コマンドは最後のリビジョン以降に作業ディレクトリに行われた変更内容を伝えます:
% bzr status modified: foo
bzr status
は 変更されないもしくは無視される “つまらない” ファイルを隠します。
statusコマンドはチェックするためにオプションとしてファイルもしくはディレクトリの名前を渡すことができます。
bzr diff¶
The diff コマンドはすべてのファイルへの変更の全文を標準のunified diffとして表示します。 これは ‘’patch’‘、 ‘’diffstat’‘、 ‘’filterdiff’’ と ‘’colordiff’‘といった多くのプログラムを通してパイプで引き渡すことができます:
% bzr diff
=== added file 'hello.txt'
--- hello.txt 1970-01-01 00:00:00 +0000
+++ hello.txt 2005-10-18 14:23:29 +0000
@@ -0,0 +1,1 @@
+hello world
-r
オプションによって、ツリーは前のリビジョン、もしくは示された2つのリビジョンの違いを表示します:
% bzr diff -r 1000.. # r1000 からの全ての変更
% bzr diff -r 1000..1100 # 1000 から 1100 までの変更
1つのリビジョンの変更だけを見たい場合は、 -c
オプションを利用します。
% bzr diff -c 1000 # r1000 による変更
# -r999..1000 と同じ意味
--diff-options
オプションによってbzrは外部のdiffプログラムにオプションを渡して実行します。例です:
% bzr diff --diff-options --side-by-side foo
プロジェクトの中には新旧のファイルのためのパスの始めで接頭辞を表示するためにパッチを好むところもあります。
--prefix
オプションはそのような接頭辞を提供するために使われます。
ショートカットとして、 bzr diff -p1
は patch -p1
コマンドで機能する形式を生み出します。
変更を記録する¶
bzr commit¶
作業ツリーの状態が満足のゆくものであるとき、これをブランチに コミット できます。 そしてその状態のスナップショットを保持する新しいリビジョンが作られます。
commit コマンドはリビジョンの変更を記述するメッセージをとります。
コミットはあなたのユーザーID、現在の時間とタイムゾーン、一覧表とツリーの内容も記録します。
コミットメッセージは -m
もしくは --message
オプションによって指定されます。
複数行のコミットメッセージを入力できます;
大抵のシェルでは行の終わりで引用符を開いたままにするだけで入力できます。
% bzr commit -m "added my first file"
ファイルからメッセージを得るために -F
オプションを使うことができます。
中には、作業している間にコミットメッセージ用のノートを作り、自分が何を行い何を発言したのか
確認するために差分をレビューしたい人がいます。
(このファイルは一休みしてから作業を取り出すのにも役立ちます)
エディタからのメッセージ¶
-m
もしくは -F
オプションを使わないのであれば、
bzrはメッセージを入力するためにエディタを開きます。
起動させるエディタは $VISUAL
もしくは $EDITOR
環境変数によって制御され、
~/.bazaar/bazaar.conf
の中の editor
設定によって上書きできます;
$BZR_EDITOR
は上記で言及したエディタのオプションを上書きします。
変更なしでエディタを閉じると、コミットはキャンセルされます。
エディタの中で開かれるファイルは境界線を含みます。 この行の下のファイルの部分は情報用のみのために含まれ、コミットメッセージには含まれません。 セパレータの下側はコミットで変更されるファイルの一覧が表示されます。 上記の行の上側でメッセージを書き、ファイルを保存して閉じます。
編集メッセージとしてコミットする差分を見たければ --show-diff
オプションを使うことができます。
これはエディタが開くときにエディタの差分を含みます。セパレータの下とファイルに関する情報はコミットされます。
これは書いたメッセージを読むことができることを意味しますが、
差分自身は終了したときにコミットメッセージに表示されません。
一部をメッセージに含めたいのであれば、それらをセパレータの上側にコピー&ペーストできます。
選択可能なコミット¶
コミットのコマンドラインでファイルもしくはディレクトリの名前を渡すと それらのファイルへの変更のみがコミットされます。たとえば:
% bzr commit -m "documentation fix" commit.py
デフォルトではサブディレクトリから実行されたとしても bzrは常にツリーへのすべての変更をコミットします。 現在のディレクトリのみからコミットするには、ドットを引数として使います:
% bzr commit .
変更に署名をつける¶
たとえば誰かのパッチを適用するときなど、コミットしようとしている変更があなたのものでないなら、 --author
という commit のオプションを使って変更に署名をつけられます。
% bzr commit --author "Jane Rey <jrey@example.com>"
ここで指定された人はそのリビジョンの “author” として記録され、あなたはそのリビジョンの “committer” として記録されます。
もしリビジョンの変更がペアプログラミングなどにより複数の人に作られたものならば、 --author
を複数回指定して記録することができます。
% bzr commit --author "Jane Rey <jrey@example.com>" \
--author "John Doe <jdoe@example.com>"
履歴を閲覧する¶
bzr log¶
bzr log
コマンドは以前のリビジョンの一覧を表示します。
bzr diff
と同じように, bzr log
は -r
の引数をサポートします:
% bzr log -r 1000.. # リビジョン1000とその後のすべて
% bzr log -r ..1000 # r1000とそれまでのすべて
% bzr log -r 1000..1100 # 1000から1100までの変更
% bzr log -r 1000 # リビジョン1000のみの変更
マージされたリビジョンを見る¶
Bazaarのような分散型のVCSは集中型のVCSツールよりもマージが非常に簡単なので、 ブランチの履歴は、メインラインから分離してその後メインラインにマージされるようなラインを含むことがあります。 技術的には、無数のリビジョンノード間の関係は無閉路有向グラフ(Directed Acyclic Graph: DAG)として知られます。
多くの場合、まずはメインラインを見てそのあとに別のラインを見たいものです。 そのため、log のデフォルトの動作はメインラインを表示して、マージされたリビジョンがあるある場所を指示します。:
bzr log -n0 -rX
全てのリビジョンと全てのマージされたリビジョンを見る場合は:
bzr log -n0
-n オプションは表示するレベルを意味し、0の場合は全てを意味することに注意してください。
もしそれがゴミゴミしているなら、値を変更して調整することが容易にできます。
たとえば、もしあなたのプロジェクトがトップレベルのgatekeeperがチームレベルのgatekeeperからマージするように構成されている場合、bzr log
はトップレベルgatekeeperの履歴だけを表示し、 bzr log -n2
はチームのgatekeeperの履歴を表示します。
しかし、ほとんどの場合においては -n0
で十分でしょう。
出力をチューニングする¶
log
コマンドは出力を調整するために便利ないくつかのオプションを持ちます。次のものが含まれます:
--forward
はログを年代順で表します。- すなわち最新のリビジョンが最後に表示されます。
--limit
オプションは表示されるリビジョンの最大数を制御します。
出力の調整方法の詳しい情報に関してはユーザーリファレンスのlogコマンドのオンラインヘルプを参照してください。
ファイルの履歴を閲覧する¶
特定のファイルのみに適用されるように履歴をフィルタリングすることが便利であることがよくあります。
これを行うためには、ファイルの名前を log
コマンドに提供します:
bzr log foo.py
古いバージョンのファイルを閲覧する¶
指定されたバージョンでファイルの内容を取得するには、次のように cat
コマンドを使います:
bzr cat -r X file
X
はリビジョンの識別子で file
はファイルの名前です。
これは出力を標準出力ストリームに送信しますので、次のように閲覧ツール( less
や more
など)に出力をパイプで渡すかリダイレクトするといいでしょう:
bzr cat -r -2 foo.py | less
bzr cat -r 1 foo.py > /tmp/foo-1st-version.py
グラフィカルな履歴ビューワ¶
履歴のブラウジングはGUIツールが人生を本当に楽にしてくれる領域です。 QBzrとbzr-gtkを含めてこの機能を提供するBazaarのプラグインがたくさんあります。 これらがまだインストールされていなければ プラグインを利用する で詳細なインストール方法をご覧ください。
QBzrからグラフィカルビューワを使うには:
bzr qlog
bzr-gtkからグラフィカルビューワを使うためには:
bzr viz
viz
は実際には visualize
の組み込みのエイリアスなので望むのであれば長い方のコマンド名を使います。
プロジェクトをリリースする¶
リリースをパッケージ化する¶
export
コマンドはリリースのパッケージを作成するために使われます。
すなわち、ブランチの中のファイルとディレクトリをコピーしてそれらを真新しいディレクトリもしくはアーカイブファイルのパッケージを作成します。
たとえば、このコマンドは最後にコミットされたバージョンを tar.gz
アーカイブファイルにパッケージ化します:
bzr export ../releases/my-stuff-1.5.tar.gz
export
コマンドは下記に示されるアーカイブのタイプを作るためにアーカイブファイルの接尾辞を使います。
サポートされるフォーマット 拡張子で自動検出 dir (none) tar .tar tbz2 .tar.bz2, .tbz2 tgz .tar.gz, .tgz zip .zip
最新のリビジョン以外のリビジョンをパッケージにすることを望むのであれば、 -r
オプションを使います。
アーカイブ内部のrootディレクトリを調整したいのであれば、 --root
オプションを使います。
export
によってサポートされるオプションの詳細については
オンラインヘルプもしくはユーザーリファレンスを参照してください。
リリースをタギングする¶
リリースのパッケージを作成するために使われたバージョンを覚えるよりも、
tag
コマンドを使ってバージョンのためのシンボルを定義する方が便利です:
bzr tag version-1-5
リビジョンの識別子が必要なときはいつでもそのタグを使うことができます:
bzr diff -r tag:version-1-5
ブランチの中で定義したタグの一覧を見たい場合、 tags
コマンドを使います。
間違いを取り消す¶
間違いは起きる¶
Bazaarは下記で説明されるような間違いから簡単にリカバーできるように 設計されています。
プロジェクトのリビジョンの履歴をドロップする¶
思いがけず間違ったツリーをバージョン管理下に置いたとしても、 .bzr
ディレクトリを削除するだけで済みます。
ファイルもしくはディレクトリの登録を解除する¶
バージョン管理下に置きたくないファイルを思いがけず add
コマンドで登録しても、
それを忘れるようにBazaarにそれを忘れさせるために remove
コマンドを使用できます。
remove
は修正されたファイルが削除されないよに 安全に物事を行う ために設計されています。たとえば:
bzr add foo.html
(oops - didn't mean that)
bzr remove foo.html
このコマンドは修正されたもしくは未知のファイルについてはエラーを出力します。
ファイルを維持したいのであれば、 --keep
オプションを使います。
代わりに、ファイルを削除したいのであれば、 --force
オプションを使います:
bzr add foo.html
(oops - didn't mean that)
bzr remove --keep foo.html
(foo.html はディスクには残るけれども、bzrには登録されない)
一方で、未変更の TODO
ファイルは登録が解除されエラー出力なしでディスクから削除されます:
bzr add TODO
bzr commit -m "added TODO"
(hack, hack, hack - but don't change TODO)
bzr remove TODO
(TODO ファイルは削除される)
注: IDEもしくはオペレーティングシステムのファイルマネージャーを利用してファイルを削除する場合、 commit
コマンドはそれを削除されるものとして暗黙のうちに扱います。
最後のコミット以降の変更を取り消す¶
バージョン管理ツールを使う理由の1つは作業をしている間にツリーのステータスを楽に調べられることです。
最新の commit
以降の変更を廃棄することを決心したら、使うコマンドは revert
です:
bzr revert
事前の警告として、 実際にすべてが本当に廃棄されたことを確認するために
bzr status
と bzr diff
を最初に使うことはよい習慣です。
最後のコミット以降のファイルへの変更を取り消す¶
最後のコミット以降の特定のファイルの変更を取り消したいが、ツリーの他のすべての変更を維持したい場合、
ファイルの名前を引数として revert
に渡します:
bzr revert foo.py
最後のコミットを取り消す¶
意図しないコミットをしてしまったら、取り消すために uncommit
コマンドを使います:
bzr uncommit
revert
とは異なり、 uncommit
は作業のツリーの内容をそのままにします。
意図せずに間違ったエラーメッセージをコミットしてしまった場合、これは本当に重宝します:
bzr commit -m "Fix bug #11"
(damn - wrong bug number)
bzr uncommit
bzr commit -m "Fix bug #1"
コミットを取り消す別の理由は1つもしくは複数のファイルの追加を忘れたからというものです 。
これを避けるために、未知のファイルがツリーの中で見つかるとコミットがエラーになるように
commit
を commit --strict
のエイリアスにする人もいます。
注: merge
コマンドは次の章まで紹介しませんが、
uncommit
で追加するマージをリストアすることは無意味です。
(uncommit
の後で bzr status
を実行するとこれらが表示されます)
merge
は履歴の前の方の指定したコミットだけを効率良く取り消すためにも使われます。
merge
に関する詳細な情報は
次の章の 変更をマージする
とBazaarのユーザーリファレンスを参照してください。
複数のコミットを取り消す¶
複数のコミットを取り消すためには -r オプションを使います:
bzr uncommit -r -3
これを行うための理由が本当にいくつかの変更を破棄したいのであるなら、
uncommit
は作業ツリーを変更しないことを覚えておいてください:
タスクを完了させることと同じようにおそらく revert
コマンドを実行する必要があります。
しかし多くの場合、履歴をそのままにしておき、最新のよい状態の内容を反映する
新しいリビジョンを追加する方が間違いなくベターです。
過去のバージョンの状態に戻す¶
望まない変更を行ったが、コードがユーザーに公開されているのでコミットの取り消しが合理的ではない場合、
作業ツリーを望む状態に戻すために revert
を利用できます:
% bzr commit "Fix bug #5"
Committed revision 20.
(release the code)
(hmm - bad fix)
bzr revert -r 19
bzr commit -m "Backout fix for bug #5"
この作業によってツリー全体をリビジョン19の状態に変更します。
それ以降は新しいコミットをしていなければ、おそらくこれがあなたのしたい唯一のことです。
新しいコミットをしている場合は、 revert
はそれも消してしまいます。
その場合は、わるい修正を取り消す代わりに
リバースチェリーピック
を使う方がよいでしょう。
注: 19のような絶対的なリビジョン番号の代わりに、 負の数を使ってチップ(-1)と相対的なリビジョンを指定できます:
bzr revert -r -2
タグを訂正する¶
早まってタグを定義したのなら、
tag
コマンドの --force
オプションを使って再定義します:
bzr tag 2.0-beta-1
(oops, we're not yet ready for that)
(make more commits to include more fixes)
bzr tag 2.0-beta-1 --force
タグをクリアする¶
タグを定義したが使いたくないのであれば、削除するために、
tag
コマンドの --delete
オプションを使うことができます:
bzr tag 2.0-beta-4
(oops, we're not releasing a 4th beta)
bzr tag 2.0-beta-4 --delete
同僚と共有する¶
他の人と連携する¶
Peer-to-peerをうまくやる¶
多くの場合、1人よりも2人で考える方がベターです。 1人でプロジェクトを始め、誰かがあなたを手伝いたい、もしくはあなたが別の人に助けを求めたいことがあります。 ペアプログラマとしてタスクを割り当てられたより大きなチームのメンバーであることでしょう。 どちらにしても、効率よく共同作業を行うために、2人の人間がプロセス、ガイドラインとツールセットの一式に同意する必要があります。
誰かに電話で直接呼び出すことが許可されていなくて、彼らに話しかける唯一の方法は最初に電話会議を予約することである場合を想像してください。 集中型のVCSのリポジトリを通してのみコードを共有する企業とコミュニティは毎日そのような拘束に耐えています。 中央管理がうまくいくときもあれば、peer-to-peerがうまくいくときもあります。 Bazaarはどちらの場合でも手助けになるように設計されました。
パートナーのワークフロー¶
これは唯一の方法ではありませんが、下記の パートナーのワークフロー はBazaarを利用してペアで共同作業をしたい人々のためのよいスタート地点です。

以前の章でカバーしたタスクに加えて、この章では2つの必要不可欠なコラボレーション活動を紹介します:
- ブランチのコピーを手に入れる
- 複数のブランチの間の変更をマージする
コードベースに取り組むだけのときでも、たとえば異なるリリースのために複数のブランチを手元に置き必要に応じてそれらの変更をマージすることはとても実用的です。 あなたの “パートナー” が本当にあなた自身かもしれませんから。
プロジェクトをブランチする¶
ブランチのURL¶
誰かがあなたの作品のコピーを手に入れる前に、転送プロトコルを理解する必要があります。 ブランチのトップレベルのディレクトリを、Windowsユーザーが慣れ親しんだ方法で、ネットワーク上で共有することを決定するとします。 LinuxとOS Xのユーザーは、大抵のSSHサーバーに組み込まれているセキュアなプロトコルである、SFTPを通してアクセスする方が望ましいです。 Bazaarは下記で一部が示されるたくさんのプロトコルのサポートに関して とても 柔軟です。
スキーム 説明 file:// 標準ファイルシステムを利用してアクセスする (デフォルト) bzr+ssh:// SSH ごしのアクセス (リモートで最良の選択肢). sftp:// SFTPを利用してアクセスする (大抵のSSHサーバーはSFTPを提供する) bzr:// Bazaarのスマートサーバーを利用した高速のアクセス ftp:// パッシブFTPを利用してアクセスする http:// Webサーバーによって公開されたブランチへのアクセス https:// Webサーバーによって公開されたブランチへの、暗号化されたアクセス
上記で示されるように、ブランチは転送プロトコルを示すスキームを伴うURLを使用して識別されます。
スキームが無ければ、通常のファイルの名前が想定されます。
サポートされるプロトコルの完全なリストに関しては、
urlspec
のオンライントピックもしくはBazaarのユーザーリファレンスの
URLの識別子
のセクションを参照してください。
URL は通常サーバーのルートディレクトリから解決されます。
なので、 ftp://example.com/repo/foo
はそのホストの /repo/foo
ディレクトリを意味しています。(「通常」といっているのは、Apacheの
ようないくつかのサーバーソフトウェアはURLを任意の場所にリマップ
できるからです。この場合はサーバーの設定ファイルを確認して、
どのURLがどのディレクトリを参照しているかを探さないといけないでしょう)
サーバー上の自分のホームディレクトリからの相対パスを使うには、チルダを
使います。たとえば bzr+ssh://example.com/~/public_html
と書くと、
ホームディレクトリの中の public_html
ディレクトリにマップされます。
注釈
HTTP や HTTPS ごしのアクセスはデフォルトでは読み込み専用です。 読み書き両方に対応するための設定については、 HTTP スマートサーバーごしの push を参照してください。
ブランチのコマンド¶
既存のブランチに基づいたブランチを手に入れるためには、 branch
コマンドを使用してください。構文は次のとおりです:
bzr branch URL [directory]
ディレクトリの名前が渡されない場合、URLの最後の部分に基づいてディレクトリが作成されます。 ドライブ名 (M:/) とSFTPのURLを示すそれぞれの例は次のとおりです:
bzr branch M:/cool-trunk
bzr branch sftp://bill@mary-laptop/cool-repo/cool-trunk
新しいブランチを使うために明示的にディレクトリの名前を渡す例は次のとおりです:
bzr branch /home/mary/cool-repo/cool-trunk cool
時間とスペースへの考慮¶
転送されるブランチのサイズと コンピュータとソースのブランチの間のネットワーク帯域と レイテンシによっては、この初期の転送は少し時間がかかります。 その後の更新は変更のみが転送されるので遙かに速くなります。
Bazaarは最新のスナップショットではなくブランチの完全な履歴を転送することを覚えておいてください。
結果として、 branch
を完了させた後でネットワークから離脱しても、
ブランチの履歴に対して log
と diff
を好きなだけ行うことができます。
さらに、履歴がローカルで保存されているのでこれらのオペレーションは速いです。
Bazaarはバージョンの履歴を保存するために求められるディスクスペースの総量を最小限にするスマートな圧縮技術を使うことに注意してください。 多くの場合、プロジェクトの完全な履歴は最新バージョンの作業コピーよりも少ないディスクスペースを占めます。
後の章で説明するように、Bazaarはブランチの軽量チェックアウト、 すなわち履歴のローカルなストレージなしの作業ツリーもサポートします。 もちろん、接続しない使い方は利用できませんが、ローカルディスクスペースが本当に厳しいのであればそれはあなたが決めることができるトレードオフです。 現在、制限された履歴の振り返りのためのサポート - 履歴の水平線(history horizon) - は開発段階にあります。
ブランチの情報を閲覧する¶
配布元も含むブランチの情報を見たいのであれば、 info
コマンドを使います:
bzr info cool
ブランチが引数として渡されなければ、現在のブランチの情報が表示されます。
変更をマージする¶
並行開発¶
誰かがプロジェクトの独自ブランチを持ったら、 並行して変更を行い、オリジナルのブランチを続ける開発にコミットできます。 まもなくですが、開発の独立したラインを結合することが必要にあります。 このプロセスは マージ (merging) として知られます。
mergeコマンド¶
別のブランチから変更を受け入れるためには、 merge
コマンドを使います。
構文は次のとおりです:
bzr merge [URL]
URLが渡されない場合、オリジナルのものから由来する初期のブランチがデフォルトとして使われます。 たとえば、BillがMaryの作業内容からブランチを作る場合、 下記のようにコマンドを入力すれば彼女の次の変更をマージできます:
bzr merge
一方で、MaryはBillのブランチで行われた作業内容を彼女のブランチにマージしたいかもしれません。 この場合、彼女は最初に明示的にURLを渡す必要があります:
bzr merge bzr+ssh://mary@bill-laptop/cool-repo/cool-trunk
マージブランチがまだ設定されていなければ、これによってデフォルトのマージブランチが設定されます。
設定した後でデフォルトを変更するためには、 --remember
オプションを使います。
マージの動作方法は?¶
マージのためのいくつかのアルゴリズムがあります。 Bazaarのデフォルトのアルゴリズムは次のように動作する 3方向マージ (3-way merging) の一種です。 Aが祖先でBとCの2つがブランチであると仮定すると、次のテーブルは使われるルールを提示します。
A B C 結果 コメント x x x x unchanged x x y y line from C x y x y line from B x y z ? conflict
マージの中には人間の手助けによってのみ完了するものがあることに留意してください。 これらを解決する方法の詳細は 衝突を解消する を参照してください。
マージを記録する¶
衝突が解決した後で、マージをコミットする必要があります。例です:
bzr commit -m "Merged Mary's changes"
衝突が無くても、明確なコミットがまだ必要です。 他のツールとは異なり、これはBazaarの機能と考えられています。 クリーンなマージは必ずしもよいマージとは限らないので、個別の明確なステップとしてコミットすることで、すべてがよい状態にあることを検証するための最初のテストスィートを実行できます。
問題が見つかったら、マージをコミットする前にそれらを訂正するもしくは revert
を使用してマージを廃棄すべきです。
マージの追跡¶
Bazaarの機能の中で最も重要な機能の1つは、分散型で高品質のマージトラッキング です。 言い換えると、Bazaarは何がすでにマージされていることを覚えており、マージのための最良の祖先を賢く選ぶためにその情報を使い、衝突の回数と規模を最小にします。
あなたが他の多くのVCSツールの難民であるなら、 何が何でもマージは避けさせてください という習慣から抜け出すのは本当に難しいかもしれません。 Bazaarによっていつでも安全に他の人とのマージを行うことができます。 peer-to-peerの方法でうまくゆくときに、高い品質を保つために、 “統合のたまり場”として集中型のブランチを使うことも避けられます。 コラボレーションしている変更を本当に広く共有する準備ができたら、変更を中心のブランチにマージしてコミットする機会です。
このようにマージ機能がうまくゆけば開発者の共同作業の方法を変えることができます。
衝突の解消¶
ワークフロー¶
マージプロセスの間にそれぞれの衝突を解消することを強制する他のいくつかのツールとは異なり、Bazaarはできる限りマージしてから衝突を報告します。 これによって衝突の解消をより扱いやすくします。 解消すべき方法を決めることを手助けするためにポストマージツリー全体の内容が利用可能だからです。 それぞれの解消もしくはグループがよい状態であることを確認するためにテストをいくつか選んで実行することもよいでしょう。
衝突の一覧を表示する¶
merge
コマンドで報告されるのと同様に、突出した衝突の一覧は conflicts
コマンドを使用することでいつでも表示されます。
これは status
コマンドから出力の一部として含めることも可能です。
衝突を解消する¶
衝突に遭遇したら、 merge
コマンドは解決されていない領域を表示する埋め込みマーカーをそれぞれのファイルに追加します。
1つの衝突を持つそれぞれのファイルに対して3つのファイルも作ります:
- foo.BASE
- foo.THIS
- foo.OTHER
foo
は衝突したファイルの名前です。
多くの場合、問題になっているそれぞれのファイルを手作業で編集し、関連領域を修正し衝突マーカーを除去することで衝突を解消できます。
衝突の中のすべてのファイルを修正し、マーカーを削除した後で、
resolve
コマンドを使用してBazaarにそれらを解決したものとしてマークするように頼みます:
bzr resolve
代わりに、それぞれのファイルを修正した後で、これを解消したものとしてマークできます:
bzr resolve foo
resolve
コマンドは作業ツリーからBASE, THIS, OTHERファイルをクリーンナップします。
remergeコマンドを使う¶
いくつかの場合、任意のファイルに対して異なるマージアルゴリズムを試したいことがあります。
これを行うためには、ファイルを次のように指定して remerge
コマンドを使います:
bzr remerge --weave foo
foo
はファイルで weave
オプションは利用可能なマージアルゴリズムです。
いわゆる criss-cross
(十字遺伝)マージが検出されたときに、
たとえば、2つのブランチが同じものをマージしてからお互いをマージするときに、このアルゴリズムはとりわけ便利です。
詳細については criss-cross
と remerge
のオンラインヘルプを参照してください。
衝突を解消するために外部ツールを利用する¶
衝突を解消するためにGUIツールを利用したいのであれば、 extmerge プラグインをインストールしてください。次のようにインストールできます:
bzr extmerge foo
foo
は衝突したファイルです。
解消するファイルの一覧を提供するよりも、すべての衝突ファイルを暗黙の内に指定するために --all
オプションを利用できます。
extmerge
コマンドは bazaar.conf
ファイルの中の external_merge
設定によって指定されるツールを使います。
設定されていなければ、 kdiff3
もしくは opendiff
のような人気のあるマージツールが設定されます。
後者はOS XのFileMergeのコマンドラインインターフェイスです。
変更に注釈を付ける¶
内容の起源を探し出す¶
複数の人がファイルに取り組むとき、 誰が作ったのかもしくは最後に変更された内容を一度に見ることができるのは非常に便利です。 これを行うためには、annotateコマンドを使います:
bzr annotate readme.txt
悲観主義者もしくは楽観主義者のどちらかであるなら、
annotate
の組み込みのエイリアスである blame
もしくは praise
を使うことを好むかもしれません。
どの方法であれ、次のような情報と一緒にファイルのそれぞれの行が表示されます:
- 最後に変更した人
- 最後に変更した時間
- コミットメッセージ
GUIツール¶
Bazaar用のさまざまなGUIは注釈の情報を閲覧するためのグラフィカルなツールを提供します。
たとえば、bzr-gtkプラグインはこの機能を gannotate
コマンドを使用して起動できるGUIツールとして提供します:
bzr gannotate readme.txt
GUIツールは関心のある情報をより豊かに表現するので (たとえばそれぞれのコミットのすべての変更内容)、テキストベースよりも好ましいかもしれません。
集中スタイルの、チームコラボレーション¶
集中型の開発¶
動機¶
並行して作業をして時折マージするよりも、ロックステップ、すなわち複数の人が継続して変更を中心位置にコミットしてすべてのコミットの前に彼らの作業内容を最新の内容にマージすること、で一度に作業をすることは有用であることがあります。
このワークフローはSubversionとCVSのような集中型のVCSツールのユーザーにはとても慣れ親しまれています。 単独の開発者が複数のマシンに取り組む場合にも応用できます。たとえば、通常はデスクトップで作業をするが旅行の間はラップトップ、もしくは(インターネットに接続した)ホームコンピュータで勤務時間外に事務作業を完了させるといった具合です。
あなたのチームがすでに集中型の開発でうまくいっているのであれば、それは素晴らしいことです。 多くのチームはこの方法でBazaarを使い始め、後で代替のワークフローを実験します。
集中型のワークフロー¶
下記のダイアグラムは 集中型のワークフロー の概要を提供します。

あなたのチームがより分散型のワークフローを利用することを計画しているとしても、 この章でカバーされる多くのタスクは、とりわけブランチを公開する方法に関してあなたにとって有用です。
ブランチを公開する¶
集中型リポジトリをセットアップする¶
集中型のワークフローはコンピュータ上のブランチを中心型のブランチとして指名することで使うことができます。 実際大抵のチームは集中型のブランチをホストするために専用サーバーを持ちます。
共用リポジトリをローカルで使うことが最良の習慣であるように、中心型のブランチを共用リポジトリを設置することもお勧めです。
通常は、中心型の共用ブランチはファイルの作業コピーではなく履歴のみを保存することに注意してください。
なので、そのような共有リポジトリを作るときには通常 no-trees
オプションを使います:
bzr init-repo --no-trees bzr+ssh://centralhost/srv/bzr/PROJECT
この手順をcvsrootもしくはSubversionのリポジトリのセットアップとして似たようなものとして考えることができます。 しかしながら、Bazaarはリポジトリ内のブランチの編成方法をより柔軟にします。 ガイドラインと例に関しては付録の 共用レポジトリのレイアウト を参照してください。
集中型ブランチを始める¶
集中型ブランチに初期の内容を投入する方法は2つあります:
- ローカルのブランチを作り中央にプッシュする
- 空の中央ブランチを作り内容をコミットする
最初のやり方の例です:
bzr init-repo PROJECT (ローカルリポジトリを準備する)
bzr init PROJECT/trunk
cd PROJECT/trunk
(開発ファイルをコピーする)
cp -ar ~/PROJECT . (OS固有のツールを使用してファイルをコピーする)
bzr add (リポジトリを投入する; バージョン管理を始める)
bzr commit -m "Initial import"
(中心リポジトリに公開する)
bzr push bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
2番目のやり方の例です:
bzr init-repo PROJECT (ローカルリポジトリを準備する)
cd PROJECT
bzr init bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
bzr checkout bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
cd trunk
cp -ar ~/PROJECT . (OS固有のツールを使用してファイルをコピーする)
bzr add (リポジトリを投入する; バージョン管理を始める)
bzr commit -m "Initial import"
(中心リポジトリに公開する)
checkout
コミットを使って作られた作業ツリー内部でコミットするとローカルと同様に内容は暗黙の内に中心位置にコミットされることに注意してください。
checkout
の代わりに branch
コマンドを使ったので、内容はローカルにのみコミットされます。
このように中心位置に密接に連動した作業ツリーは チェックアウト(checkouts) と呼ばれます。 この章の残りでは数多くの機能を詳しく説明します。
チェックアウト機能を利用する¶
ブランチをチェックアウトに変更する¶
ローカルのブランチを作りチェックアウトに変更したいのであれば、
bind
コマンドを使います:
bzr bind bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
たとえば以前のセクションで説明されたように push
を使って集中型のブランチを作った後でこれは必要です。
これをした後は、コミットはローカルに適用される前にバインドしたブランチに適用されます。
チェックアウトを入手する¶
集中型のブランチを利用してチームで作業するとき、1人の人物が以前のセクションで示される初期の内容を提供する必要があります。
その後は、それぞれの個人が ローカルのチェックアウト、すなわち彼らが変更を行うサンドボックス、を作るために checkout
コマンドを使用します。
SubversionとCVSと異なり、Bazaarでは checkout
コマンドは最新の内容を保持している作業ツリーを作るのに加えて履歴のローカルな全コピーを作ります。
diff
や log
といったオペレーションは速く中心位置から接続していないときも利用できることを意味します。
軽量チェックアウトを入手する¶
Bazaarはバージョン履歴を効率的に保存するために役立つ一方で、履歴が望まれていないときがあります。 たとえば、チームがBazaarを利用して集中型でウェブサイトの内容を管理している場合、公開ウェブサーバー上の内容のチェックアウトを更新するのと同じぐらいリリースプロセスは単純です。 この場合、次の理由からその場所にダウンロードする履歴は望まないでしょう:
- 必要のない履歴を保有することでディスクスペースを無駄遣いする
- 秘密を維持したいBazaarブランチを公開する
Bazaarで履歴のないチェックアウトを入手するには、
--lightweight
オプションを使います:
bzr checkout --lightweight bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
もちろん、これによって通常のチェックアウトの多くの利点は失われますが、
役に立つ場合と時を選ぶトレードオフです。
--lightweight
オプションは、すべてのブランチではなくチェックアウトのみに適用されます。
注: コードベースが実際に大きくコンピュータ上のディスクスペースが限られている場合、 共用リポジトリ, スタックブランチ, チェックアウトを再利用する を含めたすべてのオプションを必ず考えてください。
最新の内容に更新する¶
ロックステップでの他の人との連携の重要な面の1つはあなたのチェックアウトを集中型のブランチで行われた最新の変更に更新し続けることです。
SubversionもしくはCVSで行うように、Bazaarでは update
コマンドを使用して次のように行います:
bzr update
ブランチに結びつけられたブランチで利用可能な新しいリビジョンを入手してもしあればローカルの変更をマージします。
コミットの失敗を扱う¶
commit
を実行する前にチェックアウトを最新にしなければならないことに注意してください。
Bazaarはこの点でSubversionもしくはCVSよりも厳密です - 変更したファイルだけでなくすべてのツリーを最新にする必要があります。
Bazaarはあなたが最後に更新した後で中心位置にリビジョンが追加されたことを検出すると
update
を実行するようにあなたに頼みます。
バインドされたブランチへのネットワーク接続が失われると、コミットは失敗します。 いくつかの代替の次善策は次のセクションで説明します。
オフラインで集中型のブランチに取り組む¶
集中型のローカルコミットのワークフロー¶
旅行のためネットワーク接続できない場合、中心サーバーがダウンする、もしくは今は中心位置に公開せずにローカルで変更のスナップショットを記録したいだけなら、このワークフローはそんなあなたのためにあります。

ローカルでコミットする¶
チェックアウトで作業していてローカルだけでコミットする必要がある/したい場合、
--local
オプションを commit
コマンドに追加します:
bzr commit --local
長期間切断する¶
しばらくの間バインドされたブランチから切断をする予定もしくはしたい場合、
--local
をすべての commit
コマンドを追加することを覚えるのは面倒でしょう。
代わりの方法は チェックアウトを一時的に通常のブランチにするために unbind
コマンドを用い、後でロックステップの状態に戻りたくなったときに bind
コマンドを使うことです。
bind
コマンドはこのブランチがチェックアウトされた最後の時間が結びつけられた場所を覚えるので、前の unbind
の後で bind
を使うときにリモートブランチのURLを入力する必要がないことに留意してください。
ローカルコミットのシリーズをマージする¶
中心ブランチ上で進行中の開発から独立してローカルでコミットするとき、次回 update
が実行されるときBazaarはこれらを開発の2つのラインとして扱います。
この場合、 update
は次のことを行います:
- これはバインドされたブランチからの最新のリビジョンを取り込み、チェックアウトをメインラインの状態にします。
- これは最後に更新した以降のローカルな変更を論理的に並行ブランチに移動します
- これらを一緒にマージするのでローカルの変更は
status
によって未解決マージ として報告されます
常に、この後で作業内容を中心ブランチに送信するためには commit
を実行する必要があります。
チェックアウトを再利用する¶
動機¶
時々、複数のブランチに取り組むために単独のチェックアウトをサンドボックスとして持つことは便利です。 挙げられる理由のいくつかは次の内容を含みます:
- 作業ツリーが大きいときディスクスペースを節約する
- 固定された位置で開発する
多くの場合、作業ツリーのディスクの利用量は .bzr
ディレクトリよりも
大きくなります。
複数のブランチに取り組みたいが、それぞれの作業ツリーすべてのオーバーヘッドを許容できない場合、複数のブランチをまたがってチェックアウトを再利用することがうまくゆく方法です。
他の機会において、サンドボックスの位置は数多くの開発とテストツールに設定されます。 繰り返しますが、複数のブランチをまたがったチェックアウトの再利用は役に立ちます。
ブランチが結びつけられた場所を変更する¶
チェックアウトが結びつけられている場所を変更するためには、次の手順に従います:
- 作業内容が失われないようにローカルの変更が中央ブランチにコミット されたことを確認します
- 取り組みたい新しいリモートブランチのURLを渡して
bind
コマンドを使いますrevert
コマンドの後に続いてupdate
コマンドを使用して望むブランチの コピーをチェックアウトします
新しいブランチに bind して update するだけだと、コミットしたもの、していないもの両方のローカルの変更がマージされることに注意してください。
revert
か commit
を使って、それらを維持するか破棄するかを決めなければいけません。
bind+update レシピの代わりは switch
コマンドを使うことです。これは基本的に、ツリーの中のコミットされていない変更がマージされること以外は、既存のブランチを除去して新しい位置で checkout
を再び実行することと同じです。
注: 場合によってバインドされた異なるブランチの適切なキャッシュをチェックアウトするために
switch
はコミットされた変更を廃棄するので、ローカルにコミットされているが最も最近バインドされたブランチにまだコミットされていない変更が存在する場合意図的に失敗します。
これらの変更を本当に廃棄したいのであれば、 --force
オプションを使います。
軽量型チェックアウトを切り替える¶
軽量型チェックアウトでは、ローカルのコミットは存在せず、 switch
は作業ツリーが関連づけられたブランチを効率よく選びます。
1つの可能なセットアップ方法は、ローカルツリーなしのリポジトリと軽量チェックアウトを組み合わせて使うことです。
これによって取り組むものを簡単に切り替えることができます。例です:
bzr init-repo --no-trees PROJECT
cd PROJECT
bzr branch bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
bzr checkout --lightweight trunk my-sandbox
cd my-sandbox
(hack away)
この例のこの範囲でtrunk .bzr
ディレクトリを持ちますがそこでのブランチとしての作業ツリーはツリーなしのリポジトリで作られたことに注意してください。必要な数だけブランチを入手もしくは作成して必要に応じてそれらの間で切り替えることができます。例です:
(my-sandboxの中にいることを前提とする)
bzr branch bzr+ssh://centralhost/srv/bzr/PROJECT/PROJECT-1.0 ../PROJECT-1.0
bzr switch ../PROJECT-1.0
(fix bug in 1.0)
bzr commit -m "blah, blah blah"
bzr switch ../trunk
(go back to working on the trunk)
注: ブランチはローカルのみのものでも、(checkout
で作るか branch
でそれらを作った後で bind
を使うことで)リモートのブランチにバインドされたものでも可能です。
分散スタイルの、チームコラボレーション¶
分散型の開発¶
動機¶
分散型のVCSツールは共同作業の新しい方法を提供します。 これは私達が生きる現代の世界をより反映したものでより高い品質の成果を可能にします。
分散型の共用のメインラインのワークフロー¶
このワークフローにおいて、それぞれの開発者は1つもしくは複数の独自のブランチに加えて、メインブランチのチェックアウトを持ちます。 開発者は個人のブランチに取り組み、準備ができたら、それをメインラインにマージします。

他の分散型のワークフローはこの章の後ろの方で検討します。
ブランチを編成する¶
ミラーブランチ¶
開発をするために分散型のワークフローを利用する際の主要な違いはメインのローカルブランチは変更を行う場所ではないことです。 代わりに、中心ブランチのそのままのコピーとして保存されます。 すなわち、これは ミラーブランチ です。
ミラーブランチを作るためには、共用リポジトリ(まだなければ)を作りミラーを作るために branch
コマンド(もしくは checkout
)を使います。
例です:
bzr init-repo PROJECT
cd PROJECT
bzr branch bzr+ssh://centralhost/srv/bzr/PROJECT/trunk
タスクのブランチ¶
それぞれの新しい機能もしくは修正は独自のブランチの中で開発されます。 これらのブランチは 機能ブランチ もしくは タスクブランチ として言及されます - 用語はお互いに置き換えて使うことができます。
タスクブランチを作るためには、ミラーブランチに対して branch
コマンドを使います。
例です:
bzr branch trunk fix-123
cd fix-123
(hack, hack, hack)
この方法には数多くの利点があります:
- 並行して複数の変更に取り組むことができます
- 変更の間の交換が減ります
- 複数の人々は準備ができるまでpeer-to-peerモードでブランチに取り組むことができます
とりわけ、変更が他のものより料理するのに時間がかかるのであれば、レビューを求めたり、 フィードバックを適用することができます。 中心ブランチにマージする前に個別のブランチで十分な品質の作業を完了させることで、 中心ブランチの品質と安定性は以前よりも高い水準を維持します。
最新のトランクを機能ブランチにマージする¶
これを行うためには merge
コマンドを使います:
cd fix-123
bzr merge
(resolve any conflicts)
bzr commit -m "merged trunk"
機能をトランクにマージする¶
異なる分散型のワークフローの方針は変わります、 すべての開発者がメイントランクにコミットする権限を持つ最もシンプルな事例は下記のとおりです。
ミラーがチェックアウトなら:
cd trunk
bzr update
bzr merge ../fix-123
(resolve any conflicts)
bzr commit -m "Fixed bug #123"
ミラーがブランチの場合:
cd trunk
bzr pull
bzr merge ../fix-123
(resolve any conflicts)
bzr commit -m "Fixed bug #123"
bzr push
タスクブランチをバックアップする¶
集中型ワークフローの副作用の1つは変更がITオペレーションの一部としてバックアップされる中心位置にしょっちゅうコミットされることです。 タスクブランチを開発するとき、作業内容を中心位置に公開することはバックアップになるのでよい考えです(しかし共用位置であることは必須ではありません)。 この目的のためだけにローカルのタスクブランチをバックアップサーバー上で確立されたリモートブランチにバインドするとよいかもしれません。
ゲートキーパーを利用する¶
分散型の人間のゲートキーパーのワークフロー¶
このワークフローでは、1人の開発者(ゲートキーパー) がメインブランチへのコミット権限を持つ一方で他の開発者はリードオンリーの権限のみを持ちます。 すべての開発者はタスクブランチの中で変更を行います。

開発者は彼らの作業内容をマージしたいとき、ゲートキーパーに彼らの変更をレビューして受け入れ可能であればマージするよう頼みます。 変更がレビューを失敗するとき、準備ができるまで関連のタスクブランチでさらなる開発が進みます。
このアプローチの主要な面は含まれる制御の反転です: 開発者は変更を中心ブランチに”コミット/プッシュ”するときを決めなくて済みます: コードベースはゲートキーパーの “マージ/プル” による統制された変更方法によって発展します。 複数の中心ブランチとそれぞれ異なるゲートキーパーをを持つことはとてもよい方法で、 よく採用されている方法です。。 たとえば、現在の製品リリースと次のリリースのためにそれぞれ1つづつのブランチがあります。 この場合、たいがいはバグ修正を保持するタスクブランチは両方のゲートキーパーによって通知されます。
このワークフローのすばらしい点の一つはスケーラブルであることです。 大きなプロジェクトはチームになりそれぞれのチームはゲートキーパーによって管理される ローカルマスターブランチ を持つことができます。 チームリーダーがリクエストするときにチームのマスターブランチからの変更をプライマリマスターブランチにマージするために誰かを主席ゲートキーパーに任命できます。
分散型の自動ゲートキーパーのワークフロー¶
より高い品質を得るために、すべての開発者は変更を回帰テストスイートが通ったら変更のマージとコミットだけを行う自動ゲートキーパーに投稿できることが求められます。 このようなゲートキーパーの1つはPQMと呼ばれるソフトウェアツールです。

PQMに関する詳細な情報に関しては、 https://launchpad.net/pqm を参照してください。
変更を送信する¶
動機¶
多くの分散型のシナリオでは、開発者にとってURLを公開することでタスクブランチを共有することが常に現実的であるとは限りません。 たとえば、開発者が在宅で一晩中作業をする場合、ゲートキーパーが別のタイムゾーンでレビューしてマージしたいときに開発者はタスクブランチに十分にアクセスできません。
Bazaarは手助けする巧妙な機能: マージディレクティブ を提供します。
マージのディレクティブを理解する¶
マージディレクティブを”ミニブランチ” - ブランチが作成された後の成長部分 - として考えることができます。 これは変更点を記したソフトウェアパッチですが、追加情報として中間コミット、リネームとデジタル署名のようなメタデータがつきます。
別の実用的なメタファはパケットケーキ: レシピと必要な材料を持ったマージディレクティブです。
具体的にいえば、材料とはブランチ上で加えられた全ての変更のメタデータで、レシピとはそれらの変更点をどうやってマージするかで、 merge
コマンドが共通の祖先を選ぶのに利用する情報です。
それらをどのように考えるのであれ、マージディレクティブはよいものです。 これらは簡単に作れて、メールに添付して送信するのに最適で、受け取った後でブランチと同じように処理できます。
マージディレクティブを作る¶
マージディレクトリを作りオプションとして送信するためには、 send
コマンドを使います。
デフォルトでは、 send
はマージディレクティブを ブランチのための “投稿アドレス” 、
通常はリード開発者もしくは開発メーリングリストにEメールを送信します。
オプションなしの send
はマージディレクティブを作り、Eメールツールを作動させて添付し、少しの説明文を追加するための準備をします。
(この設定方法の詳細に関してはオンラインヘルプの send
と
リファレンスマニュアルの 構成設定
を参照)
大抵のプロジェクトではパッチ付きのメールに説明文を追加し、パッチの理由と内容を説明します。 これによってレビューワは行単位の差分に入る前にいくらかの事情を理解できます。
代わりに、 --output
(or -o
) オプションが渡されると、 send
はマージディレクティブをファイルに書くので、あなた自身にメールを送り、
それを検査し、後の使用のために保存できます。
-
の出力ファイルが渡されると、ディレクティブはstdoutに書き込まれます。例です:
cd X-fix-123
bzr send -o ../fix-123.patch
マージのディレクティブを適用する¶
merge
と pull
コマンドを使うことでマージディレクティブはブランチと同じ方法で適用できます
これらはBazaarを使わない上流のプロジェクトとコミュニケーションをするときにも便利です。
とりわけ、マージディレクティブ内の変更全体のプレビューは無地のソフトウェアパッチのようになるので、たとえば彼らは patch -p0
を使用してそれらを適用できます。
その他のトピック¶
これからの長い旅¶
前の章でBazaarがあなた自身と他の人との共同作業を生産的にすることを手助けしてくれる方法について確固として理解して頂けることを筆者達は願っております。 初めてBazaarを学んでいるのであれば、一度習得したら、このマニュアルに戻るためにすでにカバーされた手順を試すとよいかもしれません。
残りの章ではBazaarをより適切に使うためのさまざまなトピックをカバーしています。 明言されない限り、この章と残りの章はそれぞれ独立しているので好きな順序で 読むことができます。
疑似マージ¶
チェリーピッキング¶
時々、ブランチの変更の全部ではなく一部だけを選んでマージすることが便利であることがあります。 これは一般的に チェリーピッキング(cherrypicking) として言及されます。
チェリーピッキングが役に立ついくつかの事例:
- メインの開発ブランチから修正の一部を取り出してリリースブランチに取り込む
- 実験ブランチから改善内容を選別して機能ブランチに取り込む
foo
ブランチのリビジョン Xによってなされた変更のみをマージするためには:
bzr merge -c X foo
foo
ブランチのリビジョンXまでの変更のみをマージするためには:
bzr merge -r X foo
foo
のリビジョンX以降の変更のみをマージするためには:
bzr merge -r X.. foo
foo
ブランチのリビジョンXからリビジョンYまでの変更のみをマージするには:
bzr merge -r X..Y foo
通常のマージと同じように、チェリーピックは明示的にコミットしなければなりません。
これを行う前に、 bzr diff
を利用した変更を見て何かあればテストスイートを実行するとよいでしょう。
通常のマージとは異なり、Bazaarは現在はチェリーピックを追跡しません。 具体的に言うと、変更は通常のコミットと同じようになり、他のブランチから来た(内部の)変更履歴は失われます。 上記のようなチェリーピックが役に立つ場面では、このことはたいてい重大な問題ではありません。 フルマージが後で行われることはけっしてないと言える十分な理由があるからです。 そうではない場面では、変更が再びマージされたときにまた衝突を解消する必要があります。
親のないマージ¶
チェリーピックに関連したテクニックとして、マージ元のリビジョンを参照せずに、 コミット前に親リビジョンを忘れることができます。 こうすると、このマージで行われた全ての変更が、1回のコミットで行われたような 効果があります。 マージしたあと、コミットする前に次のコマンドを実行します。
bzr revert --forget-merges
これで、作業ツリー内の変更は残したまま、その変更がどこからマージされたかの 記録だけを削除します。そして、次のコミットではマージされたリビジョンに 関する情報が一切ない状態で、全ての変更を記録します。
この機能は、「きれいな」履歴を作りたいユーザーに取って便利なものですが、 Bazaarはもともとマージされた履歴を段階的に表示する機能を持っているので、 失った履歴の価値が履歴のきれいさの価値を上回らないように気をつける必要があります。 特に、この機能を使うとマージ元の変更だけを取り込んでその変更のマージ元を 記録しないので、後で同じマージ元からマージしようとすると余計なコンフリクトを 発生させる可能性があります。
リバースチェリーピッキング¶
チェリーピッキングは一連の変更を元に戻すことができます。この場合、リビジョン範囲の上界(upper bound)が下界(lower bound)よりも 小さく なります。 たとえば、リビジョン10の変更を取り消すためのコマンドはこうなります:
bzr merge -r 10..9
どこかから、すべてではない大半の変更を得たい場合通常のマージをした後に少しのリバースチェリーピックを行うとよいでしょう。
コミットされていない変更をマージする¶
複数のブランチを持っており、間違えて別のブランチを変更し始めた場合、訂正をとるステップは次のとおりです。
ブランチ bar
で作業したかったのに、ブランチ foo
で作業を始めてしまったという場合を前提とします:
bar
ブランチに移動するbzr merge --uncommitted foo
を実行する- やってくる変更をチェックする (
bzr diff
) foo
ブランチに変更するbzr revert
を実行する
リベースする¶
通常のマージの別のオプションは リベース(rebase) です。
すなわち、現在のブランチが本来とは異なる地点をベースにするようにします。
リベースは rebase
プラグインによって提供される rebase
コマンドによってサポートされます。
rebase
コマンドは現在の作業ディレクトリ内のリベースされるブランチ上で別のブランチの位置をとります。
ブランチが指定されないと親のブランチが使われ、通常これは望まれる結果です。
最初のステップは現在のブランチのものであるが親のブランチではないリビジョンを特定することです。 現在のブランチはターゲットブランチと同じリビジョンに設定され、それぞれのリビジョンはブランチのトップで再現されます。 プロセスの終了時に現在のブランチがターゲットの最終リビジョンからブランチされたようになります。
再現されるそれぞれのリビジョンがツリーの中で衝突を起こすことがあります。
これが起きたらコマンドは停止してそれらを修正しなければなりません。
merge
するためにコミットを解消し、それらが解消されたものとしてマークするために
bzr resolve
を実行します。
すべての衝突を解消したら、リベースオペレーションを続けるために bzr rebase-continue
を実行します。
衝突に遭遇せず続けないことを決めたら、 bzr rebase-abort
を実行できます。
リプレイされるコミットの一覧を表示するために rebase-todo
を利用することもできます。
注: マージトラッキング機能が貧弱なVCSツールから来たユーザーの中にはリベースを好む人がいます。 古いツールでの作業方法に似ている、もしくは”完璧にきれいな” 履歴が重要だからです。 Bazaarでリベースする前に、通常のマージがベターな選択肢ではないのか考えてください。 とりわけ、始める前にプライベートなブランチをリベースするのは大丈夫ですが、 他の誰かとブランチを共有した後のリベースは 強く非推奨 です。
Shelving Changes¶
ときどき、作業ツリーから一時的に変更点を取り除いて、あとで元に戻したいことがあるかもしれません。
たとえば何か作業中に小さいバグフィックスを見つけてコミットする場合などです。
Bazaarは変更を shelf
(書棚)に保存する機能を持っています。
後で変更を元に戻したくなったときは、 unshelve
を使って作業ツリーに戻すことができます。
たとえば、一つか複数の変更がされた作業ツリーを考えて見ます...:
$ bzr diff
=== modified file 'description.txt'
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
===============
These plugins
-by Michael Ellerman
+written by Michael Ellerman
provide a very
fine-grained 'undo'
facility
@@ -11,6 +11,6 @@
This allows you to
undo some of
your changes,
-commit, and get
+perform a commit, and get
back to where you
were before.
shelve
コマンドはインタラクティブにどの変更を作業ツリーに保留しておきたいのかを質問します。:
$ bzr shelve
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
===============
These plugins
-by Michael Ellerman
+written by Michael Ellerman
provide a very
fine-grained 'undo'
facility
Shelve? [yNfrq?]: y
--- description.txt
+++ description.txt
@@ -11,6 +11,6 @@
This allows you to
undo some of
your changes,
-commit, and get
+perform a commit, and get
back to where you
were before.
Shelve? [yNfrq?]: n
Shelve 2 change(s)? [yNfrq?]', 'y'
Selected changes:
M description.txt
Changes shelved with id "1".
もしたくさんの変更が作業ツリーにあるのであれば、 shelve
コマンドにファイルのリストを渡して、それらのファイルの変更だけについて質問されるようにすることができます。
変更を shelve した後に diff
コマンドで作業ツリーに期待する変更だけが残っていることを確認するとよいでしょう。:
$ bzr diff
=== modified file 'description.txt'
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
===============
These plugins
-by Michael Ellerman
+written by Michael Ellerman
provide a very
fine-grained 'undo'
facility
よし! - コミットする準備ができました:
$ bzr commit -m "improve first sentence"
後になって、shelveした変更を作業ツリーに unshelve
コマンドで戻します:
$ bzr unshelve
Unshelving changes with id "1".
M description.txt
All changes applied successfully.
もし望むのであれば、複数のアイテムをshelfに置くことができます。
通常 unshelve
が実行されるたびに最も最近 shelve された変更が元に戻されます。
明示的にどの変更を戻すのかを指定することで別の順序で unshelve することもできます。
Bazaarはshelveされた後に変更があっても、shelfの変更を作業ツリーにマージするので、衝突が発生するかもしれません。 その場合は通常のマージ後と同じように衝突を解決しなければなりません。
Filtered views¶
Filtered view の紹介¶
Viewはtreeに対するマスクを提供し、ユーザーはtreeの一部分に集中できるようになります。 このマスキングが役に立ついくつかの場面があります。たとえば、大きなプロジェクトの技術ライターやテスターはプロジェクトのうち一部のディレクトリやファイルだけを扱います。
開発者は大規模な変更をviewを使っていくつかのコミットに分解したいと思うかもしれません。 shelve
unshelve
がいくつかの変更を後のコミットまでとっておくのに対して、viewは次のコミットに(何を含めないかではなく)何を含めるかを指定します。
viewを作った後は、ファイルリストをサポートするコマンド - status, diff, commit, etc - に暗黙的に毎回そのファイルリストが渡されます。 それらのコマンドに明示的にファイルリストを渡すことも可能ですが、指名するファイルは現在のviewの中にないといけません。 対照的に、ツリーを対象とするコマンド - pull, merge, update, etc - はviewが作られた後もツリー全体に対して操作しますが、現在のviewに関係するもののみを報告します。 どちらのケースでも、Bazaarはユーザーに毎回viewが使われていることを報告するので、操作や出力がマスクされていることが判ります。
ノート: filtered view は 2a フォーマット(Bazaar 2.0 以降でデフォルトの フォーマット)でのみ有効です。
view を作る¶
次のように, view
コマンドにファイルやディレクトリを指定することでviewを作ります:
bzr view file1 file2 dir1 ...
出力は:
Using 'my' view: file1, file2, dir1
現在のviewをリストする¶
現在のviewを見るには、 view
コマンドに引数をつけないで実行します:
bzr view
もしviewが無ければ、 No current view.
というメッセージが出力されるでしょう。
そうでなければ、現在のviewの名前と内容が次のように表示されます:
'my' view is: a, b, c
viewを切り替える¶
ほとんどの場合、viewは「変更を選択するために作られて、変更がコミットされると削除される」という具合に短い期間で使われます。 それ以外の場合では、viewに名前をつけてそれを切り替えたい場合があるかもしれません。
名前つきviewを宣言してそれに切り替えるには:
bzr view --name view-name file1 dir1 ...
たとえば:
bzr view --name doc NEWS doc/
Using doc view: NEWS, doc/
名前つきviewを見るには:
bzr view --name view-name
名前つきviewに切り替えるには:
bzr view --switch view-name
全ての名前つきviewの一覧を得るには:
bzr view --all
一時的にviewを無効にする¶
現在のviewを削除せずに無効にしたい場合、 off
という名前の仮想viewに切り替えることができます。これは、ツリー全体を一つか二つのコマンドで操作する必要があり(例: merge)、しかしその後に元のviewに戻りたい場合に便利です。
現在のviewを削除せずに無効にするには:
bzr view --switch off
ツリー全体に対する操作が終わったら、元のviewの名前を指定して戻ることができます。たとえば、デフォルトの名前が使われて他のであれば:
bzr view --switch my
viewを削除する¶
現在のviewを削除するには:
bzr view --delete
名前つきviewを削除するには:
bzr view --name view-name --delete
全てのviewを削除するには:
bzr view --delete --all
注意点¶
view を定義しても作業ツリー内のほかのファイルを削除するわけではありません。単に作業ツリーに対する “レンズ” を提供するだけです。
view は作業ツリーのメタデータとして保存されます。pull, push, update といったブランチコマンドを使っても他の作業ツリーに伝播しません。
view はファイルパスの形で定義されます。もしview内のファイルをview外に
移動したのであれば、view はそのファイルを追跡しません。
たとえば、viewが doc/
と定義されていて doc/NEWS
を NEWS
に移動しても view は doc/
に定義されたままで、 doc/
と NEWS
のように変更されたりはしません。同じように、view内のファイルを削除してもviewからはそのファイルパスは削除されません。
現在のviewを利用するコマンドは:
- status
- diff
- commit
- add
- remove
- revert
- mv
- ls
ツリー全体に対する操作だけれども現在のviewの中だけを報告するコマンドは:
- pull
- update
- merge.
現在のところ、多くのコマンドがviewを無視します。ニーズがあるコマンドから徐々に上の対応リストに追加されていくでしょう。 いくつかのコマンドは全体図を見るのがより適しているために、viewを無視したままになるでしょう。このタイプのコマンドには次のものがあります:
- log
- info
スタックブランチを利用する¶
ユースケース¶
あるプロジェクトで作業しようとしていて、公開されているリポジトリに対して 読み込みアクセスはできるものの書き込みができないとしましょう。 公開されているリポジトリと同じホストで自分のブランチを公開したりバックアップ したりする場合、スタックブランチを使うことができるかもしれません。
スタックブランチの他のユースケースとしては、実験的なブランチと、コード ホスティングサイトが挙げられます。これらのシナリオではスタックブランチの 特性がぴったりあいます。
スタックブランチとは?¶
スタックブランチ(stacked branch)は別の(スタック先)ブランチのリビジョンを 見つける方法を知っています。 スタックブランチはスタック先ブランチには存在しないユニークなリビジョンのみを 保存することで、ブランチの作成を高速にしたり、ディスク利用効率を向上します。 これらの観点から、スタックブランチは共用リポジトリと似ています。 しかしながら、スタックブランチは追加の利点があります:
- 新しいブランチはスタックされたブランチとは完全に異なる位置に設置できます。
- スタックブランチを削除すれば(共用リポジトリだと残ってしまう) リビジョンの情報も削除されます
- セキュリティは共用リポジトリよりも向上しています。 スタック先のリポジトリはスタックブランチにコミットする開発者に対して 物理的にリードオンリーだからです。
スタックブランチを作成する¶
スタックブランチを作成するには、branchコマンドの stacked
オプションを使用します。
例です:
bzr branch --stacked source-url my-dir
このコマンドによって my-dir
がローカルリビジョンなしのスタックブランチとして作成されます。
定義されると、 source-url
に関連づけされた公開ブランチは
スタックドオン(stacked on) の位置として使われます。
さもなければ、 source-url
は スタックドオン の位置になります。
スタックチェックアウトを作成する¶
スタックチェックアウトを直接作成する機能はまもなくサポートされる予定です。 それまでの間、2段階の処理が必要です:
- 上記で示されたようにスタックブランチを作成する。
reconfigure
もしくはbind
コマンドのどちらかを利用して ブランチをチェックアウトに変換する。
スタックブランチをプッシュする¶
多くのプロジェクトの大部分の変更は
開発トランク or 現在の安定 ブランチといった既存のブランチを基礎としています。
これらの1つにスタックされた新しいブランチの作成は push
コマンドを利用して
次のように簡単にできます:
bzr push --stacked-on reference-url my-url
このコマンドでは、 reference-url
にスタックした新しいブランチを my-url
に作成し、 reference-url
には無いリビジョンだけをそこに格納します。
my-url
は reference-url
と同じホストでも構いません。
ローカルブランチがスタックブランチとして作成された場合、
push
するには --stacked
オプションを使うことが可能で
スタック先の位置を省略できます。:
bzr branch --stacked source-url my-dir
cd my-dir
(hack, hack, hack)
bzr commit -m "fix bug"
bzr push --stacked
この使い方は、上述したユースケースにマッチしています。
スタックブランチの制限¶
スタックブランチに関して覚えておくべき大事なことは、ほとんど全てのオペレーションでスタック先ブランチが必要になることです。 これは両方のブランチがローカルもしくは同じサーバーにあるときは問題にはなりません。
また、ほとんどの履歴がスタック先リポジトリに格納されているので、スタック先
リポジトリへのアクセスがネットワーク経由だった場合に bzr log
のようなコマンドが遅くなるかもしれません。
スタックするブランチを変更する¶
bzr reconfigure
コマンドを使ってスタックドオンブランチを変更したりスタックするのをやめたりすることができます。
bzr reconfigure --unstacked
を実行した場合、bzrは全ての参照されているデータをスタックドオンブランチからスタックされていたブランチにコピーしてくることに注意してください。
大きなレポジトリにおいては、これは時間がかかったりリポジトリサイズを増大させたりします。
スマートサーバーを稼働させる¶
BazaarはHTTP、FTPもしくはSFTPを通して動作するので特化したサーバーは必須ではありません。 SSH、inetd、もしくは専用モードで起動できるスマートサーバー(smart server)の選択肢があります。
ダムサーバー¶
HTTP、FTP、SFTPとHTTP-WebDAVを”ダム(dumb)”サーバーとして記述します。 これらはBazaarに支援を提供しないからです。 これらのプロトコルのどれかを通してBazaarリポジトリを利用できるようにする場合、 Bazaarはリモートからの読み込みを許可します。 実行しているBazaarコマンドの中でブランチへのURLを入力するだけです。:
bzr log http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev
BazaarはFTP、SFTPと(プラグインを通した)HTTP-WebDAVを通した書き込みをサポートします。
ハイパフォーマンスなスマートサーバー¶
ハイパフォーマンスなスマートサーバー(hpss - high-performance smart server)はいくつかのオペレーションをダムサーバーよりも遙かに高速に実行します。 開発者がパフォーマンスのチューニングを継続するので、将来のリリースではスマートサーバーを利用することで改善されるオペレーションの範囲は増えます。
高度なセキュリティの維持を可能にするために、
デフォルトでは現在のスマートサーバーはリードオンリーになります。
読み込みと書き込み権限を有効にするには、 --allow-writes
で動かします。
SSHアクセスメソッドを利用するとき、bzrは --allow-writes
オプションで自動的に実行します。
次はスマートサーバーの代替の設定方法を説明します。
SSH¶
SSHを通してBazaarを利用する際にサーバー上の特別な設定は必要ありません。
サーバーに Bazaar がインストールされていれば、 bzr+ssh
の URL を
利用することができます。 例:
bzr log bzr+ssh://host/path/to/branch
bzr がサーバーのシステムワイドな場所にインストールされていない場合、 リモートの bzr がどこにあるかをローカルの bzr に教える必要があるかも しれません。
BZR_REMOTE_PATH=~/bin/bzr bzr log bzr+ssh://host/path/to/branch
BZR_REMOTE_PATH
環境変数はリモートシステムで bzr が起動する方法を調整します。
デフォルトでは単に bzr として起動するので、 bzr 実行ファイルはデフォルトの検索パス上にあることが要求されます。
この設定を場所ごとの設定ファイルである locations.conf
に書いて
永続化することもできます。
SFTP と同じく、 ~
で始まるパスはホームディレクトリからの相対パスになります。
例えば bzr+ssh://example.com/~code/proj
のようになります。
加えて、 ~user
は user のホームディレクトリからの相対パスになります。
inetd¶
この例では /srv/bzr/repo/branchname
にブランチがある /srv/bzr/repo
内の
共用リポジトリ用に専用ユーザーの bzruser で bzr を実行する方法を示しています。
inetdからBazaarサーバーを動かすにはinetd.confエントリが必要です:
4155 stream TCP nowait bzruser /usr/bin/bzr /usr/bin/bzr serve --inet --directory=/srv/bzr/repo
クライアントコマンドを実行するとき、提供するURLは
inetd.confに渡される --directory
オプションに相対的な bzr:// です:
bzr log bzr://host/branchname
可能であれば、 ~
や ~user
で始まるパスは bzr+ssh
と同じように展開されますが、
bzr serve
に指定された --directory
オプションの外にあるホームディレクトリには
アクセスできません。
専用サーバー¶
このモードはinetdモードと同じパスとURLのふるまいを持ちます。
特定のユーザーとして実行するには、 su
を使うもしくはそのユーザーとしてログインします。
この例では公式のポート番号の 4155 上でbzrを稼働しすべてのインターフェイス上でリスンします。 これによってポート 4155 上のマシンに到達できる世界のどこからでも接続できます。
サーバー:
bzr serve --directory=/srv/bzr/repo
クライアント:
bzr log bzr://host/branchname
この例では localhost のポート 1234 で bzr serve
が実行されます。
サーバー:
bzr serve --listen=localhost --port=1234 --directory=/srv/bzr/repo
クライアント:
bzr log bzr://localhost:1234/branchname
フックを利用する¶
フックとは?¶
Bazaarのふるまいをカスタマイズする1つの方法は フック(hook) です。
フックによって特定のBazaarの特定のオペレーションの前後でアクションを実行できます。
オペレーションは commit
, push
, pull
と uncommit
を含みます。
フックとパラメータの完全なリストに関しては、ユーザーリファレンスの
フック を参照してください。
大抵のフックはクライアントで実行されますが、サーバーで実行されるものもわずかに あります。 (サーバーサイドのオペレーションの特殊なケースを扱うものは push-and-update plugin も参照。)
フックを使用する¶
フックを使用するには、 プラグインを書きます 。 新しいコマンドを作成する代わりに、このプラグインはフックを定義してインストールします。例です:
from bzrlib import branch
def post_push_hook(push_result):
print "The new revno is %d" % push_result.new_revno
branch.Branch.hooks.install_named_hook('post_push', post_push_hook,
'My post_push hook')
この例を使用するには、 push_hook.py
という名前のファイルを作り
plugins
サブディレクトリに設置します。
(プラグインをインストールしていなければ、 plugins
ディレクトリを作る必要があります)。
以上です!次回にpushすると、”The new revno is...”が表示されます。 もちろん、Pythonのフルパワーを思いとおりにできるので、フックはこれよりもはるかに手が込んでいます。 これでフックの使い方を理解したので、それらで何をするかはあなたしだいです。
プラグインのコードは2つのことを行います。
最初に、これは push
が完了した後に実行する関数を定義します。
(代わりにインスタンスメソッドもしくは呼び出し可能なオブジェクトを使用することもできます。)
すべてのpushフックは単独の引数 push_result
をとります。
2番目に、プラグインはフックをインストールします。
最初の引数 'post_push'
はフックがインストールされている場所を特定します。
2番目の引数はフック自身です。3番目の引数は 'My post_push hook'
という名前で、
これは進行メッセージとエラーメッセージで使用されます。
To reduce the start-up time of Bazaar it is also possible to “lazily” install hooks,
using the bzrlib.hooks.install_lazy_named_hook
function. This removes the need
to load the module that contains the hook point just to install the hook. Here’s lazy
version of the example above:
Bazaar のスタートアップ時間を短縮するために、フックを “遅延” インストールすることができます。
遅延インストールには bzrlib.hooks.install_lazy_named_hook
関数を使います。
遅延インストールを使えば、フックをインストールするためだけにフックポイントを含むモジュールを
ロードする必要がなくなります。
次の例は、上の例の遅延バージョンです。
from bzrlib import hooks
def post_push_hook(push_result):
print "The new revno is %d" % push_result.new_revno
hooks.install_lazy_named_hook('bzrlib.branch', 'Branch.hooks',
'post_push', post_push_hook, 'My post_push hook')
例: マージプラグイン¶
次の例は Merger.merge_file_content
フックのデモのための、完全なプラグインです。
このプラグインは、 *.xml
の名前のファイルに対する全てのマージに着いて、
Bazaar がそのマージがクリーンだと判断しても必ず「衝突」状態にします。
merge_xml.py
:
"""Custom 'merge' logic for *.xml files.
Always conflicts if both branches have changed the file.
"""
from bzrlib.merge import PerFileMerger, Merger
def merge_xml_files_hook(merger):
"""Hook to merge *.xml files"""
return AlwaysConflictXMLMerger(merger)
class AlwaysConflictXMLMerger(PerFileMerger):
def file_matches(self, params):
filename = self.get_filename(params, self.merger.this_tree)
return filename.endswith('.xml')
def merge_matching(self, params):
return 'conflicted', params.this_lines
Merger.hooks.install_named_hook(
'merge_file_content', merge_xml_files_hook, '*.xml file merge')
merge_file_content
hooks are executed for each file to be merged. For
a more a complex example look at the news_merge
plugin that’s bundled with
Bazaar in the bzrlib/plugins
directory.
merge_file_content
フックは各ファイルがマージされるたびに呼ばれます。
もっと複雑な例として、 Bazaar の bzrlib/plugins
ディレクトリに同梱されている
news_merge
プラグインも参照してください。
バージョンの情報をエクスポートする¶
詳細なバージョン情報を得る¶
最新バージョンに関する詳細な情報を出力するには version-info
コマンドを使用できます:
$ bzr version-info
revision-id: pqm@pqm.ubuntu.com-20071211175118-s94sizduj201hrs5
date: 2007-12-11 17:51:18 +0000
build-date: 2007-12-13 13:14:51 +1000
revno: 3104
branch-nick: bzr.dev
オペレーティングシステムツールもしくはスクリプトを使用して出力を簡単にフィルタリングできます。 例です:
$ bzr version-info | grep ^date
date: 2007-12-11 17:51:18 +0000
より高度な後処理のためにすべてのリビジョンに関するバージョン情報が必要であれば、
--all
オプションはその情報を実際にダンプします。
Pythonのプロジェクト¶
プロジェクトファイルをビルドするためにMakefileを使う場合、 次のようにバージョン情報用のファイルを簡単に生成できます:
library/_version.py:
bzr version-info --format python > library/_version.py
これは3つのディレクトリを含むファイルを生成します:
- version_info: 現在の状態に関する基本情報を含むディレクトリ。
- revisions: コミット時間とコミットメッセージと一緒に、 ツリーの履歴の中のすべてのリビジョンのリストを表示するディクショナリ。
--all
もしくは--include-history
が提供されない限り、デフォルトではこれは空です。 リリースバージョンに含まれる、バグ修正などを追跡したい場合に便利です。 しかし多くのプロジェクトに対してこれは必要以上の情報です。- file_revisions: プロジェクトのすべてのファイルに対する最終修正のリビジョンのリストを示すディクショナリ。 これは
$Id$
キーワードがCVSで管理されたファイルと同じように使われます。 最終修正の日付はrevisions
マップで探すことで決定されます。 デフォルトではこれは空で、--all
もしくは--include-file-revisions
によってのみ有効になります
別のフォーマットでバージョン情報を得る¶
任意のフォーマットのバージョン情報を取得するためにBazaarはテンプレートベースの方法をサポートします。
version-info
への --custom
オプションは作業ツリーのステータスに基づいて拡張された変数を含む
--template
引数を提供することで使用できます。
たとえば、現在のリビジョン番号を含むフォーマットされた文字列を伴うCヘッダーファイルを生成するには:
bzr version-info --custom \
--template="#define VERSION_INFO \"Project 1.2.3 (r{revno})\"\n" \
> version_info.h
{revno}
は作業ツリーのリビジョン番号に置き換えされます。
(上記の例があなたのOSで動作しない場合、一行ですべてのコマンドを入力してみてください)
テンプレートの中で利用できる変数の詳細な情報に関しては、
Bazaarのユーザーリファレンスの Version Info を参照してください。
特定の言語でバージョン情報をダンプするために予め定義されるフォーマットはは現在開発段階にあります。 この領域の要求に関してはメーリングリストで私達開発者に連絡して下さるようお願いします。
チェッククリーン¶
プロジェクトの内容に関する大抵の情報はリビジョンエントリを読むだけで簡単に決定できます。
しかしながら、作業ツリーがパッケージされたときにそれが最新であったこと、
もしくはローカルな修正があったことを知るためには便利です。
--all
もしくは --check-clean
のどちらかを提供することで bzr
は作業ツリーを検査して、
version_info
clean
を設定します。
同様に modified
が適切である場合に file_revisions
でエントリを設定します。
人気のあるプラグインの手短なツアー¶
BzrTools¶
概要¶
BzrToolsは便利なBazaar強化機能のコレクションです。 インストールの手引きに関しては、BzrToolsのホームページを参照してください: http://wiki.bazaar.canonical.com/BzrTools. よく使われるコマンドのサンプルは下記のとおりです。
shell¶
bzr shell
はBazaarのコマンドを理解する以上のことを行うコマンドインタープリタを起動します。
これはいくつかの利点を持ちます:
- すべてのコマンドの冒頭で
bzr
を入力する必要が無くなります。- インテリジェントな自動入力補完が提供されます。
- Bazaarのライブラリを毎回ロードする必要がないのでコマンドは少し速く動作します。
cdiff¶
bzr cdiff
は GNU/Linux、UNIXとOS Xで bzr diff
の出力の色つきバージョンを提供します。
次のようによく使われます:
bzr cdiff | less -R
bzr-svn¶
概要¶
bzr-svnによって集中型のSubversionリポジトリをまだ利用しているプロジェクトでBazaarをVCSクライアントとして使うことができます。
Subversionリポジトリへのアクセスは大部分は透明、すなわちネイティブのBazaarブランチで bzr
を使用するようにSubversionリポジトリで大部分の bzr
コマンドを直接利用できます。
多くのbzr-svnユーザーは集中型のSubversionトランクのローカルミラーを作成し、機能ブランチに取り組み、準備ができたときに変更をすべててSubversionに戻します。 これによって既存のチーム規模のプロセスとSubversionの上に現在組み込まれているツール統合フックを妨げずに分散型VCSツールの多くの利点を得られます。 本当に、これはBazaarを採用しようとしているがタイミングもしくは非技術的な利用からまだ採用していないチームのための共通の暫定ステップです
インストールの手引きに関しては、bzr-svnのホームページをご覧ください: http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion
シンプルな例¶
GNOMEプロジェクトの beagle でのシンプルな使い方です。 最初に、ブランチの保存用のローカルな共用リポジトリをセットアップしてトランクをチェックアウトします:
bzr init-repo beagle-repo
cd beagle-repo
bzr checkout svn+ssh://svn.gnome.org/svn/beagle/trunk beagle-trunk
次に、フィーチャブランチを作成してハックします:
bzr branch beagle-trunk beagle-feature1
cd beagle-feature1
(hack, hack, hack)
bzr commit -m "blah blah blah"
(hack, hack, hack)
bzr commit -m "blah blah blah"
機能がクックされたとき、トランクをリフレッシュして変更をマージします:
cd ../beagle-trunk
bzr update
bzr merge ../beagle-feature1
bzr commit -m "Complete comment for SVN commit"
トランクミラーはチェックアウトなので、それにコミットすれば実際のSubversionトランクにコミットされます。 以上です!
集中型のミラーを利用する¶
大きなプロジェクトに関しては、上記のレシピを調整すれば役立つことがしばしあります。
とりわけ、初期のチェックアウトはとても遅い可能性があるのでプロジェクトに関するすべてのSubversionリポジトリをBazaarリポジトリに一旦インポートして、
そのネイティブのBazaarリポジトリからブランチを作成します。
bzr-svnはリポジトリからリポジトリへの変換を行うために svn-import
コマンドを提供します。
使い方の例です:
bzr svn-import svn+ssh://svn.gnome.org/svn/beagle
中央のBazaarミラーを利用するために更新された上記からのレシピです:
bzr init-repo beagle-repo
cd beagle-repo
bzr branch bzr+ssh://bzr.gnome.org/beagle.bzr/trunk beagle-trunk
bzr branch beagle-trunk beagle-feature1
cd beagle-feature1
(hack, hack, hack)
bzr commit -m "blah blah blah"
(hack, hack, hack)
bzr commit -m "blah blah blah"
cd ../beagle-trunk
bzr pull
bzr merge ../beagle-feature1
bzr commit -m "Complete comment for SVN commit"
bzr push
この場合、トランクへのコミットをしてもローカルでマージをコミットするだけです。
マスターのSubversionトランクにコミットを戻すには、追加コマンド(bzr push
)が必要です。
注: トランクブランチで pull
と push
のコマンドを最初に使う際に
これらのコマンドに関連URLを渡す必要があります。
その後で、bzrはそれらを記憶します。
このセットアップの最後のピースはSubversionのものと同期される中心のBazaarミラーをSubversionのリポジトリと同期し続けるためにスクリプトを適切な場所に設置することです。 これはcronジョブを追加したり、Subversionフックを利用するなどによって行われます。
bzr-svnの制限¶
BazaarとはSubversionは異なる機能を持つ異なるツールなので何らかの相互運用問題が常に存在します。 bzr-svn 0.5.4 に関するいくつかの例です:
- Bazaarはversioned propertiesをサポートしません
- Bazaarはファイルのコピーのトラッキングをサポートしません
現在の制約の一覧に関しては、bzr-svnのウェブページ、 http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion を参照してください。
Bazaarを環境に統合する¶
ウェブブラウジング¶
概要¶
BazaarのリポジトリをWeb上で閲覧するために利用できる選択肢は幅広くあり、主要なものは Loggerhead です。 Loggerhead のホームページは https://launchpad.net/loggerhead にあります。
ダウンロードリンクを含めてこれらのパッケージの最新情報に関しては http://wiki.bazaar.canonical.com/WebInterface を参照してください。
注: プロジェクトがホストされているもしくはLaunchpadでミラーリングされている場合、 Loggerheadのコードブラウジング機能はサービスの一部として提供されます。
バグトラッカー¶
Bazaarにはコミットをプロジェクトのバグトラッカーのバグに関連づけできる機能があります。 コミットとバグの間のハイパーリンクを生成する、もしくはコミットを含むブランチで閉じたバグを自動的にマークするために、他のツール (もしくはフック) はこの情報を使うことができます。
コミットとバグを関連付ける¶
コミットを行うとき、 commit
の --fixes
オプションを利用することでバグと関連付けることができます。例です:
$ bzr commit --fixes lp:12345 -m "Properly close the connection"
このコマンドの実行によってコミットとLaunchpdのバグ12345とリンクするBazaarのメタデータが記録されます。
異なるバグトラッカーを使う場合、( lp
の代わりに) 独自のトラッカーコードを渡して代わりに使うことができます。
Bugzilla、Trac、Roundupとその他のバグ/問題トラッカーに対してこれを設定する方法の詳細に関しては、
Bazaarユーザーリファレンスの バグトラッカーの設定 を参照してください。
メタデータの記録 vs バグトラッカーの更新¶
コミット時に修正されたバグに関するメタデータの記録は完全なバグトラッカーの統合機能の中で唯一必要なものです。 Bazaarは分散型VCSなので、ユーザーがオフラインでコミットしているためバグトラッカー自身へのアクセスが不可能な場合があります。 代わりに、プロジェクトのワークフローに適切な中心位置に変更をpushするとき、バグトラッカーを更新するためにフックをインストールすることが推奨されます。
注: この2番目の処理段階はLaunchpadの外部もしくはホストされているブランチがスキャンされるときに Launchpadによって提供される統合機能の一部です。
訂正をする¶
リビジョンとバグを関連付けるこの方法にはいくつかの制限があります。 最初のものは関連づけはコミット時のみにしかできないことです。 このことは、コミットするもしくは修正した後でバグが報告することを忘れた場合、 一般的に後から差し戻してリンクを追加できないことを意味します。
これに関連したことは関連づけは不変であるという事実です。 バグがあるコミットによって修正されたものとしてマークされたが、リビジョンがバグを十分に解決しない、 もしくは後で回帰がある場合、差し戻してリンクを削除できません。
もちろん、正しいオプションで行うために最新コミットをアンドゥする bzr uncommit
が常に使われます。
これは正しくないコミットメッセージを訂正するためによく行われ、(たとえば --fixes
を通した)最新コミットに
記録されたメタデータを訂正するために等しく当てはまります。
注: 正しくないリビジョンが公開される前に uncommit
を行うのがベストです。
付録¶
リビジョンを指定する¶
リビジョンの識別子と範囲¶
Bazaarは1つのリビジョンもしくはリビジョンの範囲を指定するための豊富な表現方法を持ちます。
リビジョンの範囲を指定するには、上限と下限を ..
のシンボルで区切ります。例です:
$ bzr log -r 1..4
境界値の片方を省略できます:
$ bzr log -r 1..
$ bzr log -r ..4
コマンドの中には範囲ではなく1つのリビジョンだけをとるものがあります。例です:
$ bzr cat -r 42 foo.c
他の場合、範囲は必要ですが、範囲の長さを1つにします。
これに関連したコマンドについて、 -c
オプションは次のように使われます:
$ bzr diff -c 42
利用可能なリビジョンの識別子¶
リビジョン、もしくは範囲の境界、は 下記に示される異なるフォーマットを利用して渡すことができます。
引数の型 説明 number リビジョン番号 revno:number リビジョン番号 last:number 負のリビジョン番号 guid グローバルでユニークなリビジョンID revid:guid グローバルでユニークなリビジョンID before:rev ‘’rev’‘の左端の親 date-value 渡された日付の後の最初のエントリ date:date-value 渡された日付の後の最初のエントリ tag-name 渡されたタグにマッチするリビジョン tag:tag-name 渡されたタグにマッチするリビジョン ancestor:path ブランチからのマージされた最新のリビジョン branch:path 別のブランチの最新リビジョン submit:path 投稿ブランチの共通の祖先
これらのフォーマットの手短な紹介は下記のとおりです。 完全な詳細内容に関しては、 Bazaarユーザーリファレンスの リビジョンの識別子 を参照してください。
番号¶
正の数は現在のブランチにおけるリビジョン番号を表します。
リビジョン番号は bzr log
の出力の中で “revno”とラベルされます。
最初の10のリビジョンのログを表示するには:
$ bzr log -r ..10
負の数は最新リビジョンから数えます。-1は最後にコミットされたリビジョンです。
最新の10のリビジョンのログを表示するには:
$ bzr log -r -10..
revid¶
revid は bzr log --show-ids
や他のコマンドによって示される内部の
リビジョンIDの指定を可能にします。
例です:
$ bzr log -r revid:Matthieu.Moy@imag.fr-20051026185030-93c7cad63ee570df
before¶
- before
- ‘’rev’‘は’‘rev’’ の左端の親を指定します。 これはリビジョンの履歴で ‘’rev’’ の前に現れるリビジョン、 もしくは ‘’rev’’ がコミットされたときに最新であったリビジョンです。
‘’rev’’ はリビジョンの識別子であり連結できます。
例です:
$ bzr log -r before:before:4
...
revno: 2
...
date¶
- date
- ‘’value’’ は真夜中もしくは指定された時刻での与えられた日付の、 深夜12時か指定された時刻の後の最初の履歴エントリにマッチします。
正式な値は次のとおりです:
- yesterday
- today
- tomorrow
- YYYY-MM-DD 書式の日付
- YYYY-MM-DD,HH:MM:SS 書式の日付/時間、2番目はオプションです (コンマに注意)
“今日のログエントリすべてをください”ということを伝える適切な方法は次のとおりです:
$ bzr log -r date:yesterday..date:today
Ancestor¶
- ancestor:path
- 現在のブランチと異なるブランチ間の共通の祖先を指定します。 これはマージの目的に使われる同じ祖先です。
path はリモートブランチのURLもしくはローカルブランチへのファイルパスになります。
たとえば、 ../parent
からフォークされた以降のブランチで行われた変更を見るには:
$ bzr diff -r ancestor:../parent
Branch¶
- branch
path
は別のブランチの最新リビジョンを指定します。
path
はリモートブランチのURLもしくはローカルブランチへのファイルパスです。
たとえば、手元のブランチと別のブランチの間の違いを取得するには:
$ bzr diff -r branch:http://example.com/bzr/foo.dev
作業スペースを構成する¶
一般的なレイアウト¶
Bazaarのユーザーがプロジェクトのための作業スペースを構成するベストな方法は、次のような要素に依存します:
- ユーザーの役割: プロジェクトオーナー vs コア開発者 vs カジュアルな貢献者
- ワークフロー: プロジェクトが推奨/強制している、貢献のためのワークフロー
- サイズ: 大きいプロジェクトは小さいプロジェクトよりもリソースを要求します。
少なくとも4つの一般的なワークスペースの構成方法があります。
- lightweight checkout
- standalone tree
- feature branches
- switchable sandbox.
各レイアウトの簡単な説明を以下に記します。
軽量チェックアウト¶
このレイアウトでは、作業ツリーはローカルですがブランチはリモートにあります。 これはCVSやSVNで一般的に利用されるレイアウトで、シンプルで簡単に理解できます。
セットアップするには:
bzr checkout --lightweight URL project
cd project
作業するには:
(make changes)
bzr commit
(make changes)
bzr commit
各コミットが暗黙的に変更を同じブランチを利用している他の人に公開していることに注意してください。ただし、コミットが成功するには作業ツリーがリモートのブランチの最新の状態になっている必要があります。最新のコードを取得してマージするには、:
bzr update
スタンドアロンツリー¶
このレイアウトでは、作業ツリーとブランチは一つの場所にあります。 共有リポジトリが上位のディレクトリに無い限り、リポジトリも同じ場所に格納されます。これはBazaarのデフォルトレイアウトで、小規模から中規模の大きさのプロジェクトに適しています。
セットアップ:
bzr branch URL project
cd project
作業:
(make changes)
bzr commit
(make changes)
bzr commit
変更を中央の場所に公開する:
bzr push [URL]
pushするURLは最初の一回だけ要求されます。
もし中央の場所が、pushするまでの間に他のユーザーからの変更を受け取っていた場合、pushする前にそれらの変更をローカルブランチにmergeする必要があります:
bzr merge
(resolve conflicts)
bzr commit
代替手段として、チェックアウトを使うこともできます。ブランチと同じようにチェックアウトも履歴全体をローカルにコピーしますが、ローカルブランチがリモートの場所に束縛されているので、両方のブランチに一度にコミットされます。
注意: チェックアウトはローカルコミット+pushに比べてスマートです。 チェックアウトはまずリモートにコミットして、それが成功したときにだけローカルにもコミットします。
機能ブランチ¶
このレイアウトでは、いくつかのブランチとツリーがあって、一般的にリポジトリを共有します。 一つのブランチは “trunk” のミラーを保存していて、それ以外の作業単位(例:バグ修正や 機能追加)にはそれぞれの “機能ブランチ” を作ります。 このレイアウトはほとんどのプロジェクト、特に中規模のものにとって理想的です。
セットアップ:
bzr init-repo project
cd project
bzr branch URL trunk
機能ブランチを開始する:
bzr branch trunk featureX
cd featureX
作業する:
(make changes)
bzr commit
(make changes)
bzr commit
変更をメーリングリストに公開してレビュー&承認してもらう:
bzr send
変更を公開ブランチで公開する(たとえばLaunchpad上でmerge要求を出すために):
bzr push [URL]
変化形として、trunkをチェックアウトとして作ることもできます。 もしtrunkへのコミット権限を持っているのであれば、trunkへマージしてコミットするとその変更は暗黙的に公開されます。 他には、trunkのURLが読み込み専用だった場合(例: HTTP アドレス)、チェックアウトを利用することはローカルのtrunkミラーに間違えて変更を登録してしまうことを防止します。これはプロジェクトがPQMなどのゲートキーパー型のワークフローを利用していたときに有用です。
ローカルのsandbox¶
このレイアウトは機能ブランチのレイアウトとほぼ同じですが、機能ブランチがそれぞれ作業ツリーを持つ代わりに一つの作業ツリーを共用する点が違います。 これはgitのデフォルトレイアウトに似ていて、大きなツリー(10000ファイル以上とか)を持つプロジェクトや、ビルドによる加工物(.oや.classファイルといった)を大量に作るプロジェクトに適しています。
セットアップ:
bzr init-repo --no-trees project
cd project
bzr branch URL trunk
bzr checkout --lightweight trunk sandbox
cd sandbox
これでsandboxで作業を開始できますが、sandboxがtrunkを参照したままコミットしてしまうと、(trunkがcheckoutで無い限り)trunkが元のtrunkのミラーではなくなってしまいます。 なので、まず機能branchを作ってsandboxをそちらに紐づけましょう:
bzr branch ../trunk ../featureX
bzr switch ../featureX
この後の、変更を行ったりその変更を公開して適用してもらうまでのプロセスは機能ブランチレイアウトの時と同じです。
進んだレイアウト¶
お望みとあれば、あなたのお好みの構成に合わせてレイアウトを決めることができます。 例やアイデアについては 共有リポジトリのレイアウト を参照してください。
共用レポジトリのレイアウト¶
Bazaarは共用ブランチ内部のブランチのレイアウトを柔軟に決められるように設計されました。 この柔軟性によってユーザーはBazaarを自分のワークフローに合わせることができますが、”よい”レイアウトとは何かということを疑問に持つようになります。 ここでは代わりになるものをいくつか説明しそれぞれの利点を検討します。
言及すべき重要な点はよいレイアウトは”一般的な”ユーザーが理解できるように
ブランチの内容を何らかの形でハイライトします。
SVNにおいて これは “trunk/
” ブランチであると考えられ、
大抵のレイアウトではこの命名規約が守られています。
これを “mainline
” もしくは “dev
” と呼ぶ人もいれば、
CVSから来た人々はしばし “HEAD
” と言及します。
“SVN形式” (trunk/
, branches/
)¶
SVNからやってきた人々は次のような”標準的な”プロジェクトのレイアウトに慣れています:
repository/ # リポジトリ全体
+- trunk/ # 開発のメインライン
+- branches/ # コンテナディレクトリ
| +- foo/ # 開発中のfoo機能用ブランチ
| ...
+- tags/ # コンテナディレクトリ
+- release-X # 特定のリリースバージョンをマークするために専用ブランチ
...
Bazaarでは、これは完全に適切なレイアウトです。 SVNからやって来た人が慣れ親しめることが利点で開発の焦点を当てる場所が明確になります。
同じリポジトリで複数のプロジェクトを持つとき、SVNのレイアウトは何を行うのか少し不透明です。
project/trunk
¶
SVN用の望ましい方法はプロジェクトごとにレイアウト用のトップレベルのディレクトリを用意することです:
repository/ # リポジトリ全体
+- project1/ # コンテナディレクトリ
| +- trunk/ # project1の開発のメインライン
| +- branches/ # コンテナディレクトリ
| +- foo/ # project1のfoo機能の開発用ブランチ
| ...
|
+- project2/ # project2用のコンテナ
+- trunk/ # project2用のメインライン
+- branches/ # project2のブランチ用のコンテナ
これはBazaarでも機能します。
しかしながら、Bazaarでリポジトリを作るのは簡単で( bzr init-repo
)、
それらの主要な恩恵を受けられるのは複数のブランチが共通の祖先を共有するときです。
ですのでBazaarに対して望ましい方法は次のとおりです:
project1/ # project1用のリポジトリ
+- trunk/ # project1の開発のメインライン
+- branches/ # コンテナディレクトリ
+- foo/ # project1のfoo機能の開発用ブランチ
...
project2/ # project2用のリポジトリ
+- trunk/ # project2用のメインライン
+- branches/ # project2のブランチ用のコンテナ
trunk/project
¶
SVNで次のようなレイアウトを利用するプロジェクトもたまにあります:
repository/ # リポジトリ全体
+- trunk/ # コンテナディレクトリ
| +- project1 # project1用のメインライン
| +- project2 # project2用のメインライン
| ...
|
+- branches/ # コンテナ
+- project1/ # コンテナ (?)
| +- foo # project1の'foo'ブランチ
+- project2/
+- bar # project2の'bar'ブランチ
次のレイアウトはちょっと変形させたものです:
repository/ # リポジトリ全体
+- trunk/ # コンテナディレクトリ
| +- project1 # project1用のメインライン
| +- project2 # project2用のメインライン
| ...
|
+- branches/ # コンテナ
+- project1-foo/ # project1の'foo'ブランチ
+- project2-bar/ # project2の'bar'ブランチ
“trunk/
” 全体をチェックアウトすることで、すべてのプロジェクト用のメインラインを入手できるようにすることが、このレイアウトが採用されている理由だと筆者は考えます。
このレイアウトはBazaarでも使えますが、一般的にお勧めできません。
- 一回の
bzr branch/checkout/get
は一つのブランチを作ります。 単独のコマンドですべてのメインラインを入手する利点が得られません。 [1]repository/trunk/foo
がfoo
プロジェクトのtrunk
かtrunk
ブランチの単なるfoo
ディレクトリなのか明らかではありません。 この混乱の一部はSVNによるものです。 SVNはプロジェクトのブランチ用に使う1つのプロジェクトのファイルに対して同じ”名前空間”を使うからです。 Bazaarにおいて、プロジェクトを構成するファイルの明確な定義、もしくはブランチの位置の対立軸があります (ブランチごとに唯一の.bzr/
ディレクトリか、チェックアウトの中にたくさんの.svn/
ディレクトリかという対立軸です)
[1] | 注: NestedTreeSupport は”メタプロジェクト”を作成する方法を提供します。
メタプロジェクトはリポジトリのレイアウトにかかわらず複数のプロジェクトを集約します。
1つのプロジェクトを bzr checkout すれば、必要なサブプロジェクトがすべて手に入ります。 |
入れ子形式 (project/branch/sub-branch/
)¶
SVNではできない、Bazaarによる別のスタイルは、ブランチ同士を入れ子にすることです。
Bazaarは作業ツリーなしのリポジトリ作成(--no-trees
)をサポート(と推奨)しているのでこのスタイルが可能になります。
作業ファイルはブランチの設置場所に混ぜられていないので、 好きな名前空間にブランチを設置できます。
1つの可能性は次のとおりです:
project/ # リポジトリ全体、*と* プロジェクトのメインラインのブランチ
+ joe/ # 開発者Joeの開発のプライマリブランチ
| +- feature1/ # 開発者Joeのfeature1開発ブランチ
| | +- broken/ # feature1を開発するためのステージングブランチ
| +- feature2/ # Joeのfeature2開発ブランチ
| ...
+ barry/ # Barryの開発ブランチ
| ...
+ releases/
+- 1.0/
+- 1.1.1/
このレイアウトのアイディアはブランチ用の階層的なレイアウトを作ることです。
変更はたいていより上位の名前空間のブランチへと流れていきます。
また、このレイアウトではユーザーに独自の作業をするための場所も提供します。
このレイアウトの素晴らしい点の1つは、グローバルな branches
名前空間を散らかさずにミニブランチを置けるので、ブランチ作成が”手軽”になることです。
このレイアウトのもう一つの利点は、ブランチの名前の中で詳細な内容を指定する際に繰り返しが減ることです。
例です:
bzr branch http://host/repository/project/branches/joe-feature-foo-bugfix-10/
上と下を比較します:
bzr branch http://host/project/joe/foo/bugfix-10
また、 repository/project/branches/
ディレクトリの中のリストがあれが何かわかるかもしれません:
barry-feature-bar/
barry-bugfix-10/
barry-bugfix-12/
joe-bugfix-10/
joe-bugfix-13/
joe-frizban/
Versus こういったブランチが開発者のディレクトリに分散している。
ブランチの数が少なければ、 branches/
は一見するだけですべてのブランチが見えるという素晴らしい利点があります。
ブランチの数が多ければ、 branches/
はすべてのブランチが見えてしまうというはっきりした欠点があります。
(調べるブランチが100あるとき、興味のあるブランチを見つけるのが難しくなります)。
入れ子ブランチはたくさんのブランチよりもスケーラブルのようです。 しかしながら、それぞれの個別のブランチは見つけにくいです。 (たとえば”Joeはfoo機能ブランチでバグ修正10に取り組んでいるのか、それともbarの機能ブランチを取り組んでいるのか?”)
他の小さな利点は次のようなものです:
bzr branch http://host/project/release/1/1/1
もしくは
bzr branch http://host/project/release/1/1/2
1.1.1と1.1.2のリリースを示します。 これはリリースする数と一度に見られる能力よりも分割する方がゲインが多いかによります。
ステータスによる種類分け (dev/
, merged/
, experimental/
)¶
ブランチをbreak upする他の方法はこれらを現在のステータス順でソートすることです。 そうするとレイアウトは次のようになります:
project/ # レイアウト全体
+- trunk/ # 開発に焦点を当てたブランチ
+- dev/ # 進行中の作業用コンテナディレクトリ
| +- joe-feature1 # Joeの現在のfeature-1ブランチ
| +- barry-bugfix10 # bugfix 10に対するBarryの作業内容
| ...
+- merged/ # これらのブランチがマージされたことを示すコンテナ
| +- bugfix-12 # すでにマージされたバグ修正
+- abandonded/ # 'dead-end'と見なされているブランチ
これはたくさんの利点と欠点があります。 あまり多くない数のアクティブに開発されているブランチを見ることができるか、今までに作られた全てのブランチが見えるかという違いがあります。 古いブランチは削除しない限り失われませんが、別ディレクトリへと整理されるのでたいていの場合お目当てのブランチを見つけやすくなります。 (反対に、古いブランチは見つけにくくなります)。
このレイアウトで最大の欠点、ブランチが移動することです。
誰かが project/dev/new-feature
ブランチをフォローしているとき、
そのブランチが trunk/
にマージされると project/merged/new-feature
に移動するので bzr pull
が突然機能しなくなります。
この回避策はいくつかあります。
1つは利用者を導くために古いブランチから新しいブランチにリクエストするHTTPリダイレクトを使うことです。
bzr
>= 0.15 ではユーザーに http://old/path が http://new/path
にリダイレクトされることを教えてくれます。
しかしながら、HTTP以外の方法(SFTP、ローカルファイルシステム、など)を通してブランチにアクセスしている場合は役に立ちません。
一時的なリダイレクト用にシンボリックリンクを利用することも可能です
(シンボリックリンクがリポジトリ内にある限りトラブルはほんのわずかしかありません)。
しかし、シンボリックリンクを結局削除したくなったり、散乱の削減の恩恵を得られません。
シンボリックリンクの代わりの別の可能性は BranchReference
を使うことです。
bzr
コマンドを通してこれらを作るのは現時点では難しいですが、便利だと思う人がいれば変わるかもしれません。
これは実際には Launchpad が bzr checkout https://launchpad.net/bzr
をできるようにしている方法です。
BranchReference
は機能的にはシンボリックリンクですが、他のURLの参照ができます。
相対パスによる参照ができるように拡張されれば、HTTP、SFTP、ローカルパスを通しても動作するでしょう。
日付/リリース/その他で種類分け (2006-06/
, 2006-07/
, 0.8/
, 0.9
)¶
スケーラビリティを可能にする別の方法は”現在の”ブランチのブラウジングを許可することです。 基本的に、活発に開発されるブランチは新しく作られ古いブランチはマージもしくは廃棄されることを前提とします。
基本的に日付レイアウトは次のようになります:
project/ # projectリポジトリ全体
+- trunk/ # 一般的なメインライン
+- 2006-06/ # この月に作成されたブランチ用のディレクトリのコンテナ
| +- feature1/ # "project"の"feature1"用ブランチ
| +- feature2/ # "project"の"feature2"用ブランチ
+- 2005-05/ # 異なる月に作成されるブランチ用のコンテナディレクトリ
+- feature3/
...
これは “私の新しいブランチをどこに設置すればいいの?” という質問に素早く答えてくれます。 機能が長期間開発されるのであれば、ブランチを最新の日付にコピーして、そこで作業を続けることも道理にかなっています。 最新の日付と、そこからのさかのぼっていくことで活発なブランチを見つけることができます。 (小さな欠点は 大抵のディレクトリリストは古い順にソートされているので、多くの場合新しいブランチにたどり着くために余計なスクロールが必要になることです)。 古いブランチを新しい位置にコピーしたくない場合、ブランチを探すのが面倒になるのも欠点です。
別の候補は、リリースをターゲットにしたものです:
project/ # リポジトリ概要
+- trunk/ # メインラインの開発ブランチ
+- releases/ # リリースブランチ用のコンテナ
| +- 0.8/ # リリース0.8のブランチ
| +- 0.9/ # リリース0.9のブランチ
+- 0.8/ # リリース0.8をターゲットとするブランチ用のコンテナ
| +- feature1/ # 0.8にマージする予定の"feature1"用のブランチ
| +- feature2/ # "リリース0.8をターゲットとしたfeature2"用のブランチ
+- 0.9/
+- feature3/ # リリース0.9をターゲットとした"feature3"用のブランチ
その派生として、ブランチが 0.9
ディレクトリに入っていることが 0.9に 向けた
ブランチであることではなく 0.9 から 派生したブランチであることを意味するようにすることや、 0.8/release
が0.8ブランチの公式リリースであることを意味するようにすることが考えられます。
一般的なアイディアはリリースをターゲットにすることで、何のブランチがマージされるのを待っているのか調べることができます。 このレイアウトはブランチの状態(開発中なのか、終了してレビューを待っているのか)に関する情報を提供しません。 これは履歴を隠す効果もあり、日付ベースの種類分けと同じような利点と欠点を持っています。
シンプルな開発者名 (project/joe/foo
, project/barry/bar
)¶
別の利用できるレイアウトは、開発者ごとにディレクトリを割り当てて、その下にブランチのためのサブディレクトリを作ることです。次のようになります:
project/ # リポジトリ全体
+- trunk/ # メインラインのブランチ
+- joe/ # Joeのブランチ用のコンテナ
| +- foo/ # Joeの"project"の"foo"ブランチ
+- barry/
+- bar/ # Barryの"project"の"bar"ブランチ
このアイデアでは、branchは入れ子になっておらず、branchは開発者によってのみグループ化されます。
Launchpad で使われている派生系はこのようになっています:
repository/
+- joe/ # Joeのブランチ
| +- project1/ # Joeのブランチである"project1"用のコンテナ
| | +- foo/ # Joeの"project1"の"foo"ブランチ
| +- project2/ # Joeの"project2"ブランチ用のコンテナ
| +- bar/ # Joeの"project2"の"bar"ブランチ
| ...
|
+- barry/
| +- project1/ # Barryの"project1"のブランチ用のコンテナ
| +- bug-10/ # Barryの"project1"の"bug-10"ブランチ
| ...
+- group/
+- project1/
+- trunk/ # "project1"に焦点をあてたメイン開発
このレイアウトではそれぞれの開発者が取り組んでいるものを簡単に見ることができます。 焦点のブランチは”group” ディレクトリに保存されます。 これによって”グループ”が取り組んでいるブランチを見分けられます。
これによって異なる人々の作業内容をそれぞれ分離できますが、”プロジェクトX用のすべてのブランチ”を見つけるのが難しくなります。
Launchpad はデータベースバックエンドを伴う素晴らしいウェブインターフェイスを提供していて、”view”をこのレイアウトのトップに追加することでこの欠点を補っています。
これはそれぞれの個人が “~/public_html
” ディレクトリを持ち、そこで独自のウェブページを公開する個人用ホームページのモデルに近いです。
一般的に、集中型のプロジェクト用に共用リポジトリを作成するとき、個人単位で分割してからプロジェクト単位に分割することを望まないでしょう。
通常はプロジェクト単位で分割してから個人単位で分割するとよいでしょう。
要約¶
最後に、誰にとってもうまくいく唯一の命名規則はありません。 開発者の人数、新しいブランチが作成される頻度、ブランチのライフサイクルなどによって異なります。 自身に問いかける質問は次のとおりです:
- 寿命の長い少数のブランチを作るか、もしくはたくさんの”ミニ”機能ブランチを作るか (加えて: ミニ機能ブランチをたくさん 作りたい が現在のVCSでは苦痛なのでできないのではないか?)
- 1人で開発しているのか、大きなチームか?
- チームであれば、一般的に全員が同時に同じブランチに取り組むことを計画しているか? もしくは人々が追跡することを想定した”安定”ブランチを持つか。
Eメールを設定する¶
なぜBazaarでEメールアドレスをセットアップするのか?¶
リビジョンが作成されたとき誰がどのリビジョンをコミットしたのかわかるように Bazaarは指定されたEメールアドレスをリビジョンに保存します。 Eメールアドレスは検証されないので、それゆえ 偽造できるので、プロジェクトに関わる人々を信用しなければなりません。
加えて、リビジョンのEメールアドレスはクレジットかつ/もしくは注釈に関してリビジョンの筆者とコンタクトをとる別の方法を提供します。
Eメールアドレスをセットアップする方法¶
Eメールアドレスが設定されていない場合、Bazaarはユーザー名とホスト名に基づいて推測を試みます。 これは望む状況ではないかもしれないので、Bazaarに使うメールを伝える方法は3つ存在します:
いくつかの設定ファイルの1つにEメールを設定できます。
他の設定値のように、 bazaar.conf
で一般的な設定として設定できます。
特定のブランチ、もしくは複数のブランチの一式用に値を上書きしたい場合、 locations.conf
を利用できます。
.bzr/branch/branch.conf
も動作しますが、
他の人であってもそのブランチへのすべてのコミットで同じEメールアドレスが使われます。
優先順位は
BZR_EMAIL
環境変数が設定されている場合- Eメールが現在のブランチの
locations.conf
ファイルに対して設定されている場合。- Eメールが現在のブランチの
.bzr/branch/branch.conf
ファイルに設定されている場合。- Eメールがデフォルトの
bazaar.conf
設定ファイルで設定されている場合。- EMAIL 環境変数が設定されている場合
- Bazaarはユーザー名とホスト名から推測しようとします。
Bazaarが現在のEメールと考えるものを確認するには、 whoami
(“who am i?”) コマンドを使います:
% bzr whoami
Joe Cool <joe@example.com>
‘whoami’コマンドでEメールを設定する¶
Eメールをグローバルに設定するにはwhoamiコマンドを使用します:
% bzr whoami "Joe Cool <joe@example.com>"
もしくは現在のブランチのみの場合:
% bzr whoami --branch "Joe Cool <joe@example.com>"
これらのコマンドによってグローバルな bazaar.conf
もしくはブランチの branch.conf
ファイルがそれぞれ修正されます。
デフォルトの設定ファイルでEメールを設定する¶
デフォルトのiniファイルを使うには、 bazaar.conf
ファイル
(Unix では ~/.bazaar/
、Windowsでは %APPDATA%\bazaar\2.0\
)を作成し編集して
下記で示すようにEメールアドレスを設定します。
DEFAULTは大文字と個別を区別して、大文字でなければならないことに注意をお願いします。
[DEFAULT]
email=Your Name <name@isp.com>
iniファイルのフォーマットの詳細情報に関しては、Bazaarユーザーリファレンスの 構成設定 を参照してください。
ブランチ単位でEメールを設定する¶
2番目のアプローチは locations.conf
設定ファイルを使用してブランチごとにEメールを設定する方法です:
[/some/branch/location]
email=Your Name <name@other-isp.com>
これによってブランチのEメールアドレスは /some/branch/location
に設定され、
上記の bazaar.conf
で指定されたデフォルトの値を上書きします。
環境変数を通してEメールを設定する¶
Bazaarが利用する最後の方法は BZR_EMAIL
と EMAIL
環境変数 に対するチェックです。
一般的に、スクリプトのコンテキストでEメールを上書きするためにこの方法を利用できます。
一般的なデフォルトの値に設定したい場合、上記のiniの方法を参照して下さるようお願いします。
スパムに関する懸念事項¶
スパムの標的にされないようにEメールアドレスを共有したくない人達がいます。 公開された場所で自分でブランチもしくはチェンジセットを公開しない限り、BazaarはけっしてEメールアドレスを露出しません。 他の人があなたに作業内容に関して連絡できるように実際のアドレスを使うことを 強く お勧めしますが、必須ではありません。 メールアドレスは難読にしたり、宛先がわからず戻ってくるようにする、もしくは spamgourmet.cm のような アンチスパムサービスの検査をうけさせたりします。
Apache を使って Bazaar サーバーをたてる¶
このドキュメントでは、 Apache 2.0 と FastCGI, mod_python, mod_wsgi の どれかを利用して Bazaar の HTTP スマートサーバーをセットアップする方法を 説明します。
スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、 スマートサーバーのドキュメント を参照してください。
例¶
プレーンなHTTPで /srv/example.com/www/code を http://example.com/code/... として すでに公開しているとします。これはbzrのブランチと /srv/example.com/www/code/branch-one と /srv/example.com/www/code/my-repo/branch-two のようなディレクトリを含みます。 既存のHTTP形式のアクセス権限に加えてリードオンリーのスマートサーバーのアクセス権限を これらのディレクトリに提供したい場合を考えます。
Apache 2.0を設定する¶
FastCGI¶
最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します:
LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
FastCgiIpcDir /var/lib/apache2/fastcgi
我々の例では、http://example.com/code で /srv/example.com/www/code をすでに提供しているので 既存のApacheの設定は次のようになります:
Alias /code /srv/example.com/www/code
<Directory /srv/example.com/www/code>
Options Indexes
# ...
</Directory>
.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために 次のように変更する必要があります:
Alias /code /srv/example.com/www/code
<Directory /srv/example.com/www/code>
Options Indexes FollowSymLinks
RewriteEngine On
RewriteBase /code
RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
</Directory>
# bzr-smart.fcgiはDocumentRootの元に存在しないので、実行されるように
# AliasはこれをURLの名前空間のエイリアスにする。
Alias /srv/example.com/scripts/bzr-smart.fcgi /srv/example.com/scripts/bzr-smart.fcgi
<Directory /srv/example.com/scripts>
Options ExecCGI
<Files bzr-smart.fcgi>
SetHandler fastcgi-script
</Files>
</Directory>
この設定はFastCGIを通して /code 内部の /.bzr/smart で終わるURLに対する Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。
詳細な情報は mod_rewrite と mod_fastcgi のドキュメントを参照してください。
mod_python¶
最初に、次のようなコードを httpd.conf に追加して mod_python を設定します:
LoadModule python_module /usr/lib/apache2/modules/mod_python.so
FastCGI と同じ方法で mod_rewrite を用いて書き換えルールを定義します:
RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
変更は次のようになります:
RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py
mod_fastcgi のように、スクリプトがどのように扱われるのかも定義します:
Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
<Directory /srv/example.com/scripts>
<Files bzr-smart.py>
PythonPath "sys.path+['/srv/example.com/scripts']"
AddHandler python-program .py
PythonHandler bzr-smart::handler
</Files>
</Directory>
この設定は mod_python を通して /code 内部の /.bzr/smart で終わるURLに対するリクエストを Bazaar のスマートサーバーに渡すように指示します。
注: bzrlib が PATH の中に存在しない場合、次の行を変更する必要があります:
PythonPath "sys.path+['/srv/example.com/scripts']"
変更後は次のようになります:
PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"
詳細な情報は mod_python のドキュメントを参照してください。
mod_wsgi¶
最初に、 a2enmod wsgi などで mod_wsgi を有効にしておきます。 次に、 .bzr/smart で終わる全ての URL に対するリクエストを mod_wsgi 経由 で処理するように設定します。設定例は次のようになります。
WSGIScriptAliasMatch ^/code/.*/\.bzr/smart$ /srv/example.com/scripts/bzr.wsgi
#The three next lines allow regular GETs to work too
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/code/.*/\.bzr/smart$
RewriteRule ^/code/(.*/\.bzr/.*)$ /srv/example.com/www/code/$1 [L]
<Directory /srv/example.com/www/code>
WSGIApplicationGroup %{GLOBAL}
</Directory>
この設定では、 Apache は /code 以下の /.bzr/smart で終わる URL に 対する全てのリクエストを WSGI 経由で Bazaar のスマートサーバーに渡し、 それ以外の全てのリクエストは Apache が直接扱うようにしています。
詳細は mod_wsgi のドキュメントを参照してください。
Bazaarを設定する¶
FastCGI¶
/srv/example.com/scripts/bzr-smart.fcgi でスマートサーバーを実行するためにApacheを設定しました。 これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで サーバーをFastCGIのゲートウェイに結びつけます。次のようになります:
import fcgi
from bzrlib.transport.http import wsgi
smart_server_app = wsgi.make_app(
root='/srv/example.com/www/code',
prefix='/code/',
path_var='REQUEST_URI',
readonly=True,
load_plugins=True,
enable_logging=True)
fcgi.WSGIServer(smart_server_app).run()
fcgi のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。 これは flup の一部です。
mod_python¶
/srv/example.com/scripts/bzr-smart.py でスマートサーバーを実行するためにApacheを設定しました。 これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの ゲートウェイに結びつけます。次のようになります:
import modpywsgi
from bzrlib.transport.http import wsgi
smart_server_app = wsgi.make_app(
root='/srv/example.com/www/code',
prefix='/code/',
path_var='REQUEST_URI',
readonly=True,
load_plugins=True,
enable_logging=True)
def handler(request):
"""Handle a single request."""
wsgi_server = modpywsgi.WSGIServer(smart_server_app)
return wsgi_server.run(request)
modpywsgi モジュールは http://ice.usq.edu.au/svn/ice/trunk/apps/ice-server/modpywsgi.py で見つかります。 これは pocoo の一部でした。 modpywsgi.py を bzr-smart.py と同じディレクトリ (すなわち/srv/example.com/scripts/)に設置していることを確認してください。
mod_wsgi¶
We’ve configured Apache to run the smart server at /srv/example.com/scripts/bzr.wsgi. This is just a simple script we need to write to configure a smart server, and glue it to the WSGI gateway. Here’s what it looks like:
from bzrlib.transport.http import wsgi
def application(environ, start_response):
app = wsgi.make_app(
root="/srv/example.com/www/code/",
prefix="/code",
readonly=True,
enable_logging=False)
return app(environ, start_response)
クライアント¶
これで bzr+http:// 形式のURLやただの http:// のURLを利用できます:
bzr log bzr+http://example.com/code/my-branch
プレーンなHTTP形式のアクセスも持続します:
bzr log http://example.com/code/my-branch
高度な設定¶
BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、 WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。 唯一の要件は以下のとおりです:
- SmartWSGIApp をコンストラクトするためには、それが提供する root transport を指定する必要があります。
- それぞれのリクエストの environ dict は ‘bzrlib.relpath’ 変数の設定を持たなければなりません。
この例で使われている make_app ヘルパーは それに渡される root パスに基づいたトランスポートを伴う SmartWSGIApp をコンストラクトし、引数 prefix と`path_var` に基づくそれぞれのリクエストに対する bzrlib.relpath を算出します。 上記の例において、これは (Apacheによって設定される)’REQUEST_URI’ を取り、接頭辞の ‘/code/’ と接尾辞の ‘/.bzr/smart’ をはぎ取り、それを ‘bzrlib.relpath’ として設定するので、 ‘/code/foo/bar/.bzr/smart’ に対するリクエストは ‘foo/bzr’ の ‘bzrlib.relpath’ になります。
SmartWSGIApp を直接コンストラクトすることで、ローカルではないトランスポートに対して スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。 詳細な情報に関しては bzrlib.transport.http.wsgi のdocstringsと WSGI標準 を参照してください。
HTTP スマートサーバー経由で push する¶
HTTP スマートサーバーを通してデータをプッシュすることは可能です。
これを行うための最も簡単な方法は、 wsgi.make_app()
コールに readonly=False
を
提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。
書き込みのサポートを有効にする場合、
実際にシステム上のデータを書き込みできる人を制限するために、 .bzr/smart
URLへの権限を制限するとよいでしょう。例えば Apache で次のような設定を
します。
<Location /code>
AuthType Basic
AuthName "example"
AuthUserFile /srv/example.com/conf/auth.passwd
<LimitExcept GET>
Require valid-user
</LimitExcept>
</Location>
現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を 分けることはできません。 (認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。 しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、 プレーンなHTTPは読み込み限定のアクセスを許可することはできます。
HTTPS サイトに対してアクセスしたときに bzr が次のようなエラーを表示する 場合:
bzr: ERROR: Connection error: curl connection error (server certificate verification failed.
CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none)
You can workaround it by using https+urllib
rather than http
in your
URL, or by uninstalling pycurl. See bug 82086 for more details.
URL に https
の代わりに https+urllib
を使うことで問題を回避
できます。
詳細については bug 82086 を参照してください。
プラグインを書く¶
導入¶
プラグインはbzrのコア機能ととてもよく似ています。 これらはbzrlibから何でもインポートできます。 プラグインは標準機能を上書きすることもできますが、大抵プラグインは新しいコマンドを提供します。
新しいコマンドを作る¶
コマンドを書くには、
bzrlib.commands.Command
を継承する新しいオブジェクトを作り、 cmd_foo
と命名します。
fooはコマンドの名前です。
名前にアンダースコアが含まれるコマンドを作ると、UIではアンダースコアはハイフンとして表示されます。
たとえば、 cmd_baz_import は baz-import として表示されます。
コマンドの書き方の実例に関しては、 builtins.py
を参照して頂くようお願いします。
コマンドを作成したらファイルがインポートされるときに
bzrlib.commands.register_command(cmd_foo)
でコマンドを登録しなければなりません。
さもなければbzrはコマンドを見つけることはありません。
フックをインストールする¶
Using hooks を参照してください。
プラグインのバージョン番号を指定する¶
プラグインのバージョン番号を定義するにはタプルで version_info
を定義します。例:
version_info = (0, 9, 0)
version_info = (0, 9, 0, 'dev', 0)
プラグインの検索ルール¶
デフォルトではbzrはプラグインを見つけるために ~/.bazaar/plugins
と
bzrlib/plugins
をスキャンします。
BZR_PLUGIN_PATH
でこれを上書きできます。
(詳細は、
ユーザーリファレンス
を参照してください。)
プラグインはモジュールもしくはパッケージの形態をとることができます。
プラグインが単独のファイルであれば、構造をモジュールにできます。
プラグインが複数のファイルを持つ場合やbzrのブランチとして配布したい場合は、
構造をパッケージ、すなわち、ディレクトリの中に __init__.py
を含めます。
詳しい情報¶
他の人にも役立つと考えましたら、プラグインをBzrToolsにお気軽に寄付してください。
Bazaarの開発ガイドラインと方針の詳細に関しては Bazaar開発者ガイド を参照してください。
Licence¶
Copyright 2009-2011 Canonical Ltd. Bazaar is free software, and you may use, modify and redistribute both Bazaar and this document under the terms of the GNU General Public License version 2 or later. See <http://www.gnu.org/licenses/>.