<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bazaarユーザーガイド — Bazaar 2.7.0 ドキュメント</title> <link rel="stylesheet" href="../_static/classic.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '2.7.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <script type="text/javascript" src="../_static/translations.js"></script> <link rel="shortcut icon" href="../_static/bzr.ico"/> <link rel="search" title="検索" href="../search.html" /> <link rel="top" title="Bazaar 2.7.0 ドキュメント" href="../index.html" /> </head> <body role="document"> <div class="related" role="navigation" aria-label="related navigation"> <h3>ナビゲーション</h3> <ul> <li class="nav-item nav-item-0"><a href="../index.html">目次 (2.7.0)</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="section" id="bazaar"> <h1><a class="toc-backref" href="#id281">Bazaarユーザーガイド</a><a class="headerlink" href="#bazaar" title="このヘッドラインへのパーマリンク">¶</a></h1> <div class="contents topic" id="contents"> <p class="topic-title first">Contents</p> <ul class="simple"> <li><a class="reference internal" href="#bazaar" id="id281">Bazaarユーザーガイド</a><ul> <li><a class="reference internal" href="#id1" id="id282">紹介</a><ul> <li><a class="reference internal" href="#id2" id="id283">Bazaarの紹介</a></li> <li><a class="reference internal" href="#id10" id="id284">コアの概念</a></li> <li><a class="reference internal" href="#id19" id="id285">ワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#id29" id="id286">始める</a><ul> <li><a class="reference internal" href="#id30" id="id287">Bazaarをインストールする</a></li> <li><a class="reference internal" href="#id35" id="id288">コマンドを入力する</a></li> <li><a class="reference internal" href="#help" id="id289">helpを表示する</a></li> <li><a class="reference internal" href="#id38" id="id290">Bazaarを設定する</a></li> <li><a class="reference internal" href="#id50" id="id291">エイリアスを利用する</a></li> <li><a class="reference internal" href="#id55" id="id292">プラグインを利用する</a></li> <li><a class="reference internal" href="#id64" id="id293">Bazaarの哲学</a></li> </ul> </li> <li><a class="reference internal" href="#id72" id="id294">個人用途のバージョン管理</a><ul> <li><a class="reference internal" href="#id73" id="id295">単独で始める</a></li> <li><a class="reference internal" href="#id76" id="id296">プロジェクトを始める</a></li> <li><a class="reference internal" href="#id79" id="id297">ファイルの登録を制御する</a></li> <li><a class="reference internal" href="#id86" id="id298">変更をレビューする</a></li> <li><a class="reference internal" href="#id88" id="id299">変更を記録する</a></li> <li><a class="reference internal" href="#id92" id="id300">履歴を閲覧する</a></li> <li><a class="reference internal" href="#id99" id="id301">プロジェクトをリリースする</a></li> <li><a class="reference internal" href="#id102" id="id302">間違いを取り消す</a></li> </ul> </li> <li><a class="reference internal" href="#id115" id="id303">同僚と共有する</a><ul> <li><a class="reference internal" href="#id116" id="id304">他の人と連携する</a></li> <li><a class="reference internal" href="#id118" id="id305">プロジェクトをブランチする</a></li> <li><a class="reference internal" href="#id126" id="id306">変更をマージする</a></li> <li><a class="reference internal" href="#id132" id="id307">衝突の解消</a></li> <li><a class="reference internal" href="#id137" id="id308">変更に注釈を付ける</a></li> </ul> </li> <li><a class="reference internal" href="#id139" id="id309">集中スタイルの、チームコラボレーション</a><ul> <li><a class="reference internal" href="#id140" id="id310">集中型の開発</a></li> <li><a class="reference internal" href="#publishing-a-branch" id="id311">ブランチを公開する</a></li> <li><a class="reference internal" href="#id147" id="id312">チェックアウト機能を利用する</a></li> <li><a class="reference internal" href="#id157" id="id313">オフラインで集中型のブランチに取り組む</a></li> <li><a class="reference internal" href="#id162" id="id314">チェックアウトを再利用する</a></li> </ul> </li> <li><a class="reference internal" href="#id166" id="id315">分散スタイルの、チームコラボレーション</a><ul> <li><a class="reference internal" href="#id167" id="id316">分散型の開発</a></li> <li><a class="reference internal" href="#id170" id="id317">ブランチを編成する</a></li> <li><a class="reference internal" href="#id177" id="id318">ゲートキーパーを利用する</a></li> <li><a class="reference internal" href="#id180" id="id319">変更を送信する</a></li> </ul> </li> <li><a class="reference internal" href="#id186" id="id320">その他のトピック</a><ul> <li><a class="reference internal" href="#id187" id="id321">これからの長い旅</a></li> <li><a class="reference internal" href="#id188" id="id322">疑似マージ</a></li> <li><a class="reference internal" href="#shelving-changes" id="id323">Shelving Changes</a></li> <li><a class="reference internal" href="#filtered-views" id="id324">Filtered views</a></li> <li><a class="reference internal" href="#id199" id="id325">スタックブランチを利用する</a></li> <li><a class="reference internal" href="#id207" id="id326">スマートサーバーを稼働させる</a></li> <li><a class="reference internal" href="#id211" id="id327">フックを利用する</a></li> <li><a class="reference internal" href="#id218" id="id328">バージョンの情報をエクスポートする</a></li> </ul> </li> <li><a class="reference internal" href="#id223" id="id329">人気のあるプラグインの手短なツアー</a><ul> <li><a class="reference internal" href="#bzrtools" id="id330">BzrTools</a></li> <li><a class="reference internal" href="#bzr-svn" id="id331">bzr-svn</a></li> </ul> </li> <li><a class="reference internal" href="#id229" id="id332">Bazaarを環境に統合する</a><ul> <li><a class="reference internal" href="#id230" id="id333">ウェブブラウジング</a></li> <li><a class="reference internal" href="#id232" id="id334">バグトラッカー</a></li> </ul> </li> <li><a class="reference internal" href="#id237" id="id335">付録</a><ul> <li><a class="reference internal" href="#specifying-revisions" id="id336">リビジョンを指定する</a></li> <li><a class="reference internal" href="#organizing-your-workspace" id="id337">作業スペースを構成する</a></li> <li><a class="reference internal" href="#id250" id="id338">共用レポジトリのレイアウト</a></li> <li><a class="reference internal" href="#e" id="id339">Eメールを設定する</a></li> <li><a class="reference internal" href="#apache-bazaar" id="id340">Apache を使って Bazaar サーバーをたてる</a></li> <li><a class="reference internal" href="#writing-a-plugin" id="id341">プラグインを書く</a></li> <li><a class="reference internal" href="#licence" id="id342">Licence</a></li> </ul> </li> </ul> </li> </ul> </div> <div class="section" id="id1"> <h2><a class="toc-backref" href="#id282">紹介</a><a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id2"> <h3><a class="toc-backref" href="#id283">Bazaarの紹介</a><a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id3"> <h4>Bazaarとは?<a class="headerlink" href="#id3" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarはみんなのコラボレーションを手助けするツールです。 これは(たとえばソフトウェアのソースコードなどの)ファイルのグループの変化の段階のスナップショットを提供するためにファイルの変更を追跡します。 この情報を利用することで、Bazaarはあなたの作業と他の人の作業の成果を簡単にマージします。</p> <p>Bazaarのようなツールはバージョン管理ツール(version control systems: VCS)と呼ばれ長い間ソフトウェアの開発者の間で人気がありました。 Bazaarは使いやすく、柔軟で簡単にセットアップできるので、ソフトウェアの開発者だけでなく、テクニカルライター、ウェブデザイナー、翻訳者のようなファイルとドキュメントに取り組む人達にも理想的なツールです。</p> <p>このガイドは、個人で使うのかチームで使うのかに関わらずBazaarのインストールと使い方の手引きをします。 すでに分散型のバージョン管理システムに慣れ親しんでおりすぐとりかかりたいのであれば、このセクションを流し読みして <a class="reference internal" href="#id6">さらに学ぶ</a> のセクションに移動するとよいでしょう。</p> </div> <div class="section" id="id4"> <h4>バージョン管理システムの小史<a class="headerlink" href="#id4" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>バージョン管理ツールは数十年の間に進化してきました。 簡単に説明すると、ツールは4世代に渡ります:</p> <blockquote> <div><ol class="arabic simple"> <li>ファイルのバージョン管理ツール、たとえばSCCS、RCS</li> <li>ファイルのバージョン管理ツール - 集中型、たとえばCVS</li> <li>ファイルのバージョン管理ツール - 第二世代集中型、たとえばSubversion</li> <li>ファイルのバージョン管理ツール - 分散型、たとえばBazaar</li> </ol> </div></blockquote> <p>Bazaarの設計と実装は前世代のすべてのツールから学んだことに基づいています。 とりわけ、Bazaarは集中型と分散型の両方のバージョン管理モデルをサポートするのでツールを変更せずに複数のモデルに対応できます。</p> </div> <div class="section" id="vs"> <h4>集中型 vs 分散型<a class="headerlink" href="#vs" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>従来の多くのVCSツールはファイルのツリーに対する履歴(<strong>リポジトリ</strong>, <em>repository</em>) を提供する中央サーバーが必要です。 ファイルに対する作業に取り組むために、ユーザーはサーバーに接続してファイルを<strong>チェックアウト</strong> (<em>checkout</em>) する必要があります。 チェックアウトにより、ユーザーが修正できるツリー(<strong>作業ツリー</strong>, <em>working tree</em>)ができます。 これらの変更を記録(<strong>コミット</strong>, <em>commit</em>)するためには、集中型のサーバーにアクセスする権限が必要で、コミットをする前に作業内容を最新バージョンとマージしなければなりません。 このアプローチは集中型モデルとして知られます。</p> <p>集中型モデルは長期にわたって有用であることを示してきましたが顕著な欠点がいくつかあります。 先ず第一に、集中型のVCSはバージョン管理機能を利用するためにはサーバーに接続できることを要求します。 二番目に、集中型のモデルは変更の <strong>スナップショットの記録</strong> のふるまいと変更の <strong>公開</strong> のふるまいと密接にリンクさせます。 これは状況によってはよいこともありますが別の状況では品質にわるい影響を与えることがあります。</p> <p>分散型のVCSツールは単独の集中型のレポジトリではなく複数のレポジトリをユーザーとチームに持たせます。 Bazaarでは通常、履歴はバージョン管理されているコードと同じ場所に保存されます。 これによってユーザーは、オフラインであってもコミットするべきタイミングで変更をコミットできます。 ネットワークのアクセスは変更を公開するもしくは別の場所の変更にアクセスするときのみ求められます。</p> <p>実際、分散型VCSツールを賢く使うことでオフライン作業を超えたいくつかの開発者にとっての利点があります。</p> <blockquote> <div><ul class="simple"> <li>開発者が実験用のブランチを作るのが簡単になります</li> <li>仲間とのアドホックなコラボレーションが簡単になります</li> <li>ルーチンタスクの時間が減ります - より創造的な活動に時間を割けます</li> <li>“feature-wide” コミットの利用を通してリリース管理の柔軟性が増します</li> <li>トランクの質と安定性を高い水準で維持でき、それによって作業者のストレスが少なくなります</li> <li>オープンなコミュニティにおいて:<ul> <li>コア開発者ではない人が作成と変更の維持をしやすくなります</li> <li>コア開発者が外部の開発者と共同作業をしてコアのチームに組み込むことが楽になります</li> </ul> </li> <li>会社において、分散されたチームや外部のチームと連携するのが簡単になります</li> </ul> </div></blockquote> <p>分散型VCSツールの集中型より優れた点の詳細な一覧に関しては、 <a class="reference external" href="http://wiki.bazaar.canonical.com/BzrWhy">http://wiki.bazaar.canonical.com/BzrWhy</a> を参照してください。</p> </div> <div class="section" id="id5"> <h4>Bazaarの主要な機能<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarは現存する唯一のVCSツールではありませんが、多くのチームとコミュニティにとってよい選択肢になる優れた機能をいくつか持ちます。 別のVCSツールとの比較の要約はBazaarのWiki、 <a class="reference external" href="http://wiki.bazaar.canonical.com">http://wiki.bazaar.canonical.com</a> で見つかります。</p> <p>多くの機能の中で、とりわけ強調するものがあります: BazaarはPythonで書かれた完全にフリーなソフトウェアです。 結果として、改善に貢献することは簡単です。 手を貸して頂けるのであれば、 <a class="reference external" href="http://wiki.bazaar.canonical.com/BzrSupport">http://wiki.bazaar.canonical.com/BzrSupport</a> を参照して頂くようお願いします。</p> </div> <div class="section" id="id6"> <h4>さらに学ぶ<a class="headerlink" href="#id6" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このマニュアルではBazaarの簡単な紹介と効果的な使い方を提供します。 すべてのユーザーは、少なくとも次の点について書かれたこの章の残りを読むことが推奨されます:</p> <blockquote> <div><ul class="simple"> <li>ユーザーが知る必要のある中心的な概念を説明します</li> <li>Bazaarを利用した人気のある方法をいくつか紹介します</li> </ul> </div></blockquote> <p>2-6章ではさまざまなタスクを実現するためにBazaarを使う方法を詳しく説明します。 Bazaarを使い始めた後で最初から最後まで読むことをほとんどの方にお勧めします。 7章とそれ以降はコアの機能を理解した上でBazaarを利用する際に手助けになる追加情報を提供します。 この教材は必要なときに任意の順番で読むことができます。</p> <p>すでに他のバージョン管理ツールに慣れ親しんでいるのであれば、次のドキュメントを読んですぐに始めるとよいでしょう:</p> <blockquote> <div><ul class="simple"> <li><a class="reference external" href="../mini-tutorial/index.html">5分でBazaar</a> - ミニチュートリアル</li> <li><a class="reference external" href="../quick-reference/index.html">Bazaarクィックスタートカード</a> - よく使われるコマンドを1ページにまとめた要約。</li> </ul> </div></blockquote> <p>加えて、オンラインのヘルプと <a class="reference external" href="../user-reference/index.html">Bazaarユーザーリファレンス</a> は利用可能なコマンドとオプションのすべての詳細を提供します。</p> <p>このマニュアルがお役に立てることを願っております。Bazaarの残りのドキュメントの改善を提案したいのであれば、 メーリングリスト(<a class="reference external" href="mailto:bazaar%40lists.canonical.com">bazaar<span>@</span>lists<span>.</span>canonical<span>.</span>com</a>)に連絡して頂けるようお願いします。</p> </div> </div> <div class="section" id="id10"> <h3><a class="toc-backref" href="#id284">コアの概念</a><a class="headerlink" href="#id10" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id11"> <h4>単純なユーザーモデル<a class="headerlink" href="#id11" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarを使うために理解する必要のある概念は4つあります:</p> <ul class="simple"> <li><strong>リビジョン(Revision)</strong> - 取り組むファイルのスナップショット</li> <li><strong>作業ツリー(Working tree)</strong> - バージョン管理されたファイルとサブディレクトリを含むディレクトリ</li> <li><strong>ブランチ(Branch)</strong> - ファイルの履歴を記述する、順序づけされたリビジョンの集合</li> <li><strong>リポジトリ(Repository)</strong> - リビジョンの貯蔵場所</li> </ul> <p>それぞれを詳しく見てみましょう。</p> </div> <div class="section" id="id12"> <h4>リビジョン<a class="headerlink" href="#id12" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>リビジョンはファイルとディレクトリの内容と形を含むそれらのツリーの状態の <strong>スナップショット</strong> です。 リビジョンはそれ自身に関連づけされたメタデータをいくつか含みます。メタデータには次のようなものが含まれます:</p> <ul class="simple"> <li>コミットした人</li> <li>コミットした時間</li> <li>コミットメッセージ</li> <li>そのリビジョンの元になった親のリビジョン</li> </ul> <p>リビジョンは不変で、グローバルかつユニークに <strong>リビジョンid (revision-id)</strong> で識別できます。 リビジョンidの例は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">pqm</span><span class="nd">@pqm</span><span class="o">.</span><span class="n">ubuntu</span><span class="o">.</span><span class="n">com</span><span class="o">-</span><span class="mi">20071129184101</span><span class="o">-</span><span class="n">u9506rihe4zbzyyz</span> </pre></div> </div> <p>リビジョンidはコミットする、もしくは他のシステムからインポートする時点で生成されます。 リビジョンidは内部で利用するときや外部ツールとの統合に必要ですが、 ブランチ固有の <strong>リビジョン番号</strong> (<em>revision numbers</em>)の方が人間に好まれるインタフェースになります。</p> <p>リビジョン番号は 1 や 42 や 2977.1.59 のようにドットで区切られた10進法の識別子でブランチに対するリビジョン番号のグラフを通してパスを追跡します。 リビジョン番号は一般的にリビジョンidよりも短く、単独のブランチの範囲では それらの関係を理解するためにそれぞれを比較できます。 たとえば、リビジョン10はリビジョン9の直後のメインライン(下記を参照)のリビジョンです。 リビジョン番号はコマンドが実行されているときに生成されます。 これらはブランチ内でどのリビジョンがチップ(すなわち最新のリビジョン)であるかに依存するからです。</p> <p>Bazaarで指定できるリビジョンとリビジョンの範囲のいくつかの方法に関しては、付録の <a class="reference external" href="specifying_revisions.html">リビジョンを指定する</a> を参照してください。 リビジョンの番号付けの詳細に関しては <a class="reference external" href="zen.html#understanding-revision-numbers">リビジョン番号を理解する</a> を参照してください。</p> </div> <div class="section" id="id15"> <h4>作業ツリー<a class="headerlink" href="#id15" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>作業ツリー(working tree)は ユーザーが編集できるファイルを保持する <em>バージョン管理されたディレクトリ</em> です。 作業ツリーは <em>ブランチ</em> に関連付けされます。</p> <p>多くのコマンドは作業ツリーをそれぞれの文脈で使います。 たとえば、 <code class="docutils literal"><span class="pre">commit</span></code> コマンドは作業ツリーの中のファイルの現在の内容を利用して新しいリビジョン番号を作ります。</p> </div> <div class="section" id="id16"> <h4>ブランチ<a class="headerlink" href="#id16" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>最もシンプルな場合、ブランチは <em>順序づけされた一連のリビジョン</em> です。 最終リビジョンは <em>チップ(tip)</em> として知られます。</p> <p>ブランチは分かれたりその後再結合(<em>marged</em> back)されたりして、グラフの形をとります。 技術的にいえば、グラフは(親と子のリビジョンの間)の有行な関係を表し、ループが存在しないので、 <em>directed acyclic graph</em> (DAG) として言及されるかもしれません。</p> <p>この名前にギョッとするかもしれませんが、ご心配なく。 覚えておくべき重要なことは次のとおりです:</p> <ul class="simple"> <li>DAGの範囲内での開発の主要なラインは <em>メインライン(mineline)</em>, <em>トランク(trunk)</em>, もしくは単に <em>左側(left hand side: LHS)</em> と呼ばれます。</li> <li>ブランチはメインラインではない開発ラインを持つことがあります。 そのとき、別のラインはある時点で始まり別の時点で終わります。</li> </ul> </div> <div class="section" id="id17"> <h4>レポジトリ<a class="headerlink" href="#id17" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>レポジトリはシンプルにいえば <em>リビジョンの保管場所</em> です。 最もシンプルな事例では、それぞれのブランチが独自のレポジトリを持ちます。別の事例では、ディスクの使用量を最適化するためにブランチに対してレポジトリを共用しています。</p> </div> <div class="section" id="id18"> <h4>概念をまとめる<a class="headerlink" href="#id18" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>上記の概念を把握したら、Bazaarのさまざまな使い方が理解しやすくなります。 Bazaarの最もシンプルな使い方は <em>スタンドアロンツリー(standalone tree)</em> で、これは1つの位置に作業ツリー、ブランチとレポジトリのすべてが含まれます。 他のよくあるシナリオには次のようなものがあります:</p> <ul class="simple"> <li><a class="reference external" href="branching_a_project.html#a-reminder-about-shared-repositories">共用リポジトリ(shared branch)</a> - 作業ツリーとブランチは同じディレクトリにありますが、リポジトリは高い階層のディレクトリに存在します。</li> <li><a class="reference external" href="stacked.html">スタックブランチ(stacked branch)</a> - 親のリポジトリと共通なリビジョンは親のリポジトリのものを利用することで、 ブランチはユニークなリビジョンだけを保存します。</li> <li><a class="reference external" href="using_checkouts.html#getting-a-lightweight-checkout">軽量チェックアウト(lightweight checkout)</a> - 作業ツリーとは別の場所にブランチが保存されます。</li> </ul> <p>Bazaarを使う最良の方法は、あなたのニーズ次第です。 次に共通のワークフローを見てみましょう。</p> </div> </div> <div class="section" id="id19"> <h3><a class="toc-backref" href="#id285">ワークフロー</a><a class="headerlink" href="#id19" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id20"> <h4>Bazaarはただのツール<a class="headerlink" href="#id20" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarは多くの異なる共同作業の方法を支援します。 このことはあるワークフローで始めて状況が変われば別のワークフローを採用できることを意味します。 “唯一の正しい方法”は存在しませんし今後も現れることはりません。 このセクションではBazaarによってサポートされる人気のあるいくつかのワークフローの手短な概要を提供します。</p> <p>これらのワークフローはBazaarの使い方の <em>一部</em> であることを念頭にお願いします。 ここに記載されていないワークフローを利用したいのであれば、下記に記載されているアイディアを足場にします。</p> </div> <div class="section" id="id21"> <h4>ソロ<a class="headerlink" href="#id21" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ソフトウェアを開発する、ドキュメントを編集するもしくは設定ファイルを変更するのであれ、簡単に使えるVCSは手助けになります。 投稿者が1人であるプロジェクトを複数管理するために単独のユーザーはこのワークフローを効率的に利用できます。</p> <img alt="../_images/workflows_single.png" src="../_images/workflows_single.png" /> <p>まったくバージョン管理を使わない場合と比べたこのワークフローの利点は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>古いバージョンのバックアップ</li> <li>前の状態へのロールバック</li> <li>履歴の追跡</li> </ul> </div></blockquote> <p>このワークフローに適切なBazaarの主要な機能は管理作業が少ない(サーバーのセットアップは不要)ことと簡単に利用できることです。</p> </div> <div class="section" id="id22"> <h4>パートナー<a class="headerlink" href="#id22" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>時に2人で変更を共有して共同作業をする必要があります。 これは一般的に <em>ソロ</em> のワークフロー (上記を参照) もしくはチーム指向のワークフロー(下記を参照)として始まります。 ある時点で、2人目の人が最初の人が行った内容(履歴も含む)を含むブランチを作ります。 適切なときにマージして変更内容を交換することで並行して作業できます。</p> <img alt="../_images/workflows_peer.png" src="../_images/workflows_peer.png" /> <p><em>ソロ</em> を上回る利点は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>変更の共有が簡単</li> <li>それぞれのテキストファイルのそれぞれの行は変更した人、時間と理由を含む特定の変更と結びつけられています。</li> </ul> </div></blockquote> <p>このワークフローを採用する場合、BazaarはCVSとSubversionに対して 次のような利点があります:</p> <blockquote> <div><ul class="simple"> <li>サーバーのセットアップが不要</li> <li>インテリジェントなマージ機能により複数回のマージ作業が苦痛では なくなります。</li> </ul> </div></blockquote> </div> <div class="section" id="id23"> <h4>集中型<a class="headerlink" href="#id23" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><em>lock-step</em> としても知られますが、これはCVSとSubversionによって推奨/強制されるワークフローと本質的に同じです。 すべての開発者が同じブランチに取り組みます。 最新の内容をチェックアウトするために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">update</span></code> を実行し、変更内容を中心位置にコミットするために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">commit</span></code> を実行します。</p> <img alt="../_images/workflows_centralized.png" src="../_images/workflows_centralized.png" /> <p>このワークフローを導入するのであればSubversionとCVSも簡単なのでよい選択肢です。 Bazaarはこのワークフローも直接サポートしていて、CVSとSubversionを上回る利点をいくつかもちます:</p> <blockquote> <div><ul class="simple"> <li>よりよいブランチとマージ</li> <li>よりよいリネームのサポート</li> </ul> </div></blockquote> </div> <div class="section" id="id24"> <h4>ローカルなコミットで集中型<a class="headerlink" href="#id24" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローは、開発者が <code class="docutils literal"><span class="pre">commit</span> <span class="pre">--local</span></code> もしくはチェックアウトをunbindして一連の変更を行うこと以外は、 <em>集中型</em> モデルと基本的に同じです。 こういった一連の変更が完了するとき、開発者は作業内容を共用のメインラインにコミットします。</p> <img alt="../_images/workflows_localcommit.png" src="../_images/workflows_localcommit.png" /> <p><em>集中型</em> を越える利点:</p> <blockquote> <div><ul class="simple"> <li>旅行の間にネットに接続していないなどのオフラインで作業できます</li> <li>誰かの作業を妨げる良くないコミットをする機会が少なくなります</li> </ul> </div></blockquote> <p>SubversionとCVSはこのモデルをサポートしません。 他の分散型VCSツールはこれをサポートしますが、Bazaarよりも直接的ではありません。</p> </div> <div class="section" id="id25"> <h4>共用のメインラインで分散型<a class="headerlink" href="#id25" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローにおいて、それぞれの開発者は独自のブランチを持ち、加えてメインブランチにコミットする権限があります。 開発者は個人のブランチに取り組み、準備ができたらそれをメインラインにマージします。</p> <img alt="../_images/workflows_shared.png" src="../_images/workflows_shared.png" /> <p><em>ローカルコミットつきの集中型</em> を越える利点は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>作業内容の編成が簡単になる - それぞれのブランチで個別の変更を開発できます。</li> <li>開発者は共同作業に取り組むときに別の人の個人ブランチをマージできます。</li> </ul> </div></blockquote> <p>SubversionとCVSはこのモデルをサポートしません。他の分散型VCSツールはサポートします。 Bazaarの多くの機能は、簡単な利用、共用レポジトリ、統合されたマージ機能とリッチなメタデータ(ディレクトリのリネームの追跡を含む)を含めてこのワークフローに有効です。</p> </div> <div class="section" id="id26"> <h4>人間のゲートキーパーで分散型<a class="headerlink" href="#id26" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローにおいて、それぞれの開発者は独自のブランチを持ち、それに加えてメインのブランチに対してリードオンリーのアクセス権限を持ちます。 1人の開発者(ゲートキーパー)はメインのブランチにコミットする権限を持ちます。 1人の開発者が彼らの作業をマージしたい場合、ゲートキーパーにマージしてくれるように頼みます。 ゲートキーパーはコードのレビューを行い、必須の基準を満たすのであれば作業内容をメインブランチにマージします。</p> <img alt="../_images/workflows_gatekeeper.png" src="../_images/workflows_gatekeeper.png" /> <p><em>共用のメインラインによる分散型</em> に対する利点は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>常にコードはメインラインに入る前にレビューされます。</li> <li>変更をメインラインに組み込むときに厳格なコントロールができます</li> </ul> </div></blockquote> <p>Bundle Buggyと呼ばれるBazaarのコンパニオンツールはどんな変更がレビュー待ちになっているのか、その変更のステータスとレビューアのコメントを追跡するのにとても便利です。</p> </div> <div class="section" id="id27"> <h4>自動的なゲートキーパーで分散型<a class="headerlink" href="#id27" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローにおいて、それぞれの開発者は独自のブランチを持つのに加えて、メインストリームにリードオンリーのアクセス権限を持ちます。 ソフトウエアのゲートキーパーはメインのブランチにコミットする権限を持ちます。 開発者が作業内容をマージしたいとき、開発者は別の人にレビューを頼みます。 レビューに合格したら、チームの方針によって、オリジナルの著者もしくは レビューワがゲートキーパーソフトウェアにマージするように頼み、 ゲートキーパーソフトウェアはマージし、コンパイルし、テストスィートを実行します。コードがパスする場合のみ、メインラインにマージされます。</p> <p>注: 代替として、レビューのステップをスキップして著者は変更を自動化されたゲートキーパーに投稿できます。 (これはコードのレビューを別のステップとしてではなくジャストインタイムのレビューを効果的に推進するペアプログラミングといった習慣を利用しているときにとりわけ適切です。)</p> <img alt="../_images/workflows_pqm.png" src="../_images/workflows_pqm.png" /> <p><em>人間のゲートキーパーによる分散型</em> に対する利点は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>コードはメインラインに入る前に常にテストされます (メインラインの完全性が高まります)</li> <li>チームの規模の成長に対応できます</li> </ul> </div></blockquote> <p>BazaarのコンパニオンツールであるPatch Queue Manager (PQM) は自動化ゲートキーパーの機能を提供します。</p> </div> <div class="section" id="id28"> <h4>ワークフローを実施する<a class="headerlink" href="#id28" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>上記のそれぞれのワークフローを実施する方法を詳しく知りたいのであれば、このマニュアルの3章から6章までを参照してください。最初に、2章で、インストール方法、一般的な使い方の手引きと設定方法に関するティップスが説明されています。</p> </div> </div> </div> <div class="section" id="id29"> <h2><a class="toc-backref" href="#id286">始める</a><a class="headerlink" href="#id29" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id30"> <h3><a class="toc-backref" href="#id287">Bazaarをインストールする</a><a class="headerlink" href="#id30" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="gnu-linux"> <h4>GNU/Linux<a class="headerlink" href="#gnu-linux" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaar のパッケージは Ubuntu/Debian, Red Hat と Gentoo を含む人気のある 大抵の GNU/Linux ディストリビューションで利用できます。 最新の手引きは <a class="reference external" href="http://wiki.bazaar.canonical.com/Download">http://wiki.bazaar.canonical.com/Download</a> を参照してください。</p> </div> <div class="section" id="windows"> <h4>Windows<a class="headerlink" href="#windows" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Windowsユーザーは、Bazaarのコアパッケージと一緒に必要な前提要件と いくつかの便利なプラグインを含むインストーラが利用できます。 最新の手引きは <a class="reference external" href="http://wiki.bazaar.canonical.com/Download">http://wiki.bazaar.canonical.com/Download</a> を参照してください。</p> <p>注: Windows上でCygwinを動かしている場合、Cygwin用のBazaarパッケージをWindows版の代わりに使わなければなりません。</p> </div> <div class="section" id="id31"> <h4>他のオペレーティングシステム<a class="headerlink" href="#id31" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>BazaarのパッケージはLinuxとWindowsだけでなく、Mac OS X, FreeBSD, Solarisを含む広い範囲のオペレーティングシステムで利用可能です。 最新の手引きに関しては <a class="reference external" href="http://bazaar-vcs.org/Download">http://bazaar-vcs.org/Download</a> を参照してください。</p> </div> <div class="section" id="id32"> <h4>ゼロからインストールする<a class="headerlink" href="#id32" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>予めビルドされたパッケージよりもソースからBazaarをビルドしたい場合、手順は次のとおりです:</p> <blockquote> <div><ol class="arabic simple"> <li>まだインストールしていなければ、バージョン2.4以降のPythonをインストールします。</li> <li><a class="reference external" href="http://wiki.bazaar.canonical.com/Download">http://wiki.bazaar.canonical.com/Download</a> もしくは Launchpad (<a class="reference external" href="https://launchpad.net/~bzr/">https://launchpad.net/~bzr/</a>)から <code class="docutils literal"><span class="pre">bazaar-xxx.tar.gz</span></code> ファイル (xxxはバージョン番号)をダウンロードします。</li> <li>tar、WinZipもしくは同等のコマンドを用いてアーカイブを解凍します。</li> <li>作成されたディレクトリをPATHに登録します。</li> </ol> </div></blockquote> <p>インストールが成功したことを確認するために、次のように <strong>bzr</strong> コマンドを試します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">version</span> </pre></div> </div> <p>このコマンドによってインストールされているBazaarのバージョンが表示されます。 このコマンドが動作しない場合、開発者が正常な動作の手助けをできるように EメールかIRCを通して開発者に連絡をして頂くようお願いします。</p> <div class="section" id="site-wide"> <h5>site-wide な場所にインストールする<a class="headerlink" href="#site-wide" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>ディレクトリにPATHを設定する代わりに、次のコマンドでにbzrをインストールすることができます。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">install</span> </pre></div> </div> <p>もしあなたがコンパイラやPythonの開発ツールを持っていない場合、 bzrは全ての拡張モジュールに対して(遅い)pure-pythonの実装を提供します。 次のコマンドを使って拡張モジュールのコンパイルなしにインストールできます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">install</span> <span class="n">build_ext</span> <span class="o">--</span><span class="n">allow</span><span class="o">-</span><span class="n">python</span><span class="o">-</span><span class="n">fallback</span> </pre></div> </div> </div> </div> <div class="section" id="id33"> <h4>開発バージョンを稼働させる<a class="headerlink" href="#id33" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarの最新の開発バージョンを常に利用したい場合があります。 バグの危険性が増すので大半のユーザーにはお勧めできないことに注意してください。 一方で、開発バージョンは(開発プロセスのおかげで)非常に安定しているので、 これを動かすことで、バグと改善内容のための変更内容を開発者に送ることが楽になります。 より多くの人が最新のソフトウェアをテストすることで開発者の手助けにもなります。</p> <p>従うべき手順は次のとおりです:</p> <blockquote> <div><ol class="arabic"> <li><p class="first">上記の方法の1つを利用してBazaarをインストールする。</p> </li> <li><p class="first">次のように開発バージョンのコピーを入手します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">bazaar</span><span class="o">-</span><span class="n">vcs</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">bzr</span><span class="o">.</span><span class="n">dev</span> </pre></div> </div> </li> <li><p class="first">作成されたディレクトリ(bzr.dev)をPATHに登録します</p> </li> </ol> </div></blockquote> <p>上級ユーザーはより早く動かすためにC言語の拡張機能をビルドもしたいことでしょう。 これは <code class="docutils literal"><span class="pre">make</span></code> と <code class="docutils literal"><span class="pre">pyrex</span></code> とCコンパイラを利用することで実現できます。 このことに関して手助けが必要であればEメールかIRCを通して連絡をして下さるようお願いします。</p> </div> <div class="section" id="id34"> <h4>複数のバージョンを稼働させる<a class="headerlink" href="#id34" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarの複数のバージョンをインストールしてそれらを切り替えることは簡単です。 これを行うためには、実行したい <strong>bzr</strong> のフルパス名を入力するだけです。 関連ライブラリは自動的に検出されます。もちろん、パス名を提供しない場合、 通常のシステムパスで見つかる <strong>bzr</strong> のコマンドが使われます。</p> <p>この機能は最新バージョンと開発バージョンの両方を走らせたい(テストしたい)場合にとりわけ役立ちます。</p> </div> </div> <div class="section" id="id35"> <h3><a class="toc-backref" href="#id288">コマンドを入力する</a><a class="headerlink" href="#id35" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id36"> <h4>ユーザーインターフェイス<a class="headerlink" href="#id36" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarに対して利用可能な数多くのユーザーインターフェイスが存在します。 コアパッケージは <strong>bzr</strong> と呼ばれるコマンドラインツールを提供し グラフィカルユーザーインターフェイス(GUI)はプラグインとして利用できます。</p> </div> <div class="section" id="bzr"> <h4>bzrを使う<a class="headerlink" href="#bzr" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>構文は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="p">[</span><span class="n">グローバルオプション</span><span class="p">]</span> <span class="n">command</span> <span class="p">[</span><span class="n">オプションと引数</span><span class="p">]</span> </pre></div> </div> <p>グローバルオプションはBazaarの動作方法に影響を与え <code class="docutils literal"><span class="pre">command</span></code> の前後に現れます。コマンド特有のオプションはコマンドの後で指定しなければなりませんが、コマンド固有の引数の前後と間で指定することができます。</p> </div> <div class="section" id="id37"> <h4>共通のオプション<a class="headerlink" href="#id37" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>下記で示されるいくつかのオプションはすべてのコマンドに対して有効です。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="28%" /> <col width="25%" /> <col width="47%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">短い形式</th> <th class="head">長い形式</th> <th class="head">説明</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>-h</td> <td>–help</td> <td>get help</td> </tr> <tr class="row-odd"><td>-v</td> <td>–verbose</td> <td>be more verbose</td> </tr> <tr class="row-even"><td>-q</td> <td>–quiet</td> <td>be more quiet</td> </tr> </tbody> </table> </div></blockquote> <p>Quietモードはエラーと警告のみを表示します。これはスクリプトで使う際に便利です。</p> <p>注: 大抵のコマンドは1つのレベルの冗長性だけをサポートします。今後これは変更されるかもしれません。 高度な冗長性を求めるためには、-vオプションを複数回指定するだけです。</p> </div> </div> <div class="section" id="help"> <h3><a class="toc-backref" href="#id289">helpを表示する</a><a class="headerlink" href="#help" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>Bazaar は組み込みのオンラインヘルプシステムを搭載していて、 次のコマンドでアクセスできます。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">help</span> </pre></div> </div> <p>help コマンドで、コマンドやコマンド以外のトピックに着いて調べることができます。 それぞれのヘルプの一覧を見るには次のようにします。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">help</span> <span class="n">commands</span> <span class="n">bzr</span> <span class="n">help</span> <span class="n">topics</span> </pre></div> </div> <p>特定のコマンドのヘルプを見るには、次の2つの形式を使うことができます。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">help</span> <span class="n">status</span> <span class="n">bzr</span> <span class="n">status</span> <span class="o">--</span><span class="n">help</span> </pre></div> </div> <p>ヘルプを検索するもしくは大きなドキュメントとして読みたい場合、 情報はBazaarのユーザーリファレンスでも手に入ります。</p> </div> <div class="section" id="id38"> <h3><a class="toc-backref" href="#id290">Bazaarを設定する</a><a class="headerlink" href="#id38" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id39"> <h4>Bazaarにあなたの名前を教える<a class="headerlink" href="#id39" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>バージョン管理システムの機能の1つは誰が何を変更したのかを追跡することです。 分散型のシステムでは、その機能を実現するためにグローバルにユニークなそれぞれの著者のための識別子が必要です。 大抵の人はそれらの1つを持っています: Eメールアドレスです。 Bazaarはあなたのユーザー名とホスト名を探し出してEメールアドレスを自動的に生成します。 Bazaarが行う推測を望まないのであれば、あなたが望む識別子を設定するために <code class="docutils literal"><span class="pre">whoami</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">whoami</span> <span class="s2">"Your Name <email@example.com>"</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">whoami</span></code> は引数なしで使われると、現在の値が表示されます。</p> </div> <div class="section" id="id40"> <h4>ネットワークプロクシを使う<a class="headerlink" href="#id40" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ネットワークが外部への接続に HTTP プロクシを必要とする場合、 <code class="docutils literal"><span class="pre">http_proxy</span></code> という環境変数を設定しなければなりません。 https 接続にもプロクシが必要なら、 <code class="docutils literal"><span class="pre">https_proxy</span></code> も設定しなければなりません。 プロクシが必要なのにこれらの環境変数が設定されていない場合、 Launchpad やその他の外部のサーバーへの接続ができなかったりタイムアウトしたりします。</p> <p>Unix では、たいていこれらの設定は <code class="docutils literal"><span class="pre">/etc/environment</span></code> か <code class="docutils literal"><span class="pre">~/.bash_profile</span></code> に書いて、 Windows ではたいていユーザープロファイルで 設定します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">http_proxy</span><span class="o">=</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">proxy</span><span class="o">.</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">3128</span><span class="o">/</span> <span class="n">https_proxy</span><span class="o">=</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">proxy</span><span class="o">.</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="p">:</span><span class="mi">3128</span><span class="o">/</span> </pre></div> </div> <p>The <code class="docutils literal"><span class="pre">no_proxy</span></code> variable can be set to a comma-separated list of hosts which shouldn’t be reached by the proxy. (See <<a class="reference external" href="http://docs.python.org/library/urllib.html">http://docs.python.org/library/urllib.html</a>> for more details.)</p> <p><code class="docutils literal"><span class="pre">no_proxy</span></code> という環境変数に、プロクシを利用しないで到達するホスト名の リストをカンマ区切りで設定できます。 (詳細は <<a class="reference external" href="http://docs.python.org/library/urllib.html">http://docs.python.org/library/urllib.html</a>> を参照してください)</p> </div> <div class="section" id="id41"> <h4>いろいろな設定方法<a class="headerlink" href="#id41" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>上の例で示したように Bazaar を設定する方法はたくさんありますが、 全てに共通している属性があります。オプションは全て以下のように なっています。</p> <ul class="simple"> <li>名前は有効な Python の識別子です。</li> <li>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.</li> <li>値は文字列です。いくつかの場面では、真偽値を得るために Bazaar は <cite>True</cite>, <cite>False</cite> のような特別な値を認識しますが、基本的にはユーザーは値として ただの文字列を渡します。</li> </ul> <p>オプションはコンテキストによってグループ化されており、オプション名は そのコンテキスト内ではユニークに識別することができます。 必要な場合、オプションは設定ファイルに保存され永続化されます。</p> </div> <div class="section" id="id42"> <h4>設定ファイル<a class="headerlink" href="#id42" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>設定ファイルは Unix の場合 <code class="docutils literal"><span class="pre">$HOME/.bazaar</span></code> に、 Windows の場合 <code class="docutils literal"><span class="pre">C:\Documents</span> <span class="pre">and</span> <span class="pre">Settings\<username>\Application</span> <span class="pre">Data\Bazaar\2.0</span></code> にあります。 この場所には3つの主要な設定ファイルがあります:</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">bazaar.conf</span></code> はデフォルトの設定オプションを記述します。</li> <li><code class="docutils literal"><span class="pre">locations.conf</span></code> は特定のブランチの位置を記述しますd</li> <li><code class="docutils literal"><span class="pre">authentication.conf</span></code> はリモートサーバーのためのクレデンシャルな情報を記述します</li> </ul> <p>それぞれのブランチも特定の値をそのブランチに設定する設定ファイルを含みます。 このファイルはブランチの中の <code class="docutils literal"><span class="pre">.bzr/branch/branch.conf</span></code> で見つかります。 このファイルは <strong>ブランチのすべてのユーザー</strong> に見えます。 あなたに固有の設定を持つブランチのための値の1つを上書きしたいのであれば、 <code class="docutils literal"><span class="pre">locations.conf</span></code> でそれを行うことができます。</p> <p><code class="docutils literal"><span class="pre">whoami</span></code> コマンドを使用してEメールアドレスを設定した後の <code class="docutils literal"><span class="pre">bazaar.conf</span></code> の内容のサンプルは次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">DEFAULT</span><span class="p">]</span> <span class="n">email</span> <span class="o">=</span> <span class="n">Your</span> <span class="n">Name</span> <span class="o"><</span><span class="n">email</span><span class="nd">@example</span><span class="o">.</span><span class="n">com</span><span class="o">></span> </pre></div> </div> <p>サポートされる構文と構成設定の詳細については、 Bazaar のユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#configuration-settings">構成設定</a> の項目を参照してください。</p> </div> <div class="section" id="id44"> <h4>アクティブな設定を確認する<a class="headerlink" href="#id44" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>現在定義されている全てのオプションを確認するには、次のコマンドを実行します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">config</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">bzr</span></code> は設定オプションをどこから取得するかを決定するためのいくつかのルールを 持っています。</p> <p>現在のポリシーでは、以下の順序でマッチする定義を設定ファイルから探します。</p> <blockquote> <div><ul class="simple"> <li>最初に <code class="docutils literal"><span class="pre">location.conf</span></code> の中の、セクション名が場所(作業ツリー、ブランチ、 リモートブランチ)にマッチするセクションが探されます。</li> <li>次に現在の <code class="docutils literal"><span class="pre">branch.conf</span></code> が探されます。</li> <li>次に <code class="docutils literal"><span class="pre">bazaar.conf</span></code> が探されます。</li> <li>最後に、いくつかのオプションはコード中で定義されたデフォルト値が設定され、 この設定は <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">config</span></code> には表示されません。 (<a class="reference external" href="../user-reference/index.html#configuration-settings">構成設定</a> を参照してください。)</li> </ul> </div></blockquote> <p>この動作は、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">config</span></code> を引数なしで実行すると理解しやすいはずです。 このコマンドを実行すると次のような表示をします。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">locations</span><span class="p">:</span> <span class="n">post_commit_to</span> <span class="o">=</span> <span class="n">commits</span><span class="nd">@example</span><span class="o">.</span><span class="n">com</span> <span class="n">news_merge_files</span> <span class="o">=</span> <span class="n">NEWS</span> <span class="n">branch</span><span class="p">:</span> <span class="n">parent_location</span> <span class="o">=</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">bazaar</span><span class="o">.</span><span class="n">launchpad</span><span class="o">.</span><span class="n">net</span><span class="o">/+</span><span class="n">branch</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span> <span class="n">nickname</span> <span class="o">=</span> <span class="n">config</span><span class="o">-</span><span class="n">modify</span> <span class="n">push_location</span> <span class="o">=</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">bazaar</span><span class="o">.</span><span class="n">launchpad</span><span class="o">.</span><span class="n">net</span><span class="o">/~</span><span class="n">vila</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">config</span><span class="o">-</span><span class="n">modify</span><span class="o">/</span> <span class="n">bazaar</span><span class="p">:</span> <span class="n">debug_flags</span> <span class="o">=</span> <span class="n">hpss</span><span class="p">,</span> </pre></div> </div> <p>各オプション定義のグループの前に表示されているスコープが、 そのオプションを定義している構成設定ファイルを表しています。</p> </div> <div class="section" id="modifying-the-active-configuration"> <span id="id46"></span><h4>有効な設定を変更する<a class="headerlink" href="#modifying-the-active-configuration" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>オプションに値を設定するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">config</span> <span class="n">opt</span><span class="o">=</span><span class="n">value</span> </pre></div> </div> <p>オプションの利用を止めるには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">config</span> <span class="o">--</span><span class="n">remove</span> <span class="n">opt</span> </pre></div> </div> </div> <div class="section" id="id47"> <h4>ルールベースのプリファレンス<a class="headerlink" href="#id47" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>いくつかのコマンドとプラグインは特定のパターンにマッチするファイルのカスタムの処理機能を提供します。 ユーザーごとにルールベースのプリファレンスが <code class="docutils literal"><span class="pre">BZR_HOME/rules</span></code> で定義されます。</p> <p>ルールが検索される検索方法と関連ファイルの詳細な構文に関する詳細については、 Bazaarのユーザープリファレンスの <a class="reference external" href="../user-reference/index.html#rules">ルール</a> の項目を参照してください。</p> </div> <div class="section" id="escaping-command-lines"> <span id="id49"></span><h4>コマンドラインのエスケープ<a class="headerlink" href="#escaping-command-lines" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>設定ファイルの中にプログラム名やコマンドラインを記述する場合、特殊な文字や スペースをその中に含めるためにクォートすることができます。 同じルールが全てのプラットフォームで有効です。</p> <p>そのルールとは、ダブルクォートで囲まれた文字列はスペースが含まれていたとしても 1つの「語」として認識され、クォート文字をクォートの中に含めるためにバックスラッシュ (訳注: 日本語環境では多くの場合バックスラッシュではなく円記号(ASCII文字の0x5c)です) を使います。例えば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">BZR_EDITOR</span><span class="o">=</span><span class="s2">"C:\Program Files\My Editor\myeditor.exe"</span> </pre></div> </div> </div> </div> <div class="section" id="id50"> <h3><a class="toc-backref" href="#id291">エイリアスを利用する</a><a class="headerlink" href="#id50" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id51"> <h4>エイリアスとは?<a class="headerlink" href="#id51" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>エイリアスは良く入力するコマンド用のショートカットを作る もしくはコマンド用のデフォルトを設定するための手軽な方法です。</p> </div> <div class="section" id="id52"> <h4>エイリアスを定義する<a class="headerlink" href="#id52" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>コマンドのエイリアスは <code class="docutils literal"><span class="pre">bazaar.conf</span></code> ファイルの <code class="docutils literal"><span class="pre">[ALIASES]</span></code> セクションで定義されます。 エイリアスはエイリアスの名前で始まり、等号(=)、コマンド列が続きます。 次のコードはALIASESセクションの例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">ALIASES</span><span class="p">]</span> <span class="n">recentlog</span><span class="o">=</span><span class="n">log</span> <span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="mf">3.</span><span class="o">.-</span><span class="mi">1</span> <span class="n">ll</span><span class="o">=</span><span class="n">log</span> <span class="o">--</span><span class="n">line</span> <span class="o">-</span><span class="n">r</span><span class="o">-</span><span class="mf">10.</span><span class="o">.-</span><span class="mi">1</span> <span class="n">commit</span><span class="o">=</span><span class="n">commit</span> <span class="o">--</span><span class="n">strict</span> <span class="n">diff</span><span class="o">=</span><span class="n">diff</span> <span class="o">--</span><span class="n">diff</span><span class="o">-</span><span class="n">options</span> <span class="o">-</span><span class="n">p</span> </pre></div> </div> <p>上記の例の説明は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li>最初のエイリアスは最新の3つのリビジョンに対するログを表示する新しい <code class="docutils literal"><span class="pre">recentlog</span></code> コマンドを作ります</li> <li><code class="docutils literal"><span class="pre">ll</span></code> エイリアスは行形式で最新の10件のログエントリを表示します。</li> <li><code class="docutils literal"><span class="pre">commit</span></code> エイリアスはツリーの中の新しいファイルが認知されない場合コミットを拒絶するデフォルトのcommitを設定します。</li> <li><code class="docutils literal"><span class="pre">diff</span></code> エイリアスは -pオプションをdiffに追加します</li> </ul> </div></blockquote> </div> <div class="section" id="id53"> <h4>定義したエイリアスを利用する<a class="headerlink" href="#id53" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>上記で定義されたエイリアスは次のように使われます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">recentlog</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">ll</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> </pre></div> </div> </div> <div class="section" id="id54"> <h4>エイリアスのためのルール<a class="headerlink" href="#id54" title="このヘッドラインへのパーマリンク">¶</a></h4> <blockquote> <div><ul class="simple"> <li>コマンドライン上で新しいオプションを指定することでエイリアスに渡されるオプションの一部をオーバーライドできます。 たとえば、 <code class="docutils literal"><span class="pre">lastlog</span> <span class="pre">-r-5..</span></code> を実行すると 10の代わりに行ベースのログエントリが5つだけ得られます。 すべての論理値型のオプションは暗黙的に逆のオプションがあるので、 <code class="docutils literal"><span class="pre">commit</span> <span class="pre">--no-strict</span></code> でcommitのエイリアスをオーバーライドできます。</li> <li>エイリアスの名前をオリジナルのコマンドと同じものにすることでエイリアスは既存のコマンドの標準のふるまいをオーバーライドできます。 たとえば、デフォルトのコミットは <code class="docutils literal"><span class="pre">commit=commit</span> <span class="pre">--strict</span></code> で変更されます。</li> <li>エイリアスは他のエイリアスを参照できません。言い換えると エイリアスの <code class="docutils literal"><span class="pre">lastlog</span></code> を作りそれを <code class="docutils literal"><span class="pre">ll</span></code> で参照しても動作しません。 これは標準のコマンドをオーバーライドするエイリアスを含みます。</li> <li> <code class="docutils literal"><span class="pre">--no-aliases</span></code> オプションをbzrのコマンドに渡すと実行時にエイリアスは無視されます。 たとえば、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">--no-aliases</span> <span class="pre">commit</span></code> を実行すると <code class="docutils literal"><span class="pre">commit</span> <span class="pre">--strict</span></code> ではなく標準のcomitコマンドが実行されます。</li> </ul> </div></blockquote> </div> </div> <div class="section" id="id55"> <h3><a class="toc-backref" href="#id292">プラグインを利用する</a><a class="headerlink" href="#id55" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id56"> <h4>プラグインとは?<a class="headerlink" href="#id56" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プラグインは主にサードパーティによって作られたBazaarのための外部コンポーネントです。 プラグインは新しい機能を追加することでBazaarを補強する能力があります。 プラグインは現在の機能を置き換えることでBazaarのふるまいを変更することもできます。 プラグインのサンプルのアプリケーションは次のとおりです:</p> <ul class="simple"> <li>コマンドをオーバーライドする</li> <li>新しいコマンドを追加する</li> <li>追加のネットワーク転送機能を提供する</li> <li>ログの出力をカスタマイズする</li> </ul> <p>プラグインを通してできるカスタマイズの可能性は際限がありません。 実際、開発者が新しい機能を公式のコードベースに含める前にテストするための方法としてプラグインは機能します。 プラグインは機能の引退時でも同様に役立ちます。たとえば廃止されたファイルのフォーマットがある日Bazaarのコアから除外されるかもしれませんが代わりにプラグインとして利用できます。</p> <p>プラグインはユーザーにとって、外部の開発者にとっても、Bazaar自身にもよいものです。</p> </div> <div class="section" id="id57"> <h4>プラグインが見つかる場所<a class="headerlink" href="#id57" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><a class="reference external" href="http://wiki.bazaar.canonical.com/BzrPlugins">http://wiki.bazaar.canonical.com/BzrPlugins</a> ページで プラグインのリストが見つかります。</p> </div> <div class="section" id="id58"> <h4>プラグインをインストールする方法<a class="headerlink" href="#id58" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プラグインのインストール作業はとても簡単です! まだ作られていなければ、 Bazaarの設定ディレクトリの元で <code class="docutils literal"><span class="pre">plugins</span></code> ディレクトリを作ります。 Unix の場合は <code class="docutils literal"><span class="pre">~/.bazaar/</span></code> でWindowsの場合は <code class="docutils literal"><span class="pre">C:\Documents</span> <span class="pre">and</span> <span class="pre">Settings\<username>\Application</span> <span class="pre">Data\Bazaar\2.0\</span></code> です。 このディレクトリの範囲内では(下記では$BZR_HOMEとして言及される) それぞれのプラグインは独自のサブディレクトリに設置されます。</p> <p>プラグインはとりわけBazaarのブランチとよく連携します。 たとえば、 GNU/Linux のメインのユーザーアカウント用に bzrtools プラグインをインストールするためには、次のコマンドを実行します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">panoramicfeedback</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">opensource</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">bzrtools</span> <span class="o">~/.</span><span class="n">bazaar</span><span class="o">/</span><span class="n">plugins</span><span class="o">/</span><span class="n">bzrtools</span> </pre></div> </div> <p>プラグインをインストールするディレクトリの名前はPythonの有効な識別子でなければなりません。 このことはディレクトリは特定の文字だけを含まなければならないことを意味します。とりわけハイフン (<code class="docutils literal"><span class="pre">-</span></code>) を含んではなりません。 <code class="docutils literal"><span class="pre">bzr-gtk</span></code> を <code class="docutils literal"><span class="pre">$BZR_HOME/plugins/bzr-gtk</span></code> にインストールするよりも、 <code class="docutils literal"><span class="pre">$BZR_HOME/plugins/gtk</span></code> にインストールします。</p> </div> <div class="section" id="id59"> <h4>プラグインの代替用の場所<a class="headerlink" href="#id59" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>必要なパーミッションがあれば、プラグインをシステム全体のベースに インストールすることもできます。</p> <p>環境変数 <code class="docutils literal"><span class="pre">BZR_PLUGIN_PATH</span></code> をプラグインが含まれるディレクトリに 設定することで個人のプラグインの場所を上書きできます。 (詳細な解説は <a class="reference external" href="../user-reference/configuration-help.html#bzr-plugin-path">ユーザーリファレンス</a> を参照してください。)</p> </div> <div class="section" id="id61"> <h4>インストールされたプラグインの一覧を表示する<a class="headerlink" href="#id61" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>これを行うためには、次のようにpluginsコマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">plugins</span> </pre></div> </div> <p>それぞれのプラグインの名前、場所とバージョンが表示されます。</p> <p>プラグインによって追加された新しいコマンドは <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">help</span> <span class="pre">commands</span></code> を実行することで見ることができます。 プラグインによって提供されたコマンドはブラケットの中のプラグインの名前に従って表示されます。</p> </div> <div class="section" id="id62"> <h4>人気のあるプラグイン<a class="headerlink" href="#id62" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>次の表は人気のあるプラグインのサンプルです。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="23%" /> <col width="25%" /> <col width="52%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">カテゴリ</th> <th class="head">名前</th> <th class="head">説明</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>GUI</td> <td>QBzr</td> <td>QtベースのGUIツール</td> </tr> <tr class="row-odd"><td>GUI</td> <td>bzr-gtk</td> <td>GTKベースのGUIツール</td> </tr> <tr class="row-even"><td>GUI</td> <td>bzr-eclipse</td> <td>Eclipseとの統合</td> </tr> <tr class="row-odd"><td>General</td> <td>bzrtools</td> <td>その他。shelfを含めた機能の強化</td> </tr> <tr class="row-even"><td>General</td> <td>difftools</td> <td>外部の差分ツールヘルパー</td> </tr> <tr class="row-odd"><td>General</td> <td>extmerge</td> <td>外部のマージツールヘルパー</td> </tr> <tr class="row-even"><td>Integration</td> <td>bzr-svn</td> <td>Subversionをリポジトリとして利用する</td> </tr> <tr class="row-odd"><td>Migration</td> <td>cvsps</td> <td>CVSパッチセットを移行させる</td> </tr> </tbody> </table> </div></blockquote> <p>あなた独自のプラグインを書きたい場合、難しいことではありません。 始めるためには付録の <a class="reference external" href="writing_a_plugin.html">プラグインを書く</a> の項目をご覧ください。</p> </div> </div> <div class="section" id="id64"> <h3><a class="toc-backref" href="#id293">Bazaarの哲学</a><a class="headerlink" href="#id64" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id65"> <h4>Bazaarを完全に理解する<a class="headerlink" href="#id65" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarは多くの点で他のVCSに似ていますが、最初見たときに必ずしも明らかではない大きな違いがいくつかあります。 このセクションでは Bazaarを”grok”するため、すなわち深く理解するために、 ユーザーが知る必要のあるいくつかの内容の説明を試みます。</p> <p>注: Bazaarを使うためにこのセクションを十分に理解する必要はありません。 このセクションをさっと読んで後で戻るとよいでしょう。</p> </div> <div class="section" id="id66"> <h4>リビジョン番号を理解する<a class="headerlink" href="#id66" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ブランチのメインラインのすべてのリビジョンは単純に増加する整数を持ちます(最初のコミットは1、10番目のコミットは10などです)。 これによって “私のブランチから10番目のリビジョンを獲得する”、もしくは “リビジョン3050で修正した” という言い方が自然になります。</p> <p>ブランチにマージされるリビジョンに関しては、ドットつきのバージョンが使われます(たとえば、3112.1.5)。 ドットつきのリビジョン番号は3つの番号を持ちます <a class="footnote-reference" href="#id68" id="id67">[2]</a>. 最初の番号はメインのリビジョンの変更の由来を示します。 2番目の番号はブランチのカウンターです。 同じリビジョンから多くのブランチが由来することがあり得るので、それらのブランチはユニークな番号を取得します。 3番目の番号はブランチの開始以降のリビジョン番号です。 たとえば、3112.1.5はリビジョン3112からの最初のブランチで、そのブランチ上の5番目のリビジョンです。</p> <table class="docutils footnote" frame="void" id="id68" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id67">[2]</a></td><td>バージョン1.2以前のbzrでは少し異なるアルゴリズムが使われていました。 いくつかの入れ子のブランチはよりシンプルな3つの番号システムではなく追加の番号(たとえば1.1.1.1.1)を取得します。</td></tr> </tbody> </table> </div> <div class="section" id="id69"> <h4>階層形式の履歴はよいものである<a class="headerlink" href="#id69" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>多くの変更が一連のコミットで構成される状況で複数の開発者が変更を投稿するプロジェクトを想像してください。 具体例を示すために、次の事例を考えてみましょう:</p> <blockquote> <div><ul class="simple"> <li>プロジェクトのトランクのチップはリビジョン100です。</li> <li>Maryは機能Xを配信するために3つの変更を行う</li> <li>Billは機能Yを配信するために4つの変更を行う</li> </ul> </div></blockquote> <p>開発者が並行して作業して伝統的な集中型のVCSのアプローチを利用する場合、 大抵の場合プロジェクトの履歴は次のようにMaryの変更とBillの変更が交互に混ざります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">107</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">106</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">105</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>多くのチームはこのアプローチを利用します。彼らのツールではブランチの作成とマージが難しいからです。 結果として、開発者はトランクからの更新とコミットを頻繁に行い、すべてのコミットを通してそれを広げることで統合の苦痛を最小化します。 望むのであれば、このようにBazaarを使うことができます。 Bazaarは考慮すべき別の方法を提供します。</p> <p>分散型のVCSツールによって推奨される代替のアプローチは機能ブランチを作り、準備ができたらそれらを統合することです。 この場合、Maryの機能ブランチは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>そしてBillのものは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>機能が独立していてリニアな履歴を維持したいのであれば、変更はバッチでトランクにpushされます。 (技術的には、これを行う方法は無数にありますがこの検討内容の範囲を超えます。) 結果の履歴は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">107</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">106</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">105</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">104</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>これを実現するために少し努力が必要な一方で、リビジョンをランダムに織り交ぜるよりもいくつかの利点があります。 よりベターですが、non-linearな履歴を形成してブランチは一緒にマージできます。 結果は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">102</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="k">for</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">Y</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>もしくは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">102</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">X</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>多くの理由からこれはよいものと考えられます:</p> <blockquote> <div><ul class="simple"> <li>プロジェクトの履歴を理解するのが楽になります。 関連した変更はクラスターを形成し明確に区切られます。</li> <li>ブランチのメインライン上のコミットだけを見るために履歴を簡単に折りたたむことができます。 (このレベルでは興味のない膨大な数のコミットの代わりに) このようなトランクの履歴を閲覧するとき、高いレベルのコミットだけ見えます。</li> <li>必要であれば、より簡単に機能の変更を取り消します</li> <li>継続的インテグレーション(Continuous integration: CI)ツールは マージをメインラインにコミットするためにすべてのテストが合格することを保証するために使われます。 (多くの場合、すべての単独のコミットの後でCIツールの引き金を引くのは適切ではありません。 テストの中には開発の間に失敗するものがあるからです。 実際、テストファーストの追加 - テスト駆動開発(TDD)のスタイル - によってこれが保証されます!)</li> </ul> </div></blockquote> <p>要約すると、重要な点は次のとおりです:</p> <blockquote> <div><p><em>ブランチを利用してあなたの作業内容を編成する</em></p> <p><em>マージ機能を利用して変更を統合する</em></p> <p><em>順序つきの番号と階層によって履歴を追跡するのが楽になる</em></p> </div></blockquote> </div> <div class="section" id="id70"> <h4>それぞれのブランチは履歴の独自のビューを持つ<a class="headerlink" href="#id70" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>上述のように、Bazaarは次の内容を区別します:</p> <blockquote> <div><ul class="simple"> <li>メインラインのリビジョン、すなわちブランチにコミットしたもの</li> <li>マージしたリビジョン、マージをコミットすることで祖先として追加されるもの</li> </ul> </div></blockquote> <p>それぞれのブランチは効率的に履歴の独自ビューを持ち、すなわち、 異なるブランチは同じリビジョンに異なる”ローカルな”リビジョン番号を与えます。</p> <p>マージされたリビジョンは常にドットつきのリビジョン番号を入手するのに対して メインラインのリビジョンは常に単独の数字のリビジョン番号が割り当てられます。</p> <p>上記の例を拡張するためには、Maryが変更を完了させた後でプロジェクトのトランクにマージした後に Maryのブランチのリビジョンの履歴は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">104</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">mainline</span> <span class="mf">100.2</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Merge</span> <span class="n">feature</span> <span class="n">Y</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">4</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">3</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="mf">100.1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span> <span class="n">Add</span> <span class="n">tests</span> <span class="mi">103</span><span class="p">:</span> <span class="n">Fix</span> <span class="n">bug</span> <span class="n">found</span> <span class="ow">in</span> <span class="n">testing</span> <span class="n">X</span> <span class="mi">102</span><span class="p">:</span> <span class="n">Add</span> <span class="n">documentation</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">101</span><span class="p">:</span> <span class="n">Add</span> <span class="n">code</span> <span class="ow">and</span> <span class="n">tests</span> <span class="k">for</span> <span class="n">X</span> <span class="mi">100</span><span class="p">:</span> <span class="o">...</span> </pre></div> </div> <p>繰り返しますが、Maryはこの変更を開発するためにステップを見るために彼女の履歴のトップレベルを調べることが簡単になります。 この文脈では、トランクのマージ(とそれを行うことによる衝突の解消)はこのブランチの履歴に関しては単なる1つのステップです。</p> <p>Bazaarは履歴を変更するのでなければグローバルなリビジョン識別子を変更するのでもないことを覚えておくのは大事です。 本当に望むのであれば常に後者を使用できます。 実際、ブランチのURLをコンテクストとして提供する <em>限り</em> コミュニケーションをするときに特定のリビジョン番号を使うことができます。 (多くのBazaarのプロジェクトでは、開発者はブランチURLなしでリビジョン番号を交換するとき中心のトランクのブランチをほのめかします)</p> <p>マージはブランチのリビジョン番号を変更しません。それらはローカルのリビジョン番号を新しくマージしたリビジョンに割り当てるからです。 Bazaarがブランチのリビジョン番号を変更する唯一のときはあなたが明示的に別のブランチをミラーリングするように頼むときです。</p> <p>注: リビジョンは安定した方法で番号づけされます: 2つのブランチがメインラインで同じリビジョン番号を持つとき、 そのリビジョンの祖先のすべてのリビジョンは同じリビジョン番号を持ちます。 たとえば、AliceとBobのブランチがリビジョン10に一致するのであれば、それらはそれ以前のすべてのリビジョンで一致します。</p> </div> <div class="section" id="id71"> <h4>要約<a class="headerlink" href="#id71" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>一般的に、前に示されたアドバイスに従うのであれば - ブランチの中で作業し、連携するためにマージを使う - Bazaarが一般的にあなたが期待することを行うことがわかります。</p> <p>次の章では、Bazaarを利用したさまざまな方法: もっとも単純なプロジェクト、個人プロジェクトなどを試します。</p> </div> </div> </div> <div class="section" id="id72"> <h2><a class="toc-backref" href="#id294">個人用途のバージョン管理</a><a class="headerlink" href="#id72" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id73"> <h3><a class="toc-backref" href="#id295">単独で始める</a><a class="headerlink" href="#id73" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id74"> <h4>個人の生産性を向上させるツール<a class="headerlink" href="#id74" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ツールの中には個人を生産的にする(たとえばエディタ)ためや チームもしくは会社全体を生産的にする(たとえばバックエンドサービス)ために設計されたものがあります。 バージョン管理ツールは伝統的に後者の陣営にありました。</p> <p>Bazaarがクールであることの1つはセットアップが簡単なのでバージョン管理ツールを個人の生産性を上げるツールとして扱うことができることです。 既知のよい状態であるかチェックする、もしくは履歴を追跡するために変更を保存したい場合、簡単に行うことができます。 この章では方法を説明します。</p> </div> <div class="section" id="id75"> <h4>単独用途のワークフロー<a class="headerlink" href="#id75" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>あなた独自の名作を作っているのであれば、ソフトウェア、プロジェクトもしくはドキュメントの一式であれ、典型的なワークフローは次のようになります:</p> <img alt="../_images/workflows_single.png" src="../_images/workflows_single.png" /> <p>チームの一員として常に作業をするとしても、この章でカバーされるタスクはあなたが行うことの基本になるので、よいスタート地点です。</p> </div> </div> <div class="section" id="id76"> <h3><a class="toc-backref" href="#id296">プロジェクトを始める</a><a class="headerlink" href="#id76" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id77"> <h4>既存のプロジェクトをバージョン管理する<a class="headerlink" href="#id77" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>バージョン管理下に置きたいソースコードのツリー(ドキュメントのディレクトリ)をすでにお持ちなら、 使うコマンドは以下のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">my</span><span class="o">-</span><span class="n">stuff</span> <span class="n">bzr</span> <span class="n">init</span> <span class="n">bzr</span> <span class="n">add</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Initial import"</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">init</span></code> はトップレベルのディレクトリで <code class="docutils literal"><span class="pre">.bzr</span></code> ディレクトリを作ります(上記の例では <code class="docutils literal"><span class="pre">my-stuff</span></code> )。 次のことに注意してください:</p> <blockquote> <div><ul class="simple"> <li>Bazaarは必要なすべてのものをそのディレクトリに置きます - データベース、ウェブサーバー、特別なサービスをセットアップする <strong>必要はありません</strong></li> <li>Bazaarは <code class="docutils literal"><span class="pre">.bzr</span></code> を1つのディレクトリだけに作り、他のすべてのサブディレクトリの中には作らないぐらい礼儀正しいです。</li> </ul> </div></blockquote> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">add</span></code> はバージョン管理化におくべきと考えられるすべてのファイルとディレクトリを見つけ内部で登録します。 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">commit</span></code> はこれらの内容のスナップショットとその情報をコミットメッセージと一緒に記録します。</p> <p><code class="docutils literal"><span class="pre">init</span></code> 、 <code class="docutils literal"><span class="pre">add</span></code> と <code class="docutils literal"><span class="pre">commit</span></code> に関する詳細な情報は後で提供します。 現時点で、覚えておくべき大事なことは上記のレシピです。</p> </div> <div class="section" id="id78"> <h4>新しいプロジェクトを始める<a class="headerlink" href="#id78" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プロジェクトをゼロから始める場合、最初の段階で空のディレクトリを作った後で上述のレシピを使うこともできます。 後の章で詳しく探求する効率の理由から、プロジェクトのためにトップレベルでレポジトリを作り その中で <em>メイン</em> のブランチを入れ子にすることはよいアイディアです。次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">my</span><span class="o">.</span><span class="n">repo</span> <span class="n">cd</span> <span class="n">my</span><span class="o">.</span><span class="n">repo</span> <span class="n">bzr</span> <span class="n">init</span> <span class="n">my</span><span class="o">.</span><span class="n">main</span> <span class="n">cd</span> <span class="n">my</span><span class="o">.</span><span class="n">main</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span> <span class="n">bzr</span> <span class="n">add</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Initial import"</span> </pre></div> </div> <p><em>main</em> の代わりに <em>trunk</em> もしくは <em>dev</em> のような名前を好む人もいます。 何であれあなたにとって最も有用な意味のある名前を選んでください。</p> <p><code class="docutils literal"><span class="pre">init-repo</span></code> と <code class="docutils literal"><span class="pre">init</span></code> コマンドの両方はパスを引数としてとり、すでに存在していなければそのパスを作ることに留意してください。</p> </div> </div> <div class="section" id="id79"> <h3><a class="toc-backref" href="#id297">ファイルの登録を制御する</a><a class="headerlink" href="#id79" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id80"> <h4>Bazaarは何を追跡するのか?<a class="headerlink" href="#id80" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>前に説明したように、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">add</span></code> は現在のディレクトリの元でBazaarがバージョン管理すべきだと考える すべてのものを見つけ登録します。登録するものは次のようなものになります:</p> <blockquote> <div><ul class="simple"> <li>ファイル</li> <li>ディレクトリ</li> <li>シンボリックリンク</li> </ul> </div></blockquote> <p>Bazaarは興味を持つファイルと興味を持たないファイルに関してデフォルトのルールを持ちます。 後で説明される <a class="reference internal" href="#id82">ファイルを無視する</a> のようにこれらのルールを調整できます。</p> <p>他の多くのVCSツールとは異なり、Bazaarはディレクトリを第一級の項目として扱います。 結果として、空のディレクトリは正しくサポートされます - ディレクトリが追跡されプロジェクトのエクスポートに含まれることを保証するために ディレクトリ内部にダミーファイルを作る必要はありません。</p> <p>シンボリックリンクに関しては、シンボリックリンクの値は追跡され、 シンボリックリンクが指し示すものの内容は追跡されません。</p> <p>注: プロジェクトの中のプロジェクトを追跡するサポート機能 (“入れ子ツリー”) は現在開発中です。 この機能の開発を手伝うもしくはテストすることにご興味がありましたらBazaarの開発者に連絡して下さるようお願いします。</p> </div> <div class="section" id="id81"> <h4>登録を選ぶ<a class="headerlink" href="#id81" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>いくつかの事例において、登録したいものをBazaarに発見を任せるよりも明示的に指名したいことがあります。 これを行うためには、パスを引数として <code class="docutils literal"><span class="pre">add</span></code> コマンドに提供します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">add</span> <span class="n">fileX</span> <span class="n">dirY</span><span class="o">/</span> </pre></div> </div> <p>ディレクトリを追加すると暗黙的にそのディレクトリの中の関心のあるすべてのものが追加されます。</p> </div> <div class="section" id="id82"> <h4>ファイルを無視する<a class="headerlink" href="#id82" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>エディタのバックアップ、オブジェクト、バイトコードのファイル、ビルドされたプログラムなど、 多くのソースツリーはバージョン管理する必要のないファイルを含みます。 単純にこれらを追加しないでおくと、これらは常に未知のファイルとして現れます。 ツリーのトップでこれらを <code class="docutils literal"><span class="pre">.bzrignore</span></code> と呼ばれるファイルに追加することでBazaarにこれらのファイルを無視するように指示することもできます。</p> <p>このファイルは一行ごとにファイルのワイルドカード(もしくは “globs”)の一覧を含みます。典型的な内容は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">*.</span><span class="n">o</span> <span class="o">*~</span> <span class="o">*.</span><span class="n">tmp</span> <span class="o">*.</span><span class="n">py</span><span class="p">[</span><span class="n">co</span><span class="p">]</span> </pre></div> </div> <p>globがスラッシュを含む場合、ツリーのトップからのパス全体がマッチします; さもなければファイルの名前だけにマッチします。以前の例では すべてのサブディレクトリ内の <code class="docutils literal"><span class="pre">.</span></code> の拡張子を持つファイルが無視されますが、 次の例ではトップレベルでは <code class="docutils literal"><span class="pre">config.h</span></code> だけと <code class="docutils literal"><span class="pre">doc/</span></code> の中のHTMLが無視されます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">config</span><span class="o">.</span><span class="n">h</span> <span class="n">doc</span><span class="o">/*.</span><span class="n">html</span> </pre></div> </div> <p>どのファイルが無視され何のパターンにマッチするのかについての一覧表を得るためには、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">ignored</span></code> を使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">ignored</span> <span class="n">config</span><span class="o">.</span><span class="n">h</span> <span class="o">./</span><span class="n">config</span><span class="o">.</span><span class="n">h</span> <span class="n">configure</span><span class="o">.</span><span class="ow">in</span><span class="o">~</span> <span class="o">*~</span> </pre></div> </div> <p>無視するパターンがバージョン管理されていないファイルのみにマッチし、それらが”unknown”もしくは”ignored”として扱われるのかを制御します。 ファイルが明示的に追加されると、無視するパターンにマッチするかに関わらずバージョン管理されたままです。</p> <p><code class="docutils literal"><span class="pre">.bzrignore</span></code> ファイルは通常はバージョン管理されるので、ブランチの新しいコピーは同じパターンを見ます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">add</span> <span class="o">.</span><span class="n">bzrignore</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Add ignore patterns"</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">ignore</span> <span class="pre">PATTERN</span></code> コマンドはPATTERNを <code class="docutils literal"><span class="pre">.bzrignore</span></code> ファイルに手軽に追加するために使われます (必要でBazaarによって追跡するために登録する場合、作られます)。 <code class="docutils literal"><span class="pre">.bzrignore</span></code> ファイルを直接編集することでパターンの除去と修正が行われます。</p> </div> <div class="section" id="id83"> <h4>グローバルで無視する<a class="headerlink" href="#id83" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プロジェクト固有のものではないが、ユーザー固有の無視されるファイルがいくつかあります。 編集者用の一時ファイルもしくは個人の一時ファイルのようなものです。 これらを無視するようにすべてのプロジェクトに追加するよりも、 bzrは <code class="docutils literal"><span class="pre">~/.bazaar/ignore</span></code> の中でグローバルで無視するファイルをサポートします <a class="footnote-reference" href="#id85" id="id84">[3]</a> 。 これはプロジェクト単位で無視するファイルと同じ構文を持ちます。</p> <table class="docutils footnote" frame="void" id="id85" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id84">[3]</a></td><td>Windowsにおいて、ユーザーの設定ファイルはアプリケーションデータディレクトリで見つかります。 <code class="docutils literal"><span class="pre">~/.bazaar/branch.conf</span></code> の代わりに、設定ファイルは次のように見つかります: <code class="docutils literal"><span class="pre">C:\Documents</span> <span class="pre">and</span> <span class="pre">Settings\<username>\Application</span> <span class="pre">Data\Bazaar\2.0\branch.conf</span></code> 同じことが <code class="docutils literal"><span class="pre">locations.conf</span></code> 、 <code class="docutils literal"><span class="pre">ignore</span></code> 、と <code class="docutils literal"><span class="pre">plugins</span></code> ディレクトリにも当てはまります。</td></tr> </tbody> </table> </div> </div> <div class="section" id="id86"> <h3><a class="toc-backref" href="#id298">変更をレビューする</a><a class="headerlink" href="#id86" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id87"> <h4>リープする前にロックする<a class="headerlink" href="#id87" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>作業が完了したら、恒久的に記録することに先駆けて変更をレビューするのはよい考えです。 この方法で、何を意図しているのかをコミットすることを確認できます。</p> <p>2つのbzrコマンド: <strong>status</strong> と <strong>diff</strong> はとりわけ便利です。</p> </div> <div class="section" id="bzr-status"> <h4>bzr status<a class="headerlink" href="#bzr-status" title="このヘッドラインへのパーマリンク">¶</a></h4> <blockquote> <div><p><strong>status</strong> コマンドは最後のリビジョン以降に作業ディレクトリに行われた変更内容を伝えます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">status</span> <span class="n">modified</span><span class="p">:</span> <span class="n">foo</span> </pre></div> </div> </div></blockquote> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">status</span></code> は 変更されないもしくは無視される “つまらない” ファイルを隠します。 statusコマンドはチェックするためにオプションとしてファイルもしくはディレクトリの名前を渡すことができます。</p> </div> <div class="section" id="bzr-diff"> <h4>bzr diff<a class="headerlink" href="#bzr-diff" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>The <strong>diff</strong> コマンドはすべてのファイルへの変更の全文を標準のunified diffとして表示します。 これは ‘’patch’‘、 ‘’diffstat’‘、 ‘’filterdiff’’ と ‘’colordiff’‘といった多くのプログラムを通してパイプで引き渡すことができます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> <span class="o">===</span> <span class="n">added</span> <span class="n">file</span> <span class="s1">'hello.txt'</span> <span class="o">---</span> <span class="n">hello</span><span class="o">.</span><span class="n">txt</span> <span class="mi">1970</span><span class="o">-</span><span class="mi">01</span><span class="o">-</span><span class="mi">01</span> <span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span> <span class="o">+</span><span class="mi">0000</span> <span class="o">+++</span> <span class="n">hello</span><span class="o">.</span><span class="n">txt</span> <span class="mi">2005</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mi">18</span> <span class="mi">14</span><span class="p">:</span><span class="mi">23</span><span class="p">:</span><span class="mi">29</span> <span class="o">+</span><span class="mi">0000</span> <span class="o">@@</span> <span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> <span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span> <span class="o">@@</span> <span class="o">+</span><span class="n">hello</span> <span class="n">world</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">-r</span></code> オプションによって、ツリーは前のリビジョン、もしくは示された2つのリビジョンの違いを表示します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> <span class="o">-</span><span class="n">r</span> <span class="mf">1000.</span><span class="o">.</span> <span class="c1"># r1000 からの全ての変更</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> <span class="o">-</span><span class="n">r</span> <span class="mf">1000.</span><span class="o">.</span><span class="mi">1100</span> <span class="c1"># 1000 から 1100 までの変更</span> </pre></div> </div> <p>1つのリビジョンの変更だけを見たい場合は、 <code class="docutils literal"><span class="pre">-c</span></code> オプションを利用します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> <span class="o">-</span><span class="n">c</span> <span class="mi">1000</span> <span class="c1"># r1000 による変更</span> <span class="c1"># -r999..1000 と同じ意味</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">--diff-options</span></code> オプションによってbzrは外部のdiffプログラムにオプションを渡して実行します。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">diff</span> <span class="o">--</span><span class="n">diff</span><span class="o">-</span><span class="n">options</span> <span class="o">--</span><span class="n">side</span><span class="o">-</span><span class="n">by</span><span class="o">-</span><span class="n">side</span> <span class="n">foo</span> </pre></div> </div> <p>プロジェクトの中には新旧のファイルのためのパスの始めで接頭辞を表示するためにパッチを好むところもあります。 <code class="docutils literal"><span class="pre">--prefix</span></code> オプションはそのような接頭辞を提供するために使われます。 ショートカットとして、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span> <span class="pre">-p1</span></code> は <code class="docutils literal"><span class="pre">patch</span> <span class="pre">-p1</span></code> コマンドで機能する形式を生み出します。</p> </div> </div> <div class="section" id="id88"> <h3><a class="toc-backref" href="#id299">変更を記録する</a><a class="headerlink" href="#id88" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="bzr-commit"> <h4>bzr commit<a class="headerlink" href="#bzr-commit" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>作業ツリーの状態が満足のゆくものであるとき、これをブランチに <strong>コミット</strong> できます。 そしてその状態のスナップショットを保持する新しいリビジョンが作られます。</p> <p><strong>commit</strong> コマンドはリビジョンの変更を記述するメッセージをとります。 コミットはあなたのユーザーID、現在の時間とタイムゾーン、一覧表とツリーの内容も記録します。 コミットメッセージは <code class="docutils literal"><span class="pre">-m</span></code> もしくは <code class="docutils literal"><span class="pre">--message</span></code> オプションによって指定されます。 複数行のコミットメッセージを入力できます; 大抵のシェルでは行の終わりで引用符を開いたままにするだけで入力できます。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"added my first file"</span> </pre></div> </div> <p>ファイルからメッセージを得るために <code class="docutils literal"><span class="pre">-F</span></code> オプションを使うことができます。 中には、作業している間にコミットメッセージ用のノートを作り、自分が何を行い何を発言したのか 確認するために差分をレビューしたい人がいます。 (このファイルは一休みしてから作業を取り出すのにも役立ちます)</p> </div> <div class="section" id="id89"> <h4>エディタからのメッセージ<a class="headerlink" href="#id89" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">-m</span></code> もしくは <code class="docutils literal"><span class="pre">-F</span></code> オプションを使わないのであれば、 bzrはメッセージを入力するためにエディタを開きます。 起動させるエディタは <code class="docutils literal"><span class="pre">$VISUAL</span></code> もしくは <code class="docutils literal"><span class="pre">$EDITOR</span></code> 環境変数によって制御され、 <code class="docutils literal"><span class="pre">~/.bazaar/bazaar.conf</span></code> の中の <code class="docutils literal"><span class="pre">editor</span></code> 設定によって上書きできます; <code class="docutils literal"><span class="pre">$BZR_EDITOR</span></code> は上記で言及したエディタのオプションを上書きします。 変更なしでエディタを閉じると、コミットはキャンセルされます。</p> <p>エディタの中で開かれるファイルは境界線を含みます。 この行の下のファイルの部分は情報用のみのために含まれ、コミットメッセージには含まれません。 セパレータの下側はコミットで変更されるファイルの一覧が表示されます。 上記の行の上側でメッセージを書き、ファイルを保存して閉じます。</p> <p>編集メッセージとしてコミットする差分を見たければ <code class="docutils literal"><span class="pre">--show-diff</span></code> オプションを使うことができます。 これはエディタが開くときにエディタの差分を含みます。セパレータの下とファイルに関する情報はコミットされます。 これは書いたメッセージを読むことができることを意味しますが、 差分自身は終了したときにコミットメッセージに表示されません。 一部をメッセージに含めたいのであれば、それらをセパレータの上側にコピー&ペーストできます。</p> </div> <div class="section" id="id90"> <h4>選択可能なコミット<a class="headerlink" href="#id90" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>コミットのコマンドラインでファイルもしくはディレクトリの名前を渡すと それらのファイルへの変更のみがコミットされます。たとえば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"documentation fix"</span> <span class="n">commit</span><span class="o">.</span><span class="n">py</span> </pre></div> </div> <p>デフォルトではサブディレクトリから実行されたとしても bzrは常にツリーへのすべての変更をコミットします。 現在のディレクトリのみからコミットするには、ドットを引数として使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">.</span> </pre></div> </div> </div> <div class="section" id="id91"> <h4>変更に署名をつける<a class="headerlink" href="#id91" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>たとえば誰かのパッチを適用するときなど、コミットしようとしている変更があなたのものでないなら、 <code class="docutils literal"><span class="pre">--author</span></code> という commit のオプションを使って変更に署名をつけられます。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">--</span><span class="n">author</span> <span class="s2">"Jane Rey <jrey@example.com>"</span> </pre></div> </div> <p>ここで指定された人はそのリビジョンの “author” として記録され、あなたはそのリビジョンの “committer” として記録されます。</p> <p>もしリビジョンの変更がペアプログラミングなどにより複数の人に作られたものならば、 <code class="docutils literal"><span class="pre">--author</span></code> を複数回指定して記録することができます。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">--</span><span class="n">author</span> <span class="s2">"Jane Rey <jrey@example.com>"</span> \ <span class="o">--</span><span class="n">author</span> <span class="s2">"John Doe <jdoe@example.com>"</span> </pre></div> </div> </div> </div> <div class="section" id="id92"> <h3><a class="toc-backref" href="#id300">履歴を閲覧する</a><a class="headerlink" href="#id92" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="bzr-log"> <h4>bzr log<a class="headerlink" href="#bzr-log" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></code> コマンドは以前のリビジョンの一覧を表示します。</p> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code> と同じように, <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></code> は <code class="docutils literal"><span class="pre">-r</span></code> の引数をサポートします:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">r</span> <span class="mf">1000.</span><span class="o">.</span> <span class="c1"># リビジョン1000とその後のすべて</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">r</span> <span class="o">..</span><span class="mi">1000</span> <span class="c1"># r1000とそれまでのすべて</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">r</span> <span class="mf">1000.</span><span class="o">.</span><span class="mi">1100</span> <span class="c1"># 1000から1100までの変更</span> <span class="o">%</span> <span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">r</span> <span class="mi">1000</span> <span class="c1"># リビジョン1000のみの変更</span> </pre></div> </div> </div> <div class="section" id="id93"> <h4>マージされたリビジョンを見る<a class="headerlink" href="#id93" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarのような分散型のVCSは集中型のVCSツールよりもマージが非常に簡単なので、 ブランチの履歴は、メインラインから分離してその後メインラインにマージされるようなラインを含むことがあります。 技術的には、無数のリビジョンノード間の関係は無閉路有向グラフ(Directed Acyclic Graph: DAG)として知られます。</p> <p>多くの場合、まずはメインラインを見てそのあとに別のラインを見たいものです。 そのため、log のデフォルトの動作はメインラインを表示して、マージされたリビジョンがあるある場所を指示します。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">n0</span> <span class="o">-</span><span class="n">rX</span> </pre></div> </div> <p>全てのリビジョンと全てのマージされたリビジョンを見る場合は:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="o">-</span><span class="n">n0</span> </pre></div> </div> <p>-n オプションは表示するレベルを意味し、0の場合は全てを意味することに注意してください。 もしそれがゴミゴミしているなら、値を変更して調整することが容易にできます。 たとえば、もしあなたのプロジェクトがトップレベルのgatekeeperがチームレベルのgatekeeperからマージするように構成されている場合、<code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></code> はトップレベルgatekeeperの履歴だけを表示し、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span> <span class="pre">-n2</span></code> はチームのgatekeeperの履歴を表示します。 しかし、ほとんどの場合においては <code class="docutils literal"><span class="pre">-n0</span></code> で十分でしょう。</p> </div> <div class="section" id="id94"> <h4>出力をチューニングする<a class="headerlink" href="#id94" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">log</span></code> コマンドは出力を調整するために便利ないくつかのオプションを持ちます。次のものが含まれます:</p> <blockquote> <div><ul> <li><dl class="first docutils"> <dt><code class="docutils literal"><span class="pre">--forward</span></code> はログを年代順で表します。</dt> <dd><p class="first last">すなわち最新のリビジョンが最後に表示されます。</p> </dd> </dl> </li> <li><p class="first"><code class="docutils literal"><span class="pre">--limit</span></code> オプションは表示されるリビジョンの最大数を制御します。</p> </li> </ul> </div></blockquote> <p>出力の調整方法の詳しい情報に関してはユーザーリファレンスのlogコマンドのオンラインヘルプを参照してください。</p> </div> <div class="section" id="id95"> <h4>ファイルの履歴を閲覧する<a class="headerlink" href="#id95" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>特定のファイルのみに適用されるように履歴をフィルタリングすることが便利であることがよくあります。 これを行うためには、ファイルの名前を <code class="docutils literal"><span class="pre">log</span></code> コマンドに提供します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">foo</span><span class="o">.</span><span class="n">py</span> </pre></div> </div> </div> <div class="section" id="id96"> <h4>古いバージョンのファイルを閲覧する<a class="headerlink" href="#id96" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>指定されたバージョンでファイルの内容を取得するには、次のように <code class="docutils literal"><span class="pre">cat</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">cat</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span> <span class="n">file</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">X</span></code> はリビジョンの識別子で <code class="docutils literal"><span class="pre">file</span></code> はファイルの名前です。 これは出力を標準出力ストリームに送信しますので、次のように閲覧ツール( <code class="docutils literal"><span class="pre">less</span></code> や <code class="docutils literal"><span class="pre">more</span></code> など)に出力をパイプで渡すかリダイレクトするといいでしょう:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">cat</span> <span class="o">-</span><span class="n">r</span> <span class="o">-</span><span class="mi">2</span> <span class="n">foo</span><span class="o">.</span><span class="n">py</span> <span class="o">|</span> <span class="n">less</span> <span class="n">bzr</span> <span class="n">cat</span> <span class="o">-</span><span class="n">r</span> <span class="mi">1</span> <span class="n">foo</span><span class="o">.</span><span class="n">py</span> <span class="o">></span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">foo</span><span class="o">-</span><span class="mi">1</span><span class="n">st</span><span class="o">-</span><span class="n">version</span><span class="o">.</span><span class="n">py</span> </pre></div> </div> </div> <div class="section" id="id97"> <h4>グラフィカルな履歴ビューワ<a class="headerlink" href="#id97" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>履歴のブラウジングはGUIツールが人生を本当に楽にしてくれる領域です。 QBzrとbzr-gtkを含めてこの機能を提供するBazaarのプラグインがたくさんあります。 これらがまだインストールされていなければ <a class="reference external" href="plugins.html">プラグインを利用する</a> で詳細なインストール方法をご覧ください。</p> <p>QBzrからグラフィカルビューワを使うには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">qlog</span> </pre></div> </div> <p>bzr-gtkからグラフィカルビューワを使うためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">viz</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">viz</span></code> は実際には <code class="docutils literal"><span class="pre">visualize</span></code> の組み込みのエイリアスなので望むのであれば長い方のコマンド名を使います。</p> </div> </div> <div class="section" id="id99"> <h3><a class="toc-backref" href="#id301">プロジェクトをリリースする</a><a class="headerlink" href="#id99" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id100"> <h4>リリースをパッケージ化する<a class="headerlink" href="#id100" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">export</span></code> コマンドはリリースのパッケージを作成するために使われます。 すなわち、ブランチの中のファイルとディレクトリをコピーしてそれらを真新しいディレクトリもしくはアーカイブファイルのパッケージを作成します。 たとえば、このコマンドは最後にコミットされたバージョンを <code class="docutils literal"><span class="pre">tar.gz</span></code> アーカイブファイルにパッケージ化します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">export</span> <span class="o">../</span><span class="n">releases</span><span class="o">/</span><span class="n">my</span><span class="o">-</span><span class="n">stuff</span><span class="o">-</span><span class="mf">1.5</span><span class="o">.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">export</span></code> コマンドは下記に示されるアーカイブのタイプを作るためにアーカイブファイルの接尾辞を使います。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="58%" /> <col width="42%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">サポートされるフォーマット</th> <th class="head">拡張子で自動検出</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>dir</td> <td>(none)</td> </tr> <tr class="row-odd"><td>tar</td> <td>.tar</td> </tr> <tr class="row-even"><td>tbz2</td> <td>.tar.bz2, .tbz2</td> </tr> <tr class="row-odd"><td>tgz</td> <td>.tar.gz, .tgz</td> </tr> <tr class="row-even"><td>zip</td> <td>.zip</td> </tr> </tbody> </table> </div></blockquote> <p>最新のリビジョン以外のリビジョンをパッケージにすることを望むのであれば、 <code class="docutils literal"><span class="pre">-r</span></code> オプションを使います。 アーカイブ内部のrootディレクトリを調整したいのであれば、 <code class="docutils literal"><span class="pre">--root</span></code> オプションを使います。 <code class="docutils literal"><span class="pre">export</span></code> によってサポートされるオプションの詳細については オンラインヘルプもしくはユーザーリファレンスを参照してください。</p> </div> <div class="section" id="id101"> <h4>リリースをタギングする<a class="headerlink" href="#id101" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>リリースのパッケージを作成するために使われたバージョンを覚えるよりも、 <code class="docutils literal"><span class="pre">tag</span></code> コマンドを使ってバージョンのためのシンボルを定義する方が便利です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">tag</span> <span class="n">version</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">5</span> </pre></div> </div> <p>リビジョンの識別子が必要なときはいつでもそのタグを使うことができます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">diff</span> <span class="o">-</span><span class="n">r</span> <span class="n">tag</span><span class="p">:</span><span class="n">version</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">5</span> </pre></div> </div> <p>ブランチの中で定義したタグの一覧を見たい場合、 <code class="docutils literal"><span class="pre">tags</span></code> コマンドを使います。</p> </div> </div> <div class="section" id="id102"> <h3><a class="toc-backref" href="#id302">間違いを取り消す</a><a class="headerlink" href="#id102" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id103"> <h4>間違いは起きる<a class="headerlink" href="#id103" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarは下記で説明されるような間違いから簡単にリカバーできるように 設計されています。</p> </div> <div class="section" id="id104"> <h4>プロジェクトのリビジョンの履歴をドロップする<a class="headerlink" href="#id104" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>思いがけず間違ったツリーをバージョン管理下に置いたとしても、 <code class="docutils literal"><span class="pre">.bzr</span></code> ディレクトリを削除するだけで済みます。</p> </div> <div class="section" id="id105"> <h4>ファイルもしくはディレクトリの登録を解除する<a class="headerlink" href="#id105" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>バージョン管理下に置きたくないファイルを思いがけず <code class="docutils literal"><span class="pre">add</span></code> コマンドで登録しても、 それを忘れるようにBazaarにそれを忘れさせるために <code class="docutils literal"><span class="pre">remove</span></code> コマンドを使用できます。</p> <p><code class="docutils literal"><span class="pre">remove</span></code> は修正されたファイルが削除されないよに <em>安全に物事を行う</em> ために設計されています。たとえば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">add</span> <span class="n">foo</span><span class="o">.</span><span class="n">html</span> <span class="p">(</span><span class="n">oops</span> <span class="o">-</span> <span class="n">didn</span><span class="s1">'t mean that)</span> <span class="n">bzr</span> <span class="n">remove</span> <span class="n">foo</span><span class="o">.</span><span class="n">html</span> </pre></div> </div> <p>このコマンドは修正されたもしくは未知のファイルについてはエラーを出力します。 ファイルを維持したいのであれば、 <code class="docutils literal"><span class="pre">--keep</span></code> オプションを使います。 代わりに、ファイルを削除したいのであれば、 <code class="docutils literal"><span class="pre">--force</span></code> オプションを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>bzr add foo.html (oops - didn't mean that) bzr remove --keep foo.html (foo.html はディスクには残るけれども、bzrには登録されない) </pre></div> </div> <p>一方で、未変更の <code class="docutils literal"><span class="pre">TODO</span></code> ファイルは登録が解除されエラー出力なしでディスクから削除されます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">add</span> <span class="n">TODO</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"added TODO"</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span> <span class="o">-</span> <span class="n">but</span> <span class="n">don</span><span class="s1">'t change TODO)</span> <span class="n">bzr</span> <span class="n">remove</span> <span class="n">TODO</span> <span class="p">(</span><span class="n">TODO</span> <span class="n">ファイルは削除される</span><span class="p">)</span> </pre></div> </div> <p>注: IDEもしくはオペレーティングシステムのファイルマネージャーを利用してファイルを削除する場合、 <code class="docutils literal"><span class="pre">commit</span></code> コマンドはそれを削除されるものとして暗黙のうちに扱います。</p> </div> <div class="section" id="id106"> <h4>最後のコミット以降の変更を取り消す<a class="headerlink" href="#id106" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>バージョン管理ツールを使う理由の1つは作業をしている間にツリーのステータスを楽に調べられることです。 最新の <code class="docutils literal"><span class="pre">commit</span></code> 以降の変更を廃棄することを決心したら、使うコマンドは <code class="docutils literal"><span class="pre">revert</span></code> です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">revert</span> </pre></div> </div> <p>事前の警告として、 実際にすべてが本当に廃棄されたことを確認するために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">status</span></code> と <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code> を最初に使うことはよい習慣です。</p> </div> <div class="section" id="id107"> <h4>最後のコミット以降のファイルへの変更を取り消す<a class="headerlink" href="#id107" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>最後のコミット以降の特定のファイルの変更を取り消したいが、ツリーの他のすべての変更を維持したい場合、 ファイルの名前を引数として <code class="docutils literal"><span class="pre">revert</span></code> に渡します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">revert</span> <span class="n">foo</span><span class="o">.</span><span class="n">py</span> </pre></div> </div> </div> <div class="section" id="id108"> <h4>最後のコミットを取り消す<a class="headerlink" href="#id108" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>意図しないコミットをしてしまったら、取り消すために <code class="docutils literal"><span class="pre">uncommit</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">uncommit</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">revert</span></code> とは異なり、 <code class="docutils literal"><span class="pre">uncommit</span></code> は作業のツリーの内容をそのままにします。 意図せずに間違ったエラーメッセージをコミットしてしまった場合、これは本当に重宝します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Fix bug #11"</span> <span class="p">(</span><span class="n">damn</span> <span class="o">-</span> <span class="n">wrong</span> <span class="n">bug</span> <span class="n">number</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">uncommit</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Fix bug #1"</span> </pre></div> </div> <p>コミットを取り消す別の理由は1つもしくは複数のファイルの追加を忘れたからというものです 。 これを避けるために、未知のファイルがツリーの中で見つかるとコミットがエラーになるように <code class="docutils literal"><span class="pre">commit</span></code> を <code class="docutils literal"><span class="pre">commit</span> <span class="pre">--strict</span></code> のエイリアスにする人もいます。</p> <p>注: <code class="docutils literal"><span class="pre">merge</span></code> コマンドは次の章まで紹介しませんが、 <code class="docutils literal"><span class="pre">uncommit</span></code> で追加するマージをリストアすることは無意味です。 (<code class="docutils literal"><span class="pre">uncommit</span></code> の後で <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">status</span></code> を実行するとこれらが表示されます) <code class="docutils literal"><span class="pre">merge</span></code> は履歴の前の方の指定したコミットだけを効率良く取り消すためにも使われます。 <code class="docutils literal"><span class="pre">merge</span></code> に関する詳細な情報は 次の章の <a class="reference external" href="merging_changes.html">変更をマージする</a> とBazaarのユーザーリファレンスを参照してください。</p> </div> <div class="section" id="id110"> <h4>複数のコミットを取り消す<a class="headerlink" href="#id110" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>複数のコミットを取り消すためには -r オプションを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">uncommit</span> <span class="o">-</span><span class="n">r</span> <span class="o">-</span><span class="mi">3</span> </pre></div> </div> <p>これを行うための理由が本当にいくつかの変更を破棄したいのであるなら、 <code class="docutils literal"><span class="pre">uncommit</span></code> は作業ツリーを変更しないことを覚えておいてください: タスクを完了させることと同じようにおそらく <code class="docutils literal"><span class="pre">revert</span></code> コマンドを実行する必要があります。 しかし多くの場合、履歴をそのままにしておき、最新のよい状態の内容を反映する 新しいリビジョンを追加する方が間違いなくベターです。</p> </div> <div class="section" id="id111"> <h4>過去のバージョンの状態に戻す<a class="headerlink" href="#id111" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>望まない変更を行ったが、コードがユーザーに公開されているのでコミットの取り消しが合理的ではない場合、 作業ツリーを望む状態に戻すために <code class="docutils literal"><span class="pre">revert</span></code> を利用できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="s2">"Fix bug #5"</span> <span class="n">Committed</span> <span class="n">revision</span> <span class="mf">20.</span> <span class="p">(</span><span class="n">release</span> <span class="n">the</span> <span class="n">code</span><span class="p">)</span> <span class="p">(</span><span class="n">hmm</span> <span class="o">-</span> <span class="n">bad</span> <span class="n">fix</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">revert</span> <span class="o">-</span><span class="n">r</span> <span class="mi">19</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Backout fix for bug #5"</span> </pre></div> </div> <p>この作業によってツリー全体をリビジョン19の状態に変更します。 それ以降は新しいコミットをしていなければ、おそらくこれがあなたのしたい唯一のことです。 新しいコミットをしている場合は、 <code class="docutils literal"><span class="pre">revert</span></code> はそれも消してしまいます。 その場合は、わるい修正を取り消す代わりに <a class="reference external" href="adv_merging.html#reverse-cherrypicking">リバースチェリーピック</a> を使う方がよいでしょう。</p> <p>注: 19のような絶対的なリビジョン番号の代わりに、 負の数を使ってチップ(-1)と相対的なリビジョンを指定できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">revert</span> <span class="o">-</span><span class="n">r</span> <span class="o">-</span><span class="mi">2</span> </pre></div> </div> </div> <div class="section" id="id113"> <h4>タグを訂正する<a class="headerlink" href="#id113" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>早まってタグを定義したのなら、 <code class="docutils literal"><span class="pre">tag</span></code> コマンドの <code class="docutils literal"><span class="pre">--force</span></code> オプションを使って再定義します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">tag</span> <span class="mf">2.0</span><span class="o">-</span><span class="n">beta</span><span class="o">-</span><span class="mi">1</span> <span class="p">(</span><span class="n">oops</span><span class="p">,</span> <span class="n">we</span><span class="s1">'re not yet ready for that)</span> <span class="p">(</span><span class="n">make</span> <span class="n">more</span> <span class="n">commits</span> <span class="n">to</span> <span class="n">include</span> <span class="n">more</span> <span class="n">fixes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">tag</span> <span class="mf">2.0</span><span class="o">-</span><span class="n">beta</span><span class="o">-</span><span class="mi">1</span> <span class="o">--</span><span class="n">force</span> </pre></div> </div> </div> <div class="section" id="id114"> <h4>タグをクリアする<a class="headerlink" href="#id114" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>タグを定義したが使いたくないのであれば、削除するために、 <code class="docutils literal"><span class="pre">tag</span></code> コマンドの <code class="docutils literal"><span class="pre">--delete</span></code> オプションを使うことができます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">tag</span> <span class="mf">2.0</span><span class="o">-</span><span class="n">beta</span><span class="o">-</span><span class="mi">4</span> <span class="p">(</span><span class="n">oops</span><span class="p">,</span> <span class="n">we</span><span class="s1">'re not releasing a 4th beta)</span> <span class="n">bzr</span> <span class="n">tag</span> <span class="mf">2.0</span><span class="o">-</span><span class="n">beta</span><span class="o">-</span><span class="mi">4</span> <span class="o">--</span><span class="n">delete</span> </pre></div> </div> </div> </div> </div> <div class="section" id="id115"> <h2><a class="toc-backref" href="#id303">同僚と共有する</a><a class="headerlink" href="#id115" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id116"> <h3><a class="toc-backref" href="#id304">他の人と連携する</a><a class="headerlink" href="#id116" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="peer-to-peer"> <h4>Peer-to-peerをうまくやる<a class="headerlink" href="#peer-to-peer" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>多くの場合、1人よりも2人で考える方がベターです。 1人でプロジェクトを始め、誰かがあなたを手伝いたい、もしくはあなたが別の人に助けを求めたいことがあります。 ペアプログラマとしてタスクを割り当てられたより大きなチームのメンバーであることでしょう。 どちらにしても、効率よく共同作業を行うために、2人の人間がプロセス、ガイドラインとツールセットの一式に同意する必要があります。</p> <p>誰かに電話で直接呼び出すことが許可されていなくて、彼らに話しかける唯一の方法は最初に電話会議を予約することである場合を想像してください。 集中型のVCSのリポジトリを通してのみコードを共有する企業とコミュニティは毎日そのような拘束に耐えています。 中央管理がうまくいくときもあれば、peer-to-peerがうまくいくときもあります。 Bazaarはどちらの場合でも手助けになるように設計されました。</p> </div> <div class="section" id="id117"> <h4>パートナーのワークフロー<a class="headerlink" href="#id117" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>これは唯一の方法ではありませんが、下記の <em>パートナーのワークフロー</em> はBazaarを利用してペアで共同作業をしたい人々のためのよいスタート地点です。</p> <img alt="../_images/workflows_peer.png" src="../_images/workflows_peer.png" /> <p>以前の章でカバーしたタスクに加えて、この章では2つの必要不可欠なコラボレーション活動を紹介します:</p> <blockquote> <div><ul class="simple"> <li>ブランチのコピーを手に入れる</li> <li>複数のブランチの間の変更をマージする</li> </ul> </div></blockquote> <p>コードベースに取り組むだけのときでも、たとえば異なるリリースのために複数のブランチを手元に置き必要に応じてそれらの変更をマージすることはとても実用的です。 あなたの “パートナー” が本当にあなた自身かもしれませんから。</p> </div> </div> <div class="section" id="id118"> <h3><a class="toc-backref" href="#id305">プロジェクトをブランチする</a><a class="headerlink" href="#id118" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="url"> <h4>ブランチのURL<a class="headerlink" href="#url" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>誰かがあなたの作品のコピーを手に入れる前に、転送プロトコルを理解する必要があります。 ブランチのトップレベルのディレクトリを、Windowsユーザーが慣れ親しんだ方法で、ネットワーク上で共有することを決定するとします。 LinuxとOS Xのユーザーは、大抵のSSHサーバーに組み込まれているセキュアなプロトコルである、SFTPを通してアクセスする方が望ましいです。 Bazaarは下記で一部が示されるたくさんのプロトコルのサポートに関して <em>とても</em> 柔軟です。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="13%" /> <col width="87%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">スキーム</th> <th class="head">説明</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>file://</td> <td>標準ファイルシステムを利用してアクセスする (デフォルト)</td> </tr> <tr class="row-odd"><td>bzr+ssh://</td> <td>SSH ごしのアクセス (リモートで最良の選択肢).</td> </tr> <tr class="row-even"><td>sftp://</td> <td>SFTPを利用してアクセスする (大抵のSSHサーバーはSFTPを提供する)</td> </tr> <tr class="row-odd"><td>bzr://</td> <td>Bazaarのスマートサーバーを利用した高速のアクセス</td> </tr> <tr class="row-even"><td>ftp://</td> <td>パッシブFTPを利用してアクセスする</td> </tr> <tr class="row-odd"><td>http://</td> <td>Webサーバーによって公開されたブランチへのアクセス</td> </tr> <tr class="row-even"><td>https://</td> <td>Webサーバーによって公開されたブランチへの、暗号化されたアクセス</td> </tr> </tbody> </table> </div></blockquote> <p>上記で示されるように、ブランチは転送プロトコルを示すスキームを伴うURLを使用して識別されます。 スキームが無ければ、通常のファイルの名前が想定されます。 サポートされるプロトコルの完全なリストに関しては、 <code class="docutils literal"><span class="pre">urlspec</span></code> のオンライントピックもしくはBazaarのユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#url-identifiers">URLの識別子</a> のセクションを参照してください。</p> <p>URL は通常サーバーのルートディレクトリから解決されます。 なので、 <code class="docutils literal"><span class="pre">ftp://example.com/repo/foo</span></code> はそのホストの <code class="docutils literal"><span class="pre">/repo/foo</span></code> ディレクトリを意味しています。(「通常」といっているのは、Apacheの ようないくつかのサーバーソフトウェアはURLを任意の場所にリマップ できるからです。この場合はサーバーの設定ファイルを確認して、 どのURLがどのディレクトリを参照しているかを探さないといけないでしょう)</p> <p>サーバー上の自分のホームディレクトリからの相対パスを使うには、チルダを 使います。たとえば <code class="docutils literal"><span class="pre">bzr+ssh://example.com/~/public_html</span></code> と書くと、 ホームディレクトリの中の <code class="docutils literal"><span class="pre">public_html</span></code> ディレクトリにマップされます。</p> <div class="admonition note"> <p class="first admonition-title">注釈</p> <p class="last">HTTP や HTTPS ごしのアクセスはデフォルトでは読み込み専用です。 読み書き両方に対応するための設定については、 <a class="reference external" href="http_smart_server.html#pushing-over-the-http-smart-server">HTTP スマートサーバーごしの push</a> を参照してください。</p> </div> </div> <div class="section" id="a-reminder-about-shared-repositories"> <span id="id120"></span><h4>共用レポジトリに関するリマインダ<a class="headerlink" href="#a-reminder-about-shared-repositories" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ブランチのコピーを手に入れる前に、ファイルシステム上に設置する場所を少し考えてみましょう。 最大限のストレージの効率性のために、共用リポジトリとしてセットアップされたディレクトリの元でブランチを作ることを推奨します。 (よく使われるレイアウトについては、 <a class="reference external" href="organizing_your_workspace.html">作業スペースを構成する</a> の中の <a class="reference external" href="organizing_your_workspace.html#feature-branches">ブランチの機能</a> を参照してください) たとえば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">my</span><span class="o">-</span><span class="n">repo</span> <span class="n">cd</span> <span class="n">my</span><span class="o">-</span><span class="n">repo</span> </pre></div> </div> <p>誰からでもブランチを入手して好きなようにする準備ができました。</p> </div> <div class="section" id="id123"> <h4>ブランチのコマンド<a class="headerlink" href="#id123" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>既存のブランチに基づいたブランチを手に入れるためには、 <code class="docutils literal"><span class="pre">branch</span></code> コマンドを使用してください。構文は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">URL</span> <span class="p">[</span><span class="n">directory</span><span class="p">]</span> </pre></div> </div> <p>ディレクトリの名前が渡されない場合、URLの最後の部分に基づいてディレクトリが作成されます。 ドライブ名 (M:/) とSFTPのURLを示すそれぞれの例は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">M</span><span class="p">:</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">sftp</span><span class="p">:</span><span class="o">//</span><span class="n">bill</span><span class="nd">@mary</span><span class="o">-</span><span class="n">laptop</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">repo</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">trunk</span> </pre></div> </div> <p>新しいブランチを使うために明示的にディレクトリの名前を渡す例は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">mary</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">repo</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">trunk</span> <span class="n">cool</span> </pre></div> </div> </div> <div class="section" id="id124"> <h4>時間とスペースへの考慮<a class="headerlink" href="#id124" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>転送されるブランチのサイズと コンピュータとソースのブランチの間のネットワーク帯域と レイテンシによっては、この初期の転送は少し時間がかかります。 その後の更新は変更のみが転送されるので遙かに速くなります。</p> <p>Bazaarは最新のスナップショットではなくブランチの完全な履歴を転送することを覚えておいてください。 結果として、 <code class="docutils literal"><span class="pre">branch</span></code> を完了させた後でネットワークから離脱しても、 ブランチの履歴に対して <code class="docutils literal"><span class="pre">log</span></code> と <code class="docutils literal"><span class="pre">diff</span></code> を好きなだけ行うことができます。 さらに、履歴がローカルで保存されているのでこれらのオペレーションは速いです。</p> <p>Bazaarはバージョンの履歴を保存するために求められるディスクスペースの総量を最小限にするスマートな圧縮技術を使うことに注意してください。 多くの場合、プロジェクトの完全な履歴は最新バージョンの作業コピーよりも少ないディスクスペースを占めます。</p> <p>後の章で説明するように、Bazaarはブランチの軽量チェックアウト、 すなわち履歴のローカルなストレージなしの作業ツリーもサポートします。 もちろん、接続しない使い方は利用できませんが、ローカルディスクスペースが本当に厳しいのであればそれはあなたが決めることができるトレードオフです。 現在、制限された履歴の振り返りのためのサポート - <em>履歴の水平線(history horizon)</em> - は開発段階にあります。</p> </div> <div class="section" id="id125"> <h4>ブランチの情報を閲覧する<a class="headerlink" href="#id125" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>配布元も含むブランチの情報を見たいのであれば、 <code class="docutils literal"><span class="pre">info</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">info</span> <span class="n">cool</span> </pre></div> </div> <p>ブランチが引数として渡されなければ、現在のブランチの情報が表示されます。</p> </div> </div> <div class="section" id="id126"> <h3><a class="toc-backref" href="#id306">変更をマージする</a><a class="headerlink" href="#id126" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id127"> <h4>並行開発<a class="headerlink" href="#id127" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>誰かがプロジェクトの独自ブランチを持ったら、 並行して変更を行い、オリジナルのブランチを続ける開発にコミットできます。 まもなくですが、開発の独立したラインを結合することが必要にあります。 このプロセスは <em>マージ (merging)</em> として知られます。</p> </div> <div class="section" id="merge"> <h4>mergeコマンド<a class="headerlink" href="#merge" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>別のブランチから変更を受け入れるためには、 <code class="docutils literal"><span class="pre">merge</span></code> コマンドを使います。 構文は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="p">[</span><span class="n">URL</span><span class="p">]</span> </pre></div> </div> <p>URLが渡されない場合、オリジナルのものから由来する初期のブランチがデフォルトとして使われます。 たとえば、BillがMaryの作業内容からブランチを作る場合、 下記のようにコマンドを入力すれば彼女の次の変更をマージできます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> </pre></div> </div> <p>一方で、MaryはBillのブランチで行われた作業内容を彼女のブランチにマージしたいかもしれません。 この場合、彼女は最初に明示的にURLを渡す必要があります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">mary</span><span class="nd">@bill</span><span class="o">-</span><span class="n">laptop</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">repo</span><span class="o">/</span><span class="n">cool</span><span class="o">-</span><span class="n">trunk</span> </pre></div> </div> <p>マージブランチがまだ設定されていなければ、これによってデフォルトのマージブランチが設定されます。 設定した後でデフォルトを変更するためには、 <code class="docutils literal"><span class="pre">--remember</span></code> オプションを使います。</p> </div> <div class="section" id="id128"> <h4>マージの動作方法は?<a class="headerlink" href="#id128" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>マージのためのいくつかのアルゴリズムがあります。 Bazaarのデフォルトのアルゴリズムは次のように動作する <em>3方向マージ (3-way merging)</em> の一種です。 Aが祖先でBとCの2つがブランチであると仮定すると、次のテーブルは使われるルールを提示します。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="9%" /> <col width="9%" /> <col width="9%" /> <col width="19%" /> <col width="53%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">A</th> <th class="head">B</th> <th class="head">C</th> <th class="head">結果</th> <th class="head">コメント</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>x</td> <td>x</td> <td>x</td> <td>x</td> <td>unchanged</td> </tr> <tr class="row-odd"><td>x</td> <td>x</td> <td>y</td> <td>y</td> <td>line from C</td> </tr> <tr class="row-even"><td>x</td> <td>y</td> <td>x</td> <td>y</td> <td>line from B</td> </tr> <tr class="row-odd"><td>x</td> <td>y</td> <td>z</td> <td>?</td> <td>conflict</td> </tr> </tbody> </table> </div></blockquote> <p>マージの中には人間の手助けによってのみ完了するものがあることに留意してください。 これらを解決する方法の詳細は <a class="reference external" href="resolving_conflicts.html">衝突を解消する</a> を参照してください。</p> </div> <div class="section" id="id130"> <h4>マージを記録する<a class="headerlink" href="#id130" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>衝突が解決した後で、マージをコミットする必要があります。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Merged Mary's changes"</span> </pre></div> </div> <p>衝突が無くても、明確なコミットがまだ必要です。 他のツールとは異なり、これはBazaarの機能と考えられています。 クリーンなマージは必ずしもよいマージとは限らないので、個別の明確なステップとしてコミットすることで、すべてがよい状態にあることを検証するための最初のテストスィートを実行できます。</p> <p>問題が見つかったら、マージをコミットする前にそれらを訂正するもしくは <code class="docutils literal"><span class="pre">revert</span></code> を使用してマージを廃棄すべきです。</p> </div> <div class="section" id="id131"> <h4>マージの追跡<a class="headerlink" href="#id131" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarの機能の中で最も重要な機能の1つは、分散型で高品質の<em>マージトラッキング</em> です。 言い換えると、Bazaarは何がすでにマージされていることを覚えており、マージのための最良の祖先を賢く選ぶためにその情報を使い、衝突の回数と規模を最小にします。</p> <p>あなたが他の多くのVCSツールの難民であるなら、 <em>何が何でもマージは避けさせてください</em> という習慣から抜け出すのは本当に難しいかもしれません。 Bazaarによっていつでも安全に他の人とのマージを行うことができます。 peer-to-peerの方法でうまくゆくときに、高い品質を保つために、 “統合のたまり場”として集中型のブランチを使うことも避けられます。 コラボレーションしている変更を本当に広く共有する準備ができたら、変更を中心のブランチにマージしてコミットする機会です。</p> <p>このようにマージ機能がうまくゆけば開発者の共同作業の方法を変えることができます。</p> </div> </div> <div class="section" id="id132"> <h3><a class="toc-backref" href="#id307">衝突の解消</a><a class="headerlink" href="#id132" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id133"> <h4>ワークフロー<a class="headerlink" href="#id133" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>マージプロセスの間にそれぞれの衝突を解消することを強制する他のいくつかのツールとは異なり、Bazaarはできる限りマージしてから衝突を報告します。 これによって衝突の解消をより扱いやすくします。 解消すべき方法を決めることを手助けするためにポストマージツリー全体の内容が利用可能だからです。 それぞれの解消もしくはグループがよい状態であることを確認するためにテストをいくつか選んで実行することもよいでしょう。</p> </div> <div class="section" id="id134"> <h4>衝突の一覧を表示する<a class="headerlink" href="#id134" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">merge</span></code> コマンドで報告されるのと同様に、突出した衝突の一覧は <code class="docutils literal"><span class="pre">conflicts</span></code> コマンドを使用することでいつでも表示されます。 これは <code class="docutils literal"><span class="pre">status</span></code> コマンドから出力の一部として含めることも可能です。</p> </div> <div class="section" id="id135"> <h4>衝突を解消する<a class="headerlink" href="#id135" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>衝突に遭遇したら、 <code class="docutils literal"><span class="pre">merge</span></code> コマンドは解決されていない領域を表示する埋め込みマーカーをそれぞれのファイルに追加します。 1つの衝突を持つそれぞれのファイルに対して3つのファイルも作ります:</p> <blockquote> <div><ul class="simple"> <li>foo.BASE</li> <li>foo.THIS</li> <li>foo.OTHER</li> </ul> </div></blockquote> <p><code class="docutils literal"><span class="pre">foo</span></code> は衝突したファイルの名前です。 多くの場合、問題になっているそれぞれのファイルを手作業で編集し、関連領域を修正し衝突マーカーを除去することで衝突を解消できます。</p> <p>衝突の中のすべてのファイルを修正し、マーカーを削除した後で、 <code class="docutils literal"><span class="pre">resolve</span></code> コマンドを使用してBazaarにそれらを解決したものとしてマークするように頼みます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">resolve</span> </pre></div> </div> <p>代わりに、それぞれのファイルを修正した後で、これを解消したものとしてマークできます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">resolve</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">resolve</span></code> コマンドは作業ツリーからBASE, THIS, OTHERファイルをクリーンナップします。</p> </div> <div class="section" id="remerge"> <h4>remergeコマンドを使う<a class="headerlink" href="#remerge" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>いくつかの場合、任意のファイルに対して異なるマージアルゴリズムを試したいことがあります。 これを行うためには、ファイルを次のように指定して <code class="docutils literal"><span class="pre">remerge</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">remerge</span> <span class="o">--</span><span class="n">weave</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> はファイルで <code class="docutils literal"><span class="pre">weave</span></code> オプションは利用可能なマージアルゴリズムです。 いわゆる <code class="docutils literal"><span class="pre">criss-cross</span></code> (十字遺伝)マージが検出されたときに、 たとえば、2つのブランチが同じものをマージしてからお互いをマージするときに、このアルゴリズムはとりわけ便利です。 詳細については <code class="docutils literal"><span class="pre">criss-cross</span></code> と <code class="docutils literal"><span class="pre">remerge</span></code> のオンラインヘルプを参照してください。</p> </div> <div class="section" id="id136"> <h4>衝突を解消するために外部ツールを利用する<a class="headerlink" href="#id136" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>衝突を解消するためにGUIツールを利用したいのであれば、 <em>extmerge</em> プラグインをインストールしてください。次のようにインストールできます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">extmerge</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> は衝突したファイルです。 解消するファイルの一覧を提供するよりも、すべての衝突ファイルを暗黙の内に指定するために <code class="docutils literal"><span class="pre">--all</span></code> オプションを利用できます。</p> <p><code class="docutils literal"><span class="pre">extmerge</span></code> コマンドは <code class="docutils literal"><span class="pre">bazaar.conf</span></code> ファイルの中の <code class="docutils literal"><span class="pre">external_merge</span></code> 設定によって指定されるツールを使います。 設定されていなければ、 <code class="docutils literal"><span class="pre">kdiff3</span></code> もしくは <code class="docutils literal"><span class="pre">opendiff</span></code> のような人気のあるマージツールが設定されます。 後者はOS XのFileMergeのコマンドラインインターフェイスです。</p> </div> </div> <div class="section" id="id137"> <h3><a class="toc-backref" href="#id308">変更に注釈を付ける</a><a class="headerlink" href="#id137" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id138"> <h4>内容の起源を探し出す<a class="headerlink" href="#id138" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>複数の人がファイルに取り組むとき、 誰が作ったのかもしくは最後に変更された内容を一度に見ることができるのは非常に便利です。 これを行うためには、annotateコマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">annotate</span> <span class="n">readme</span><span class="o">.</span><span class="n">txt</span> </pre></div> </div> <p>悲観主義者もしくは楽観主義者のどちらかであるなら、 <code class="docutils literal"><span class="pre">annotate</span></code> の組み込みのエイリアスである <code class="docutils literal"><span class="pre">blame</span></code> もしくは <code class="docutils literal"><span class="pre">praise</span></code> を使うことを好むかもしれません。 どの方法であれ、次のような情報と一緒にファイルのそれぞれの行が表示されます:</p> <blockquote> <div><ul class="simple"> <li>最後に変更した人</li> <li>最後に変更した時間</li> <li>コミットメッセージ</li> </ul> </div></blockquote> </div> <div class="section" id="gui"> <h4>GUIツール<a class="headerlink" href="#gui" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaar用のさまざまなGUIは注釈の情報を閲覧するためのグラフィカルなツールを提供します。 たとえば、bzr-gtkプラグインはこの機能を <code class="docutils literal"><span class="pre">gannotate</span></code> コマンドを使用して起動できるGUIツールとして提供します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">gannotate</span> <span class="n">readme</span><span class="o">.</span><span class="n">txt</span> </pre></div> </div> <p>GUIツールは関心のある情報をより豊かに表現するので (たとえばそれぞれのコミットのすべての変更内容)、テキストベースよりも好ましいかもしれません。</p> </div> </div> </div> <div class="section" id="id139"> <h2><a class="toc-backref" href="#id309">集中スタイルの、チームコラボレーション</a><a class="headerlink" href="#id139" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id140"> <h3><a class="toc-backref" href="#id310">集中型の開発</a><a class="headerlink" href="#id140" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id141"> <h4>動機<a class="headerlink" href="#id141" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>並行して作業をして時折マージするよりも、ロックステップ、すなわち複数の人が継続して変更を中心位置にコミットしてすべてのコミットの前に彼らの作業内容を最新の内容にマージすること、で一度に作業をすることは有用であることがあります。</p> <p>このワークフローはSubversionとCVSのような集中型のVCSツールのユーザーにはとても慣れ親しまれています。 単独の開発者が複数のマシンに取り組む場合にも応用できます。たとえば、通常はデスクトップで作業をするが旅行の間はラップトップ、もしくは(インターネットに接続した)ホームコンピュータで勤務時間外に事務作業を完了させるといった具合です。</p> <p>あなたのチームがすでに集中型の開発でうまくいっているのであれば、それは素晴らしいことです。 多くのチームはこの方法でBazaarを使い始め、後で代替のワークフローを実験します。</p> </div> <div class="section" id="id142"> <h4>集中型のワークフロー<a class="headerlink" href="#id142" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>下記のダイアグラムは <em>集中型のワークフロー</em> の概要を提供します。</p> <img alt="../_images/workflows_centralized.png" src="../_images/workflows_centralized.png" /> <p>あなたのチームがより分散型のワークフローを利用することを計画しているとしても、 この章でカバーされる多くのタスクは、とりわけブランチを公開する方法に関してあなたにとって有用です。</p> </div> </div> <div class="section" id="publishing-a-branch"> <span id="id143"></span><h3><a class="toc-backref" href="#id311">ブランチを公開する</a><a class="headerlink" href="#publishing-a-branch" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id144"> <h4>集中型リポジトリをセットアップする<a class="headerlink" href="#id144" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>集中型のワークフローはコンピュータ上のブランチを中心型のブランチとして指名することで使うことができます。 実際大抵のチームは集中型のブランチをホストするために専用サーバーを持ちます。</p> <p>共用リポジトリをローカルで使うことが最良の習慣であるように、中心型のブランチを共用リポジトリを設置することもお勧めです。 通常は、中心型の共用ブランチはファイルの作業コピーではなく履歴のみを保存することに注意してください。 なので、そのような共有リポジトリを作るときには通常 <code class="docutils literal"><span class="pre">no-trees</span></code> オプションを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">trees</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span> </pre></div> </div> <p>この手順をcvsrootもしくはSubversionのリポジトリのセットアップとして似たようなものとして考えることができます。 しかしながら、Bazaarはリポジトリ内のブランチの編成方法をより柔軟にします。 ガイドラインと例に関しては付録の <a class="reference external" href="shared_repository_layouts.html">共用レポジトリのレイアウト</a> を参照してください。</p> </div> <div class="section" id="id146"> <h4>集中型ブランチを始める<a class="headerlink" href="#id146" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>集中型ブランチに初期の内容を投入する方法は2つあります:</p> <blockquote> <div><ol class="arabic simple"> <li>ローカルのブランチを作り中央にプッシュする</li> <li>空の中央ブランチを作り内容をコミットする</li> </ol> </div></blockquote> <p>最初のやり方の例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">PROJECT</span> <span class="p">(</span><span class="n">ローカルリポジトリを準備する</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">init</span> <span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> <span class="n">cd</span> <span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> <span class="p">(</span><span class="n">開発ファイルをコピーする</span><span class="p">)</span> <span class="n">cp</span> <span class="o">-</span><span class="n">ar</span> <span class="o">~/</span><span class="n">PROJECT</span> <span class="o">.</span> <span class="p">(</span><span class="n">OS固有のツールを使用してファイルをコピーする</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">add</span> <span class="p">(</span><span class="n">リポジトリを投入する</span><span class="p">;</span> <span class="n">バージョン管理を始める</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Initial import"</span> <span class="p">(</span><span class="n">中心リポジトリに公開する</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">push</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> </pre></div> </div> <p>2番目のやり方の例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">PROJECT</span> <span class="p">(</span><span class="n">ローカルリポジトリを準備する</span><span class="p">)</span> <span class="n">cd</span> <span class="n">PROJECT</span> <span class="n">bzr</span> <span class="n">init</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">checkout</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> <span class="n">cd</span> <span class="n">trunk</span> <span class="n">cp</span> <span class="o">-</span><span class="n">ar</span> <span class="o">~/</span><span class="n">PROJECT</span> <span class="o">.</span> <span class="p">(</span><span class="n">OS固有のツールを使用してファイルをコピーする</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">add</span> <span class="p">(</span><span class="n">リポジトリを投入する</span><span class="p">;</span> <span class="n">バージョン管理を始める</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Initial import"</span> <span class="p">(</span><span class="n">中心リポジトリに公開する</span><span class="p">)</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">checkout</span></code> コミットを使って作られた作業ツリー内部でコミットするとローカルと同様に内容は暗黙の内に中心位置にコミットされることに注意してください。 <code class="docutils literal"><span class="pre">checkout</span></code> の代わりに <code class="docutils literal"><span class="pre">branch</span></code> コマンドを使ったので、内容はローカルにのみコミットされます。</p> <p>このように中心位置に密接に連動した作業ツリーは <em>チェックアウト(checkouts)</em> と呼ばれます。 この章の残りでは数多くの機能を詳しく説明します。</p> </div> </div> <div class="section" id="id147"> <h3><a class="toc-backref" href="#id312">チェックアウト機能を利用する</a><a class="headerlink" href="#id147" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id148"> <h4>ブランチをチェックアウトに変更する<a class="headerlink" href="#id148" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ローカルのブランチを作りチェックアウトに変更したいのであれば、 <code class="docutils literal"><span class="pre">bind</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">bind</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> </pre></div> </div> <p>たとえば以前のセクションで説明されたように <code class="docutils literal"><span class="pre">push</span></code> を使って集中型のブランチを作った後でこれは必要です。</p> <p>これをした後は、コミットはローカルに適用される前にバインドしたブランチに適用されます。</p> </div> <div class="section" id="id149"> <h4>チェックアウトをブランチに変更する<a class="headerlink" href="#id149" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>チェックアウトを通常のブランチに変更したい場合、 <code class="docutils literal"><span class="pre">unbind</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">unbind</span> </pre></div> </div> <p>この後で、コミットはローカルのみに適用されます。</p> </div> <div class="section" id="id150"> <h4>チェックアウトを入手する<a class="headerlink" href="#id150" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>集中型のブランチを利用してチームで作業するとき、1人の人物が以前のセクションで示される初期の内容を提供する必要があります。 その後は、それぞれの個人が ローカルのチェックアウト、すなわち彼らが変更を行うサンドボックス、を作るために <code class="docutils literal"><span class="pre">checkout</span></code> コマンドを使用します。</p> <p>SubversionとCVSと異なり、Bazaarでは <code class="docutils literal"><span class="pre">checkout</span></code> コマンドは最新の内容を保持している作業ツリーを作るのに加えて履歴のローカルな全コピーを作ります。 <code class="docutils literal"><span class="pre">diff</span></code> や <code class="docutils literal"><span class="pre">log</span></code> といったオペレーションは速く中心位置から接続していないときも利用できることを意味します。</p> </div> <div class="section" id="getting-a-lightweight-checkout"> <span id="id151"></span><h4>軽量チェックアウトを入手する<a class="headerlink" href="#getting-a-lightweight-checkout" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarはバージョン履歴を効率的に保存するために役立つ一方で、履歴が望まれていないときがあります。 たとえば、チームがBazaarを利用して集中型でウェブサイトの内容を管理している場合、公開ウェブサーバー上の内容のチェックアウトを更新するのと同じぐらいリリースプロセスは単純です。 この場合、次の理由からその場所にダウンロードする履歴は望まないでしょう:</p> <blockquote> <div><ul class="simple"> <li>必要のない履歴を保有することでディスクスペースを無駄遣いする</li> <li>秘密を維持したいBazaarブランチを公開する</li> </ul> </div></blockquote> <p>Bazaarで履歴のないチェックアウトを入手するには、 <code class="docutils literal"><span class="pre">--lightweight</span></code> オプションを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">checkout</span> <span class="o">--</span><span class="n">lightweight</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> </pre></div> </div> <p>もちろん、これによって通常のチェックアウトの多くの利点は失われますが、 役に立つ場合と時を選ぶトレードオフです。 <code class="docutils literal"><span class="pre">--lightweight</span></code> オプションは、すべてのブランチではなくチェックアウトのみに適用されます。</p> <p>注: コードベースが実際に大きくコンピュータ上のディスクスペースが限られている場合、 <a class="reference external" href="branching_a_project.html#a-reminder-about-shared-repositories">共用リポジトリ</a>, <a class="reference external" href="stacked.html">スタックブランチ</a>, <a class="reference external" href="reusing_a_checkout.html">チェックアウトを再利用する</a> を含めたすべてのオプションを必ず考えてください。</p> </div> <div class="section" id="id155"> <h4>最新の内容に更新する<a class="headerlink" href="#id155" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ロックステップでの他の人との連携の重要な面の1つはあなたのチェックアウトを集中型のブランチで行われた最新の変更に更新し続けることです。 SubversionもしくはCVSで行うように、Bazaarでは <code class="docutils literal"><span class="pre">update</span></code> コマンドを使用して次のように行います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">update</span> </pre></div> </div> <p>ブランチに結びつけられたブランチで利用可能な新しいリビジョンを入手してもしあればローカルの変更をマージします。</p> </div> <div class="section" id="id156"> <h4>コミットの失敗を扱う<a class="headerlink" href="#id156" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">commit</span></code> を実行する前にチェックアウトを最新にしなければならないことに注意してください。 Bazaarはこの点でSubversionもしくはCVSよりも厳密です - 変更したファイルだけでなくすべてのツリーを最新にする必要があります。 Bazaarはあなたが最後に更新した後で中心位置にリビジョンが追加されたことを検出すると <code class="docutils literal"><span class="pre">update</span></code> を実行するようにあなたに頼みます。</p> <p>バインドされたブランチへのネットワーク接続が失われると、コミットは失敗します。 いくつかの代替の次善策は次のセクションで説明します。</p> </div> </div> <div class="section" id="id157"> <h3><a class="toc-backref" href="#id313">オフラインで集中型のブランチに取り組む</a><a class="headerlink" href="#id157" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id158"> <h4>集中型のローカルコミットのワークフロー<a class="headerlink" href="#id158" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>旅行のためネットワーク接続できない場合、中心サーバーがダウンする、もしくは今は中心位置に公開せずにローカルで変更のスナップショットを記録したいだけなら、このワークフローはそんなあなたのためにあります。</p> <img alt="../_images/workflows_localcommit.png" src="../_images/workflows_localcommit.png" /> </div> <div class="section" id="id159"> <h4>ローカルでコミットする<a class="headerlink" href="#id159" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>チェックアウトで作業していてローカルだけでコミットする必要がある/したい場合、 <code class="docutils literal"><span class="pre">--local</span></code> オプションを <code class="docutils literal"><span class="pre">commit</span></code> コマンドに追加します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">commit</span> <span class="o">--</span><span class="n">local</span> </pre></div> </div> </div> <div class="section" id="id160"> <h4>長期間切断する<a class="headerlink" href="#id160" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>しばらくの間バインドされたブランチから切断をする予定もしくはしたい場合、 <code class="docutils literal"><span class="pre">--local</span></code> をすべての <code class="docutils literal"><span class="pre">commit</span></code> コマンドを追加することを覚えるのは面倒でしょう。 代わりの方法は チェックアウトを一時的に通常のブランチにするために <code class="docutils literal"><span class="pre">unbind</span></code> コマンドを用い、後でロックステップの状態に戻りたくなったときに <code class="docutils literal"><span class="pre">bind</span></code> コマンドを使うことです。</p> <p><code class="docutils literal"><span class="pre">bind</span></code> コマンドはこのブランチがチェックアウトされた最後の時間が結びつけられた場所を覚えるので、前の <code class="docutils literal"><span class="pre">unbind</span></code> の後で <code class="docutils literal"><span class="pre">bind</span></code> を使うときにリモートブランチのURLを入力する必要がないことに留意してください。</p> </div> <div class="section" id="id161"> <h4>ローカルコミットのシリーズをマージする<a class="headerlink" href="#id161" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>中心ブランチ上で進行中の開発から独立してローカルでコミットするとき、次回 <code class="docutils literal"><span class="pre">update</span></code> が実行されるときBazaarはこれらを開発の2つのラインとして扱います。 この場合、 <code class="docutils literal"><span class="pre">update</span></code> は次のことを行います:</p> <blockquote> <div><ul class="simple"> <li>これはバインドされたブランチからの最新のリビジョンを取り込み、チェックアウトをメインラインの状態にします。</li> <li>これは最後に更新した以降のローカルな変更を論理的に並行ブランチに移動します</li> <li>これらを一緒にマージするのでローカルの変更は <code class="docutils literal"><span class="pre">status</span></code> によって未解決マージ として報告されます</li> </ul> </div></blockquote> <p>常に、この後で作業内容を中心ブランチに送信するためには <code class="docutils literal"><span class="pre">commit</span></code> を実行する必要があります。</p> </div> </div> <div class="section" id="id162"> <h3><a class="toc-backref" href="#id314">チェックアウトを再利用する</a><a class="headerlink" href="#id162" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id163"> <h4>動機<a class="headerlink" href="#id163" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>時々、複数のブランチに取り組むために単独のチェックアウトをサンドボックスとして持つことは便利です。 挙げられる理由のいくつかは次の内容を含みます:</p> <blockquote> <div><ul class="simple"> <li>作業ツリーが大きいときディスクスペースを節約する</li> <li>固定された位置で開発する</li> </ul> </div></blockquote> <p>多くの場合、作業ツリーのディスクの利用量は <code class="docutils literal"><span class="pre">.bzr</span></code> ディレクトリよりも 大きくなります。 複数のブランチに取り組みたいが、それぞれの作業ツリーすべてのオーバーヘッドを許容できない場合、複数のブランチをまたがってチェックアウトを再利用することがうまくゆく方法です。</p> <p>他の機会において、サンドボックスの位置は数多くの開発とテストツールに設定されます。 繰り返しますが、複数のブランチをまたがったチェックアウトの再利用は役に立ちます。</p> </div> <div class="section" id="id164"> <h4>ブランチが結びつけられた場所を変更する<a class="headerlink" href="#id164" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>チェックアウトが結びつけられている場所を変更するためには、次の手順に従います:</p> <blockquote> <div><ol class="arabic simple"> <li>作業内容が失われないようにローカルの変更が中央ブランチにコミット されたことを確認します</li> <li>取り組みたい新しいリモートブランチのURLを渡して <code class="docutils literal"><span class="pre">bind</span></code> コマンドを使います</li> <li><code class="docutils literal"><span class="pre">revert</span></code> コマンドの後に続いて <code class="docutils literal"><span class="pre">update</span></code> コマンドを使用して望むブランチの コピーをチェックアウトします</li> </ol> </div></blockquote> <p>新しいブランチに bind して update するだけだと、コミットしたもの、していないもの両方のローカルの変更がマージされることに注意してください。 <code class="docutils literal"><span class="pre">revert</span></code> か <code class="docutils literal"><span class="pre">commit</span></code> を使って、それらを維持するか破棄するかを決めなければいけません。</p> <p>bind+update レシピの代わりは <code class="docutils literal"><span class="pre">switch</span></code> コマンドを使うことです。これは基本的に、ツリーの中のコミットされていない変更がマージされること以外は、既存のブランチを除去して新しい位置で <code class="docutils literal"><span class="pre">checkout</span></code> を再び実行することと同じです。</p> <p>注: 場合によってバインドされた異なるブランチの適切なキャッシュをチェックアウトするために <code class="docutils literal"><span class="pre">switch</span></code> はコミットされた変更を廃棄するので、ローカルにコミットされているが最も最近バインドされたブランチにまだコミットされていない変更が存在する場合意図的に失敗します。 これらの変更を本当に廃棄したいのであれば、 <code class="docutils literal"><span class="pre">--force</span></code> オプションを使います。</p> </div> <div class="section" id="id165"> <h4>軽量型チェックアウトを切り替える<a class="headerlink" href="#id165" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>軽量型チェックアウトでは、ローカルのコミットは存在せず、 <code class="docutils literal"><span class="pre">switch</span></code> は作業ツリーが関連づけられたブランチを効率よく選びます。 1つの可能なセットアップ方法は、ローカルツリーなしのリポジトリと軽量チェックアウトを組み合わせて使うことです。 これによって取り組むものを簡単に切り替えることができます。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">trees</span> <span class="n">PROJECT</span> <span class="n">cd</span> <span class="n">PROJECT</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">checkout</span> <span class="o">--</span><span class="n">lightweight</span> <span class="n">trunk</span> <span class="n">my</span><span class="o">-</span><span class="n">sandbox</span> <span class="n">cd</span> <span class="n">my</span><span class="o">-</span><span class="n">sandbox</span> <span class="p">(</span><span class="n">hack</span> <span class="n">away</span><span class="p">)</span> </pre></div> </div> <p>この例のこの範囲でtrunk <code class="docutils literal"><span class="pre">.bzr</span></code> ディレクトリを持ちますがそこでのブランチとしての作業ツリーはツリーなしのリポジトリで作られたことに注意してください。必要な数だけブランチを入手もしくは作成して必要に応じてそれらの間で切り替えることができます。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">my</span><span class="o">-</span><span class="n">sandboxの中にいることを前提とする</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">-</span><span class="mf">1.0</span> <span class="o">../</span><span class="n">PROJECT</span><span class="o">-</span><span class="mf">1.0</span> <span class="n">bzr</span> <span class="n">switch</span> <span class="o">../</span><span class="n">PROJECT</span><span class="o">-</span><span class="mf">1.0</span> <span class="p">(</span><span class="n">fix</span> <span class="n">bug</span> <span class="ow">in</span> <span class="mf">1.0</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"blah, blah blah"</span> <span class="n">bzr</span> <span class="n">switch</span> <span class="o">../</span><span class="n">trunk</span> <span class="p">(</span><span class="n">go</span> <span class="n">back</span> <span class="n">to</span> <span class="n">working</span> <span class="n">on</span> <span class="n">the</span> <span class="n">trunk</span><span class="p">)</span> </pre></div> </div> <p>注: ブランチはローカルのみのものでも、(<code class="docutils literal"><span class="pre">checkout</span></code> で作るか <code class="docutils literal"><span class="pre">branch</span></code> でそれらを作った後で <code class="docutils literal"><span class="pre">bind</span></code> を使うことで)リモートのブランチにバインドされたものでも可能です。</p> </div> </div> </div> <div class="section" id="id166"> <h2><a class="toc-backref" href="#id315">分散スタイルの、チームコラボレーション</a><a class="headerlink" href="#id166" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id167"> <h3><a class="toc-backref" href="#id316">分散型の開発</a><a class="headerlink" href="#id167" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id168"> <h4>動機<a class="headerlink" href="#id168" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>分散型のVCSツールは共同作業の新しい方法を提供します。 これは私達が生きる現代の世界をより反映したものでより高い品質の成果を可能にします。</p> </div> <div class="section" id="id169"> <h4>分散型の共用のメインラインのワークフロー<a class="headerlink" href="#id169" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローにおいて、それぞれの開発者は1つもしくは複数の独自のブランチに加えて、メインブランチのチェックアウトを持ちます。 開発者は個人のブランチに取り組み、準備ができたら、それをメインラインにマージします。</p> <img alt="../_images/workflows_shared.png" src="../_images/workflows_shared.png" /> <p>他の分散型のワークフローはこの章の後ろの方で検討します。</p> </div> </div> <div class="section" id="id170"> <h3><a class="toc-backref" href="#id317">ブランチを編成する</a><a class="headerlink" href="#id170" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id171"> <h4>ミラーブランチ<a class="headerlink" href="#id171" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>開発をするために分散型のワークフローを利用する際の主要な違いはメインのローカルブランチは変更を行う場所ではないことです。 代わりに、中心ブランチのそのままのコピーとして保存されます。 すなわち、これは <em>ミラーブランチ</em> です。</p> <p>ミラーブランチを作るためには、共用リポジトリ(まだなければ)を作りミラーを作るために <code class="docutils literal"><span class="pre">branch</span></code> コマンド(もしくは <code class="docutils literal"><span class="pre">checkout</span></code>)を使います。 例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">PROJECT</span> <span class="n">cd</span> <span class="n">PROJECT</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">centralhost</span><span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">PROJECT</span><span class="o">/</span><span class="n">trunk</span> </pre></div> </div> </div> <div class="section" id="id172"> <h4>タスクのブランチ<a class="headerlink" href="#id172" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>それぞれの新しい機能もしくは修正は独自のブランチの中で開発されます。 これらのブランチは <em>機能ブランチ</em> もしくは <em>タスクブランチ</em> として言及されます - 用語はお互いに置き換えて使うことができます。</p> <p>タスクブランチを作るためには、ミラーブランチに対して <code class="docutils literal"><span class="pre">branch</span></code> コマンドを使います。 例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">trunk</span> <span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="n">cd</span> <span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> </pre></div> </div> <p>この方法には数多くの利点があります:</p> <blockquote> <div><ol class="arabic simple"> <li>並行して複数の変更に取り組むことができます</li> <li>変更の間の交換が減ります</li> <li>複数の人々は準備ができるまでpeer-to-peerモードでブランチに取り組むことができます</li> </ol> </div></blockquote> <p>とりわけ、変更が他のものより料理するのに時間がかかるのであれば、レビューを求めたり、 フィードバックを適用することができます。 中心ブランチにマージする前に個別のブランチで十分な品質の作業を完了させることで、 中心ブランチの品質と安定性は以前よりも高い水準を維持します。</p> </div> <div class="section" id="id173"> <h4>ミラーブランチをリフレッシュする<a class="headerlink" href="#id173" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>これを行うためには <code class="docutils literal"><span class="pre">pull</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">trunk</span> <span class="n">bzr</span> <span class="n">pull</span> </pre></div> </div> </div> <div class="section" id="id174"> <h4>最新のトランクを機能ブランチにマージする<a class="headerlink" href="#id174" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>これを行うためには <code class="docutils literal"><span class="pre">merge</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="n">bzr</span> <span class="n">merge</span> <span class="p">(</span><span class="n">resolve</span> <span class="nb">any</span> <span class="n">conflicts</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"merged trunk"</span> </pre></div> </div> </div> <div class="section" id="id175"> <h4>機能をトランクにマージする<a class="headerlink" href="#id175" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>異なる分散型のワークフローの方針は変わります、 すべての開発者がメイントランクにコミットする権限を持つ最もシンプルな事例は下記のとおりです。</p> <p>ミラーがチェックアウトなら:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">trunk</span> <span class="n">bzr</span> <span class="n">update</span> <span class="n">bzr</span> <span class="n">merge</span> <span class="o">../</span><span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="p">(</span><span class="n">resolve</span> <span class="nb">any</span> <span class="n">conflicts</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Fixed bug #123"</span> </pre></div> </div> <p>ミラーがブランチの場合:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">trunk</span> <span class="n">bzr</span> <span class="n">pull</span> <span class="n">bzr</span> <span class="n">merge</span> <span class="o">../</span><span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="p">(</span><span class="n">resolve</span> <span class="nb">any</span> <span class="n">conflicts</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Fixed bug #123"</span> <span class="n">bzr</span> <span class="n">push</span> </pre></div> </div> </div> <div class="section" id="id176"> <h4>タスクブランチをバックアップする<a class="headerlink" href="#id176" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>集中型ワークフローの副作用の1つは変更がITオペレーションの一部としてバックアップされる中心位置にしょっちゅうコミットされることです。 タスクブランチを開発するとき、作業内容を中心位置に公開することはバックアップになるのでよい考えです(しかし共用位置であることは必須ではありません)。 この目的のためだけにローカルのタスクブランチをバックアップサーバー上で確立されたリモートブランチにバインドするとよいかもしれません。</p> </div> </div> <div class="section" id="id177"> <h3><a class="toc-backref" href="#id318">ゲートキーパーを利用する</a><a class="headerlink" href="#id177" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id178"> <h4>分散型の人間のゲートキーパーのワークフロー<a class="headerlink" href="#id178" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このワークフローでは、1人の開発者(ゲートキーパー) がメインブランチへのコミット権限を持つ一方で他の開発者はリードオンリーの権限のみを持ちます。 すべての開発者はタスクブランチの中で変更を行います。</p> <img alt="../_images/workflows_gatekeeper.png" src="../_images/workflows_gatekeeper.png" /> <p>開発者は彼らの作業内容をマージしたいとき、ゲートキーパーに彼らの変更をレビューして受け入れ可能であればマージするよう頼みます。 変更がレビューを失敗するとき、準備ができるまで関連のタスクブランチでさらなる開発が進みます。</p> <p>このアプローチの主要な面は含まれる制御の反転です: 開発者は変更を中心ブランチに”コミット/プッシュ”するときを決めなくて済みます: コードベースはゲートキーパーの “マージ/プル” による統制された変更方法によって発展します。 複数の中心ブランチとそれぞれ異なるゲートキーパーをを持つことはとてもよい方法で、 よく採用されている方法です。。 たとえば、現在の製品リリースと次のリリースのためにそれぞれ1つづつのブランチがあります。 この場合、たいがいはバグ修正を保持するタスクブランチは両方のゲートキーパーによって通知されます。</p> <p>このワークフローのすばらしい点の一つはスケーラブルであることです。 大きなプロジェクトはチームになりそれぞれのチームはゲートキーパーによって管理される <em>ローカルマスターブランチ</em> を持つことができます。 チームリーダーがリクエストするときにチームのマスターブランチからの変更をプライマリマスターブランチにマージするために誰かを主席ゲートキーパーに任命できます。</p> </div> <div class="section" id="id179"> <h4>分散型の自動ゲートキーパーのワークフロー<a class="headerlink" href="#id179" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>より高い品質を得るために、すべての開発者は変更を回帰テストスイートが通ったら変更のマージとコミットだけを行う自動ゲートキーパーに投稿できることが求められます。 このようなゲートキーパーの1つはPQMと呼ばれるソフトウェアツールです。</p> <img alt="../_images/workflows_pqm.png" src="../_images/workflows_pqm.png" /> <p>PQMに関する詳細な情報に関しては、 <a class="reference external" href="https://launchpad.net/pqm">https://launchpad.net/pqm</a> を参照してください。</p> </div> </div> <div class="section" id="id180"> <h3><a class="toc-backref" href="#id319">変更を送信する</a><a class="headerlink" href="#id180" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id181"> <h4>動機<a class="headerlink" href="#id181" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>多くの分散型のシナリオでは、開発者にとってURLを公開することでタスクブランチを共有することが常に現実的であるとは限りません。 たとえば、開発者が在宅で一晩中作業をする場合、ゲートキーパーが別のタイムゾーンでレビューしてマージしたいときに開発者はタスクブランチに十分にアクセスできません。</p> <p>Bazaarは手助けする巧妙な機能: <em>マージディレクティブ</em> を提供します。</p> </div> <div class="section" id="id182"> <h4>マージのディレクティブを理解する<a class="headerlink" href="#id182" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>マージディレクティブを”ミニブランチ” - ブランチが作成された後の成長部分 - として考えることができます。 これは変更点を記したソフトウェアパッチですが、追加情報として中間コミット、リネームとデジタル署名のようなメタデータがつきます。</p> <p>別の実用的なメタファはパケットケーキ: レシピと必要な材料を持ったマージディレクティブです。 具体的にいえば、材料とはブランチ上で加えられた全ての変更のメタデータで、レシピとはそれらの変更点をどうやってマージするかで、 <code class="docutils literal"><span class="pre">merge</span></code> コマンドが共通の祖先を選ぶのに利用する情報です。</p> <p>それらをどのように考えるのであれ、マージディレクティブはよいものです。 これらは簡単に作れて、メールに添付して送信するのに最適で、受け取った後でブランチと同じように処理できます。</p> </div> <div class="section" id="id183"> <h4>マージディレクティブを作る<a class="headerlink" href="#id183" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>マージディレクトリを作りオプションとして送信するためには、 <code class="docutils literal"><span class="pre">send</span></code> コマンドを使います。</p> <p>デフォルトでは、 <code class="docutils literal"><span class="pre">send</span></code> はマージディレクティブを ブランチのための “投稿アドレス” 、 通常はリード開発者もしくは開発メーリングリストにEメールを送信します。 オプションなしの <code class="docutils literal"><span class="pre">send</span></code> はマージディレクティブを作り、Eメールツールを作動させて添付し、少しの説明文を追加するための準備をします。 (この設定方法の詳細に関してはオンラインヘルプの <code class="docutils literal"><span class="pre">send</span></code> と リファレンスマニュアルの <a class="reference external" href="../user-reference/index.html#configuration-settings">構成設定</a> を参照)</p> <p>大抵のプロジェクトではパッチ付きのメールに説明文を追加し、パッチの理由と内容を説明します。 これによってレビューワは行単位の差分に入る前にいくらかの事情を理解できます。</p> <p>代わりに、 <code class="docutils literal"><span class="pre">--output</span></code> (or <code class="docutils literal"><span class="pre">-o</span></code>) オプションが渡されると、 <code class="docutils literal"><span class="pre">send</span></code> はマージディレクティブをファイルに書くので、あなた自身にメールを送り、 それを検査し、後の使用のために保存できます。 <code class="docutils literal"><span class="pre">-</span></code> の出力ファイルが渡されると、ディレクティブはstdoutに書き込まれます。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">X</span><span class="o">-</span><span class="n">fix</span><span class="o">-</span><span class="mi">123</span> <span class="n">bzr</span> <span class="n">send</span> <span class="o">-</span><span class="n">o</span> <span class="o">../</span><span class="n">fix</span><span class="o">-</span><span class="mf">123.</span><span class="n">patch</span> </pre></div> </div> </div> <div class="section" id="id185"> <h4>マージのディレクティブを適用する<a class="headerlink" href="#id185" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">merge</span></code> と <code class="docutils literal"><span class="pre">pull</span></code> コマンドを使うことでマージディレクティブはブランチと同じ方法で適用できます</p> <p>これらはBazaarを使わない上流のプロジェクトとコミュニケーションをするときにも便利です。 とりわけ、マージディレクティブ内の変更全体のプレビューは無地のソフトウェアパッチのようになるので、たとえば彼らは <code class="docutils literal"><span class="pre">patch</span> <span class="pre">-p0</span></code> を使用してそれらを適用できます。</p> </div> </div> </div> <div class="section" id="id186"> <h2><a class="toc-backref" href="#id320">その他のトピック</a><a class="headerlink" href="#id186" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id187"> <h3><a class="toc-backref" href="#id321">これからの長い旅</a><a class="headerlink" href="#id187" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>前の章でBazaarがあなた自身と他の人との共同作業を生産的にすることを手助けしてくれる方法について確固として理解して頂けることを筆者達は願っております。 初めてBazaarを学んでいるのであれば、一度習得したら、このマニュアルに戻るためにすでにカバーされた手順を試すとよいかもしれません。</p> <p>残りの章ではBazaarをより適切に使うためのさまざまなトピックをカバーしています。 明言されない限り、この章と残りの章はそれぞれ独立しているので好きな順序で 読むことができます。</p> </div> <div class="section" id="id188"> <h3><a class="toc-backref" href="#id322">疑似マージ</a><a class="headerlink" href="#id188" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id189"> <h4>チェリーピッキング<a class="headerlink" href="#id189" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>時々、ブランチの変更の全部ではなく一部だけを選んでマージすることが便利であることがあります。 これは一般的に <em>チェリーピッキング(cherrypicking)</em> として言及されます。</p> <p>チェリーピッキングが役に立ついくつかの事例:</p> <ul class="simple"> <li>メインの開発ブランチから修正の一部を取り出してリリースブランチに取り込む</li> <li>実験ブランチから改善内容を選別して機能ブランチに取り込む</li> </ul> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョン Xによってなされた変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">c</span> <span class="n">X</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョンXまでの変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> のリビジョンX以降の変更のみをマージするためには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span><span class="o">..</span> <span class="n">foo</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">foo</span></code> ブランチのリビジョンXからリビジョンYまでの変更のみをマージするには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="n">X</span><span class="o">..</span><span class="n">Y</span> <span class="n">foo</span> </pre></div> </div> <p>通常のマージと同じように、チェリーピックは明示的にコミットしなければなりません。 これを行う前に、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code> を利用した変更を見て何かあればテストスイートを実行するとよいでしょう。</p> <p>通常のマージとは異なり、Bazaarは現在はチェリーピックを追跡しません。 具体的に言うと、変更は通常のコミットと同じようになり、他のブランチから来た(内部の)変更履歴は失われます。 上記のようなチェリーピックが役に立つ場面では、このことはたいてい重大な問題ではありません。 フルマージが後で行われることはけっしてないと言える十分な理由があるからです。 そうではない場面では、変更が再びマージされたときにまた衝突を解消する必要があります。</p> </div> <div class="section" id="id190"> <h4>親のないマージ<a class="headerlink" href="#id190" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>チェリーピックに関連したテクニックとして、マージ元のリビジョンを参照せずに、 コミット前に親リビジョンを忘れることができます。 こうすると、このマージで行われた全ての変更が、1回のコミットで行われたような 効果があります。 マージしたあと、コミットする前に次のコマンドを実行します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">revert</span> <span class="o">--</span><span class="n">forget</span><span class="o">-</span><span class="n">merges</span> </pre></div> </div> <p>これで、作業ツリー内の変更は残したまま、その変更がどこからマージされたかの 記録だけを削除します。そして、次のコミットではマージされたリビジョンに 関する情報が一切ない状態で、全ての変更を記録します。</p> <p>この機能は、「きれいな」履歴を作りたいユーザーに取って便利なものですが、 Bazaarはもともとマージされた履歴を段階的に表示する機能を持っているので、 失った履歴の価値が履歴のきれいさの価値を上回らないように気をつける必要があります。 特に、この機能を使うとマージ元の変更だけを取り込んでその変更のマージ元を 記録しないので、後で同じマージ元からマージしようとすると余計なコンフリクトを 発生させる可能性があります。</p> </div> <div class="section" id="reverse-cherrypicking"> <span id="id191"></span><h4>リバースチェリーピッキング<a class="headerlink" href="#reverse-cherrypicking" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>チェリーピッキングは一連の変更を元に戻すことができます。この場合、リビジョン範囲の上界(upper bound)が下界(lower bound)よりも <em>小さく</em> なります。 たとえば、リビジョン10の変更を取り消すためのコマンドはこうなります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="o">-</span><span class="n">r</span> <span class="mf">10.</span><span class="o">.</span><span class="mi">9</span> </pre></div> </div> <p>どこかから、すべてではない大半の変更を得たい場合通常のマージをした後に少しのリバースチェリーピックを行うとよいでしょう。</p> </div> <div class="section" id="id192"> <h4>コミットされていない変更をマージする<a class="headerlink" href="#id192" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>複数のブランチを持っており、間違えて別のブランチを変更し始めた場合、訂正をとるステップは次のとおりです。 ブランチ <code class="docutils literal"><span class="pre">bar</span></code> で作業したかったのに、ブランチ <code class="docutils literal"><span class="pre">foo</span></code> で作業を始めてしまったという場合を前提とします:</p> <ol class="arabic simple"> <li><code class="docutils literal"><span class="pre">bar</span></code> ブランチに移動する</li> <li><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">merge</span> <span class="pre">--uncommitted</span> <span class="pre">foo</span></code> を実行する</li> <li>やってくる変更をチェックする (<code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code>)</li> <li><code class="docutils literal"><span class="pre">foo</span></code> ブランチに変更する</li> <li><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span></code> を実行する</li> </ol> </div> <div class="section" id="id193"> <h4>リベースする<a class="headerlink" href="#id193" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>通常のマージの別のオプションは <em>リベース(rebase)</em> です。 すなわち、現在のブランチが本来とは異なる地点をベースにするようにします。 リベースは <code class="docutils literal"><span class="pre">rebase</span></code> プラグインによって提供される <code class="docutils literal"><span class="pre">rebase</span></code> コマンドによってサポートされます。</p> <p><code class="docutils literal"><span class="pre">rebase</span></code> コマンドは現在の作業ディレクトリ内のリベースされるブランチ上で別のブランチの位置をとります。 ブランチが指定されないと親のブランチが使われ、通常これは望まれる結果です。</p> <p>最初のステップは現在のブランチのものであるが親のブランチではないリビジョンを特定することです。 現在のブランチはターゲットブランチと同じリビジョンに設定され、それぞれのリビジョンはブランチのトップで再現されます。 プロセスの終了時に現在のブランチがターゲットの最終リビジョンからブランチされたようになります。</p> <p>再現されるそれぞれのリビジョンがツリーの中で衝突を起こすことがあります。 これが起きたらコマンドは停止してそれらを修正しなければなりません。 <code class="docutils literal"><span class="pre">merge</span></code> するためにコミットを解消し、それらが解消されたものとしてマークするために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">resolve</span></code> を実行します。 すべての衝突を解消したら、リベースオペレーションを続けるために <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-continue</span></code> を実行します。 衝突に遭遇せず続けないことを決めたら、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">rebase-abort</span></code> を実行できます。 リプレイされるコミットの一覧を表示するために <code class="docutils literal"><span class="pre">rebase-todo</span></code> を利用することもできます。</p> <p>注: マージトラッキング機能が貧弱なVCSツールから来たユーザーの中にはリベースを好む人がいます。 古いツールでの作業方法に似ている、もしくは”完璧にきれいな” 履歴が重要だからです。 Bazaarでリベースする前に、通常のマージがベターな選択肢ではないのか考えてください。 とりわけ、始める前にプライベートなブランチをリベースするのは大丈夫ですが、 他の誰かとブランチを共有した後のリベースは <strong>強く非推奨</strong> です。</p> </div> </div> <div class="section" id="shelving-changes"> <h3><a class="toc-backref" href="#id323">Shelving Changes</a><a class="headerlink" href="#shelving-changes" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>ときどき、作業ツリーから一時的に変更点を取り除いて、あとで元に戻したいことがあるかもしれません。 たとえば何か作業中に小さいバグフィックスを見つけてコミットする場合などです。 Bazaarは変更を <code class="docutils literal"><span class="pre">shelf</span></code> (書棚)に保存する機能を持っています。 後で変更を元に戻したくなったときは、 <code class="docutils literal"><span class="pre">unshelve</span></code> を使って作業ツリーに戻すことができます。</p> <p>たとえば、一つか複数の変更がされた作業ツリーを考えて見ます...:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ 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. </pre></div> </div> <p><code class="docutils literal"><span class="pre">shelve</span></code> コマンドはインタラクティブにどの変更を作業ツリーに保留しておきたいのかを質問します。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ 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". </pre></div> </div> <p>もしたくさんの変更が作業ツリーにあるのであれば、 <code class="docutils literal"><span class="pre">shelve</span></code> コマンドにファイルのリストを渡して、それらのファイルの変更だけについて質問されるようにすることができます。 変更を shelve した後に <code class="docutils literal"><span class="pre">diff</span></code> コマンドで作業ツリーに期待する変更だけが残っていることを確認するとよいでしょう。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ 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 </pre></div> </div> <p>よし! - コミットする準備ができました:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr commit -m "improve first sentence" </pre></div> </div> <p>後になって、shelveした変更を作業ツリーに <code class="docutils literal"><span class="pre">unshelve</span></code> コマンドで戻します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr unshelve Unshelving changes with id "1". M description.txt All changes applied successfully. </pre></div> </div> <p>もし望むのであれば、複数のアイテムをshelfに置くことができます。 通常 <code class="docutils literal"><span class="pre">unshelve</span></code> が実行されるたびに最も最近 shelve された変更が元に戻されます。 明示的にどの変更を戻すのかを指定することで別の順序で unshelve することもできます。</p> <p>Bazaarはshelveされた後に変更があっても、shelfの変更を作業ツリーにマージするので、衝突が発生するかもしれません。 その場合は通常のマージ後と同じように衝突を解決しなければなりません。</p> </div> <div class="section" id="filtered-views"> <h3><a class="toc-backref" href="#id324">Filtered views</a><a class="headerlink" href="#filtered-views" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="filtered-view"> <h4>Filtered view の紹介<a class="headerlink" href="#filtered-view" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Viewはtreeに対するマスクを提供し、ユーザーはtreeの一部分に集中できるようになります。 このマスキングが役に立ついくつかの場面があります。たとえば、大きなプロジェクトの技術ライターやテスターはプロジェクトのうち一部のディレクトリやファイルだけを扱います。</p> <p>開発者は大規模な変更をviewを使っていくつかのコミットに分解したいと思うかもしれません。 <code class="docutils literal"><span class="pre">shelve</span></code> <code class="docutils literal"><span class="pre">unshelve</span></code> がいくつかの変更を後のコミットまでとっておくのに対して、viewは次のコミットに(何を含めないかではなく)何を含めるかを指定します。</p> <p>viewを作った後は、ファイルリストをサポートするコマンド - status, diff, commit, etc - に暗黙的に毎回そのファイルリストが渡されます。 それらのコマンドに明示的にファイルリストを渡すことも可能ですが、指名するファイルは現在のviewの中にないといけません。 対照的に、ツリーを対象とするコマンド - pull, merge, update, etc - はviewが作られた後もツリー全体に対して操作しますが、現在のviewに関係するもののみを報告します。 どちらのケースでも、Bazaarはユーザーに毎回viewが使われていることを報告するので、操作や出力がマスクされていることが判ります。</p> <p>ノート: filtered view は 2a フォーマット(Bazaar 2.0 以降でデフォルトの フォーマット)でのみ有効です。</p> </div> <div class="section" id="view"> <h4>view を作る<a class="headerlink" href="#view" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>次のように, <code class="docutils literal"><span class="pre">view</span></code> コマンドにファイルやディレクトリを指定することでviewを作ります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="n">file1</span> <span class="n">file2</span> <span class="n">dir1</span> <span class="o">...</span> </pre></div> </div> <p>出力は:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="s1">'my'</span> <span class="n">view</span><span class="p">:</span> <span class="n">file1</span><span class="p">,</span> <span class="n">file2</span><span class="p">,</span> <span class="n">dir1</span> </pre></div> </div> </div> <div class="section" id="id194"> <h4>現在のviewをリストする<a class="headerlink" href="#id194" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>現在のviewを見るには、 <code class="docutils literal"><span class="pre">view</span></code> コマンドに引数をつけないで実行します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> </pre></div> </div> <p>もしviewが無ければ、 <code class="docutils literal"><span class="pre">No</span> <span class="pre">current</span> <span class="pre">view.</span></code> というメッセージが出力されるでしょう。 そうでなければ、現在のviewの名前と内容が次のように表示されます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="s1">'my'</span> <span class="n">view</span> <span class="ow">is</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> </pre></div> </div> </div> <div class="section" id="id195"> <h4>viewを切り替える<a class="headerlink" href="#id195" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ほとんどの場合、viewは「変更を選択するために作られて、変更がコミットされると削除される」という具合に短い期間で使われます。 それ以外の場合では、viewに名前をつけてそれを切り替えたい場合があるかもしれません。</p> <p>名前つきviewを宣言してそれに切り替えるには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">name</span> <span class="n">view</span><span class="o">-</span><span class="n">name</span> <span class="n">file1</span> <span class="n">dir1</span> <span class="o">...</span> </pre></div> </div> <p>たとえば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">name</span> <span class="n">doc</span> <span class="n">NEWS</span> <span class="n">doc</span><span class="o">/</span> <span class="n">Using</span> <span class="n">doc</span> <span class="n">view</span><span class="p">:</span> <span class="n">NEWS</span><span class="p">,</span> <span class="n">doc</span><span class="o">/</span> </pre></div> </div> <p>名前つきviewを見るには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">name</span> <span class="n">view</span><span class="o">-</span><span class="n">name</span> </pre></div> </div> <p>名前つきviewに切り替えるには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">switch</span> <span class="n">view</span><span class="o">-</span><span class="n">name</span> </pre></div> </div> <p>全ての名前つきviewの一覧を得るには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="nb">all</span> </pre></div> </div> </div> <div class="section" id="id196"> <h4>一時的にviewを無効にする<a class="headerlink" href="#id196" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>現在のviewを削除せずに無効にしたい場合、 <code class="docutils literal"><span class="pre">off</span></code> という名前の仮想viewに切り替えることができます。これは、ツリー全体を一つか二つのコマンドで操作する必要があり(例: merge)、しかしその後に元のviewに戻りたい場合に便利です。</p> <p>現在のviewを削除せずに無効にするには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">switch</span> <span class="n">off</span> </pre></div> </div> <p>ツリー全体に対する操作が終わったら、元のviewの名前を指定して戻ることができます。たとえば、デフォルトの名前が使われて他のであれば:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">switch</span> <span class="n">my</span> </pre></div> </div> </div> <div class="section" id="id197"> <h4>viewを削除する<a class="headerlink" href="#id197" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>現在のviewを削除するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">delete</span> </pre></div> </div> <p>名前つきviewを削除するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">name</span> <span class="n">view</span><span class="o">-</span><span class="n">name</span> <span class="o">--</span><span class="n">delete</span> </pre></div> </div> <p>全てのviewを削除するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">view</span> <span class="o">--</span><span class="n">delete</span> <span class="o">--</span><span class="nb">all</span> </pre></div> </div> </div> <div class="section" id="id198"> <h4>注意点<a class="headerlink" href="#id198" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>view を定義しても作業ツリー内のほかのファイルを削除するわけではありません。単に作業ツリーに対する “レンズ” を提供するだけです。</p> <p>view は作業ツリーのメタデータとして保存されます。pull, push, update といったブランチコマンドを使っても他の作業ツリーに伝播しません。</p> <p>view はファイルパスの形で定義されます。もしview内のファイルをview外に 移動したのであれば、view はそのファイルを追跡しません。 たとえば、viewが <code class="docutils literal"><span class="pre">doc/</span></code> と定義されていて <code class="docutils literal"><span class="pre">doc/NEWS</span></code> を <code class="docutils literal"><span class="pre">NEWS</span></code> に移動しても view は <code class="docutils literal"><span class="pre">doc/</span></code> に定義されたままで、 <code class="docutils literal"><span class="pre">doc/</span></code> と <code class="docutils literal"><span class="pre">NEWS</span></code> のように変更されたりはしません。同じように、view内のファイルを削除してもviewからはそのファイルパスは削除されません。</p> <p>現在のviewを利用するコマンドは:</p> <ul class="simple"> <li>status</li> <li>diff</li> <li>commit</li> <li>add</li> <li>remove</li> <li>revert</li> <li>mv</li> <li>ls</li> </ul> <p>ツリー全体に対する操作だけれども現在のviewの中だけを報告するコマンドは:</p> <ul class="simple"> <li>pull</li> <li>update</li> <li>merge.</li> </ul> <p>現在のところ、多くのコマンドがviewを無視します。ニーズがあるコマンドから徐々に上の対応リストに追加されていくでしょう。 いくつかのコマンドは全体図を見るのがより適しているために、viewを無視したままになるでしょう。このタイプのコマンドには次のものがあります:</p> <ul class="simple"> <li>log</li> <li>info</li> </ul> </div> </div> <div class="section" id="id199"> <h3><a class="toc-backref" href="#id325">スタックブランチを利用する</a><a class="headerlink" href="#id199" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="motivation"> <span id="id200"></span><h4>ユースケース<a class="headerlink" href="#motivation" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>あるプロジェクトで作業しようとしていて、公開されているリポジトリに対して 読み込みアクセスはできるものの書き込みができないとしましょう。 公開されているリポジトリと同じホストで自分のブランチを公開したりバックアップ したりする場合、スタックブランチを使うことができるかもしれません。</p> <p>スタックブランチの他のユースケースとしては、実験的なブランチと、コード ホスティングサイトが挙げられます。これらのシナリオではスタックブランチの 特性がぴったりあいます。</p> </div> <div class="section" id="id201"> <h4>スタックブランチとは?<a class="headerlink" href="#id201" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スタックブランチ(stacked branch)は別の(スタック先)ブランチのリビジョンを 見つける方法を知っています。 スタックブランチはスタック先ブランチには存在しないユニークなリビジョンのみを 保存することで、ブランチの作成を高速にしたり、ディスク利用効率を向上します。 これらの観点から、スタックブランチは共用リポジトリと似ています。 しかしながら、スタックブランチは追加の利点があります:</p> <ul class="simple"> <li>新しいブランチはスタックされたブランチとは完全に異なる位置に設置できます。</li> <li>スタックブランチを削除すれば(共用リポジトリだと残ってしまう) リビジョンの情報も削除されます</li> <li>セキュリティは共用リポジトリよりも向上しています。 スタック先のリポジトリはスタックブランチにコミットする開発者に対して 物理的にリードオンリーだからです。</li> </ul> </div> <div class="section" id="id202"> <h4>スタックブランチを作成する<a class="headerlink" href="#id202" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スタックブランチを作成するには、branchコマンドの <code class="docutils literal"><span class="pre">stacked</span></code> オプションを使用します。 例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="o">--</span><span class="n">stacked</span> <span class="n">source</span><span class="o">-</span><span class="n">url</span> <span class="n">my</span><span class="o">-</span><span class="nb">dir</span> </pre></div> </div> <p>このコマンドによって <code class="docutils literal"><span class="pre">my-dir</span></code> がローカルリビジョンなしのスタックブランチとして作成されます。 定義されると、 <code class="docutils literal"><span class="pre">source-url</span></code> に関連づけされた公開ブランチは <em>スタックドオン(stacked on)</em> の位置として使われます。 さもなければ、 <code class="docutils literal"><span class="pre">source-url</span></code> は <em>スタックドオン</em> の位置になります。</p> </div> <div class="section" id="id203"> <h4>スタックチェックアウトを作成する<a class="headerlink" href="#id203" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スタックチェックアウトを直接作成する機能はまもなくサポートされる予定です。 それまでの間、2段階の処理が必要です:</p> <ol class="arabic simple"> <li>上記で示されたようにスタックブランチを作成する。</li> <li><code class="docutils literal"><span class="pre">reconfigure</span></code> もしくは <code class="docutils literal"><span class="pre">bind</span></code> コマンドのどちらかを利用して ブランチをチェックアウトに変換する。</li> </ol> </div> <div class="section" id="id204"> <h4>スタックブランチをプッシュする<a class="headerlink" href="#id204" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>多くのプロジェクトの大部分の変更は <em>開発トランク</em> or <em>現在の安定</em> ブランチといった既存のブランチを基礎としています。 これらの1つにスタックされた新しいブランチの作成は <code class="docutils literal"><span class="pre">push</span></code> コマンドを利用して 次のように簡単にできます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">push</span> <span class="o">--</span><span class="n">stacked</span><span class="o">-</span><span class="n">on</span> <span class="n">reference</span><span class="o">-</span><span class="n">url</span> <span class="n">my</span><span class="o">-</span><span class="n">url</span> </pre></div> </div> <p>このコマンドでは、 <code class="docutils literal"><span class="pre">reference-url</span></code> にスタックした新しいブランチを <code class="docutils literal"><span class="pre">my-url</span></code> に作成し、 <code class="docutils literal"><span class="pre">reference-url</span></code> には無いリビジョンだけをそこに格納します。 <code class="docutils literal"><span class="pre">my-url</span></code> は <code class="docutils literal"><span class="pre">reference-url</span></code> と同じホストでも構いません。</p> <p>ローカルブランチがスタックブランチとして作成された場合、 <code class="docutils literal"><span class="pre">push</span></code> するには <code class="docutils literal"><span class="pre">--stacked</span></code> オプションを使うことが可能で スタック先の位置を省略できます。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="o">--</span><span class="n">stacked</span> <span class="n">source</span><span class="o">-</span><span class="n">url</span> <span class="n">my</span><span class="o">-</span><span class="nb">dir</span> <span class="n">cd</span> <span class="n">my</span><span class="o">-</span><span class="nb">dir</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"fix bug"</span> <span class="n">bzr</span> <span class="n">push</span> <span class="o">--</span><span class="n">stacked</span> </pre></div> </div> <p>この使い方は、上述したユースケースにマッチしています。</p> </div> <div class="section" id="id205"> <h4>スタックブランチの制限<a class="headerlink" href="#id205" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スタックブランチに関して覚えておくべき大事なことは、ほとんど全てのオペレーションでスタック先ブランチが必要になることです。 これは両方のブランチがローカルもしくは同じサーバーにあるときは問題にはなりません。</p> <p>また、ほとんどの履歴がスタック先リポジトリに格納されているので、スタック先 リポジトリへのアクセスがネットワーク経由だった場合に <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></code> のようなコマンドが遅くなるかもしれません。</p> </div> <div class="section" id="id206"> <h4>スタックするブランチを変更する<a class="headerlink" href="#id206" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">reconfigure</span></code> コマンドを使ってスタックドオンブランチを変更したりスタックするのをやめたりすることができます。 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">reconfigure</span> <span class="pre">--unstacked</span></code> を実行した場合、bzrは全ての参照されているデータをスタックドオンブランチからスタックされていたブランチにコピーしてくることに注意してください。 大きなレポジトリにおいては、これは時間がかかったりリポジトリサイズを増大させたりします。</p> </div> </div> <div class="section" id="id207"> <h3><a class="toc-backref" href="#id326">スマートサーバーを稼働させる</a><a class="headerlink" href="#id207" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>BazaarはHTTP、FTPもしくはSFTPを通して動作するので特化したサーバーは必須ではありません。 SSH、inetd、もしくは専用モードで起動できるスマートサーバー(smart server)の選択肢があります。</p> <div class="section" id="id208"> <h4>ダムサーバー<a class="headerlink" href="#id208" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>HTTP、FTP、SFTPとHTTP-WebDAVを”ダム(dumb)”サーバーとして記述します。 これらはBazaarに支援を提供しないからです。 これらのプロトコルのどれかを通してBazaarリポジトリを利用できるようにする場合、 Bazaarはリモートからの読み込みを許可します。 実行しているBazaarコマンドの中でブランチへのURLを入力するだけです。:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">bazaar</span><span class="o">.</span><span class="n">launchpad</span><span class="o">.</span><span class="n">net</span><span class="o">/~</span><span class="n">bzr</span><span class="o">-</span><span class="n">pqm</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">bzr</span><span class="o">.</span><span class="n">dev</span> </pre></div> </div> <p>BazaarはFTP、SFTPと(プラグインを通した)HTTP-WebDAVを通した書き込みをサポートします。</p> </div> <div class="section" id="id209"> <h4>ハイパフォーマンスなスマートサーバー<a class="headerlink" href="#id209" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ハイパフォーマンスなスマートサーバー(hpss - high-performance smart server)はいくつかのオペレーションをダムサーバーよりも遙かに高速に実行します。 開発者がパフォーマンスのチューニングを継続するので、将来のリリースではスマートサーバーを利用することで改善されるオペレーションの範囲は増えます。</p> <p>高度なセキュリティの維持を可能にするために、 デフォルトでは現在のスマートサーバーはリードオンリーになります。 読み込みと書き込み権限を有効にするには、 <code class="docutils literal"><span class="pre">--allow-writes</span></code> で動かします。 SSHアクセスメソッドを利用するとき、bzrは <code class="docutils literal"><span class="pre">--allow-writes</span></code> オプションで自動的に実行します。</p> <p>次はスマートサーバーの代替の設定方法を説明します。</p> <div class="section" id="ssh"> <h5>SSH<a class="headerlink" href="#ssh" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>SSHを通してBazaarを利用する際にサーバー上の特別な設定は必要ありません。 サーバーに Bazaar がインストールされていれば、 <code class="docutils literal"><span class="pre">bzr+ssh</span></code> の URL を 利用することができます。 例:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">branch</span> </pre></div> </div> <p><cite>bzr</cite> がサーバーのシステムワイドな場所にインストールされていない場合、 リモートの <cite>bzr</cite> がどこにあるかをローカルの <cite>bzr</cite> に教える必要があるかも しれません。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">BZR_REMOTE_PATH</span><span class="o">=~/</span><span class="nb">bin</span><span class="o">/</span><span class="n">bzr</span> <span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">branch</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">BZR_REMOTE_PATH</span></code> 環境変数はリモートシステムで <cite>bzr</cite> が起動する方法を調整します。 デフォルトでは単に <cite>bzr</cite> として起動するので、 <cite>bzr</cite> 実行ファイルはデフォルトの検索パス上にあることが要求されます。 この設定を場所ごとの設定ファイルである <code class="docutils literal"><span class="pre">locations.conf</span></code> に書いて 永続化することもできます。</p> <p>SFTP と同じく、 <code class="docutils literal"><span class="pre">~</span></code> で始まるパスはホームディレクトリからの相対パスになります。 例えば <code class="docutils literal"><span class="pre">bzr+ssh://example.com/~code/proj</span></code> のようになります。 加えて、 <code class="docutils literal"><span class="pre">~user</span></code> は user のホームディレクトリからの相対パスになります。</p> </div> <div class="section" id="inetd"> <h5>inetd<a class="headerlink" href="#inetd" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>この例では <code class="docutils literal"><span class="pre">/srv/bzr/repo/branchname</span></code> にブランチがある <code class="docutils literal"><span class="pre">/srv/bzr/repo</span></code> 内の 共用リポジトリ用に専用ユーザーの <cite>bzruser</cite> で <cite>bzr</cite> を実行する方法を示しています。</p> <p>inetdからBazaarサーバーを動かすにはinetd.confエントリが必要です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="mi">4155</span> <span class="n">stream</span> <span class="n">TCP</span> <span class="n">nowait</span> <span class="n">bzruser</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">bzr</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">bzr</span> <span class="n">serve</span> <span class="o">--</span><span class="n">inet</span> <span class="o">--</span><span class="n">directory</span><span class="o">=/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">repo</span> </pre></div> </div> <p>クライアントコマンドを実行するとき、提供するURLは inetd.confに渡される <code class="docutils literal"><span class="pre">--directory</span></code> オプションに相対的な <cite>bzr://</cite> です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">branchname</span> </pre></div> </div> <p>可能であれば、 <code class="docutils literal"><span class="pre">~</span></code> や <code class="docutils literal"><span class="pre">~user</span></code> で始まるパスは <code class="docutils literal"><span class="pre">bzr+ssh</span></code> と同じように展開されますが、 <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">serve</span></code> に指定された <code class="docutils literal"><span class="pre">--directory</span></code> オプションの外にあるホームディレクトリには アクセスできません。</p> </div> <div class="section" id="id210"> <h5>専用サーバー<a class="headerlink" href="#id210" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>このモードはinetdモードと同じパスとURLのふるまいを持ちます。 特定のユーザーとして実行するには、 <code class="docutils literal"><span class="pre">su</span></code> を使うもしくはそのユーザーとしてログインします。</p> <p>この例では公式のポート番号の <cite>4155</cite> 上でbzrを稼働しすべてのインターフェイス上でリスンします。 これによってポート <cite>4155</cite> 上のマシンに到達できる世界のどこからでも接続できます。</p> <p>サーバー:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">serve</span> <span class="o">--</span><span class="n">directory</span><span class="o">=/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">repo</span> </pre></div> </div> <p>クライアント:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">branchname</span> </pre></div> </div> <p>この例では <cite>localhost</cite> のポート <cite>1234</cite> で <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">serve</span></code> が実行されます。</p> <p>サーバー:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">serve</span> <span class="o">--</span><span class="n">listen</span><span class="o">=</span><span class="n">localhost</span> <span class="o">--</span><span class="n">port</span><span class="o">=</span><span class="mi">1234</span> <span class="o">--</span><span class="n">directory</span><span class="o">=/</span><span class="n">srv</span><span class="o">/</span><span class="n">bzr</span><span class="o">/</span><span class="n">repo</span> </pre></div> </div> <p>クライアント:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="p">:</span><span class="o">//</span><span class="n">localhost</span><span class="p">:</span><span class="mi">1234</span><span class="o">/</span><span class="n">branchname</span> </pre></div> </div> </div> </div> </div> <div class="section" id="id211"> <h3><a class="toc-backref" href="#id327">フックを利用する</a><a class="headerlink" href="#id211" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id212"> <h4>フックとは?<a class="headerlink" href="#id212" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarのふるまいをカスタマイズする1つの方法は <em>フック(hook)</em> です。 フックによって特定のBazaarの特定のオペレーションの前後でアクションを実行できます。 オペレーションは <code class="docutils literal"><span class="pre">commit</span></code>, <code class="docutils literal"><span class="pre">push</span></code>, <code class="docutils literal"><span class="pre">pull</span></code> と <code class="docutils literal"><span class="pre">uncommit</span></code> を含みます。 フックとパラメータの完全なリストに関しては、ユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#hooks">フック</a> を参照してください。</p> <p>大抵のフックはクライアントで実行されますが、サーバーで実行されるものもわずかに あります。 (サーバーサイドのオペレーションの特殊なケースを扱うものは <a class="reference external" href="http://doc.bazaar.canonical.com/plugins/en/push-and-update-plugin.html">push-and-update plugin</a> も参照。)</p> </div> <div class="section" id="id214"> <h4>フックを使用する<a class="headerlink" href="#id214" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>フックを使用するには、 <a class="reference external" href="http://doc.bazaar.canonical.com/plugins/en/plugin-development.html">プラグインを書きます</a> 。 新しいコマンドを作成する代わりに、このプラグインはフックを定義してインストールします。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bzrlib</span> <span class="k">import</span> <span class="n">branch</span> <span class="k">def</span> <span class="nf">post_push_hook</span><span class="p">(</span><span class="n">push_result</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"The new revno is </span><span class="si">%d</span><span class="s2">"</span> <span class="o">%</span> <span class="n">push_result</span><span class="o">.</span><span class="n">new_revno</span> <span class="n">branch</span><span class="o">.</span><span class="n">Branch</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">install_named_hook</span><span class="p">(</span><span class="s1">'post_push'</span><span class="p">,</span> <span class="n">post_push_hook</span><span class="p">,</span> <span class="s1">'My post_push hook'</span><span class="p">)</span> </pre></div> </div> <p>この例を使用するには、 <code class="docutils literal"><span class="pre">push_hook.py</span></code> という名前のファイルを作り <code class="docutils literal"><span class="pre">plugins</span></code> サブディレクトリに設置します。 (プラグインをインストールしていなければ、 <code class="docutils literal"><span class="pre">plugins</span></code> ディレクトリを作る必要があります)。</p> <p>以上です!次回にpushすると、”The new revno is...”が表示されます。 もちろん、Pythonのフルパワーを思いとおりにできるので、フックはこれよりもはるかに手が込んでいます。 これでフックの使い方を理解したので、それらで何をするかはあなたしだいです。</p> <p>プラグインのコードは2つのことを行います。 最初に、これは <code class="docutils literal"><span class="pre">push</span></code> が完了した後に実行する関数を定義します。 (代わりにインスタンスメソッドもしくは呼び出し可能なオブジェクトを使用することもできます。) すべてのpushフックは単独の引数 <code class="docutils literal"><span class="pre">push_result</span></code> をとります。</p> <p>2番目に、プラグインはフックをインストールします。 最初の引数 <code class="docutils literal"><span class="pre">'post_push'</span></code> はフックがインストールされている場所を特定します。 2番目の引数はフック自身です。3番目の引数は <code class="docutils literal"><span class="pre">'My</span> <span class="pre">post_push</span> <span class="pre">hook'</span></code> という名前で、 これは進行メッセージとエラーメッセージで使用されます。</p> <p>To reduce the start-up time of Bazaar it is also possible to “lazily” install hooks, using the <code class="docutils literal"><span class="pre">bzrlib.hooks.install_lazy_named_hook</span></code> 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:</p> <p>Bazaar のスタートアップ時間を短縮するために、フックを “遅延” インストールすることができます。 遅延インストールには <code class="docutils literal"><span class="pre">bzrlib.hooks.install_lazy_named_hook</span></code> 関数を使います。 遅延インストールを使えば、フックをインストールするためだけにフックポイントを含むモジュールを ロードする必要がなくなります。 次の例は、上の例の遅延バージョンです。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bzrlib</span> <span class="k">import</span> <span class="n">hooks</span> <span class="k">def</span> <span class="nf">post_push_hook</span><span class="p">(</span><span class="n">push_result</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"The new revno is </span><span class="si">%d</span><span class="s2">"</span> <span class="o">%</span> <span class="n">push_result</span><span class="o">.</span><span class="n">new_revno</span> <span class="n">hooks</span><span class="o">.</span><span class="n">install_lazy_named_hook</span><span class="p">(</span><span class="s1">'bzrlib.branch'</span><span class="p">,</span> <span class="s1">'Branch.hooks'</span><span class="p">,</span> <span class="s1">'post_push'</span><span class="p">,</span> <span class="n">post_push_hook</span><span class="p">,</span> <span class="s1">'My post_push hook'</span><span class="p">)</span> </pre></div> </div> </div> <div class="section" id="id216"> <h4>フックをデバッグする<a class="headerlink" href="#id216" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>インストールされたフックの一覧 (と、利用可能なフックポイントの一覧) を表示するには、 隠しコマンドである <code class="docutils literal"><span class="pre">hooks</span></code> コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">hooks</span> </pre></div> </div> </div> <div class="section" id="id217"> <h4>例: マージプラグイン<a class="headerlink" href="#id217" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>次の例は <code class="docutils literal"><span class="pre">Merger.merge_file_content</span></code> フックのデモのための、完全なプラグインです。 このプラグインは、 <code class="docutils literal"><span class="pre">*.xml</span></code> の名前のファイルに対する全てのマージに着いて、 Bazaar がそのマージがクリーンだと判断しても必ず「衝突」状態にします。</p> <p><code class="docutils literal"><span class="pre">merge_xml.py</span></code>:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="sd">"""Custom 'merge' logic for *.xml files.</span> <span class="sd">Always conflicts if both branches have changed the file.</span> <span class="sd">"""</span> <span class="kn">from</span> <span class="nn">bzrlib.merge</span> <span class="k">import</span> <span class="n">PerFileMerger</span><span class="p">,</span> <span class="n">Merger</span> <span class="k">def</span> <span class="nf">merge_xml_files_hook</span><span class="p">(</span><span class="n">merger</span><span class="p">):</span> <span class="sd">"""Hook to merge *.xml files"""</span> <span class="k">return</span> <span class="n">AlwaysConflictXMLMerger</span><span class="p">(</span><span class="n">merger</span><span class="p">)</span> <span class="k">class</span> <span class="nc">AlwaysConflictXMLMerger</span><span class="p">(</span><span class="n">PerFileMerger</span><span class="p">):</span> <span class="k">def</span> <span class="nf">file_matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span> <span class="n">filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_filename</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">merger</span><span class="o">.</span><span class="n">this_tree</span><span class="p">)</span> <span class="k">return</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'.xml'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">merge_matching</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'conflicted'</span><span class="p">,</span> <span class="n">params</span><span class="o">.</span><span class="n">this_lines</span> <span class="n">Merger</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">install_named_hook</span><span class="p">(</span> <span class="s1">'merge_file_content'</span><span class="p">,</span> <span class="n">merge_xml_files_hook</span><span class="p">,</span> <span class="s1">'*.xml file merge'</span><span class="p">)</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">merge_file_content</span></code> hooks are executed for each file to be merged. For a more a complex example look at the <code class="docutils literal"><span class="pre">news_merge</span></code> plugin that’s bundled with Bazaar in the <code class="docutils literal"><span class="pre">bzrlib/plugins</span></code> directory.</p> <p><code class="docutils literal"><span class="pre">merge_file_content</span></code> フックは各ファイルがマージされるたびに呼ばれます。 もっと複雑な例として、 Bazaar の <code class="docutils literal"><span class="pre">bzrlib/plugins</span></code> ディレクトリに同梱されている <code class="docutils literal"><span class="pre">news_merge</span></code> プラグインも参照してください。</p> </div> </div> <div class="section" id="id218"> <h3><a class="toc-backref" href="#id328">バージョンの情報をエクスポートする</a><a class="headerlink" href="#id218" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id219"> <h4>最新のリビジョン番号を得る<a class="headerlink" href="#id219" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ビルドスクリプトの中で最新のリビジョン番号だけが必要な場合、 <code class="docutils literal"><span class="pre">revno</span></code> コマンドを使用できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr revno 3104 </pre></div> </div> </div> <div class="section" id="id220"> <h4>詳細なバージョン情報を得る<a class="headerlink" href="#id220" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>最新バージョンに関する詳細な情報を出力するには <code class="docutils literal"><span class="pre">version-info</span></code> コマンドを使用できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ 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 </pre></div> </div> <p>オペレーティングシステムツールもしくはスクリプトを使用して出力を簡単にフィルタリングできます。 例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr version-info | grep ^date date: 2007-12-11 17:51:18 +0000 </pre></div> </div> <p>より高度な後処理のためにすべてのリビジョンに関するバージョン情報が必要であれば、 <code class="docutils literal"><span class="pre">--all</span></code> オプションはその情報を実際にダンプします。</p> </div> <div class="section" id="python"> <h4>Pythonのプロジェクト<a class="headerlink" href="#python" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プロジェクトファイルをビルドするためにMakefileを使う場合、 次のようにバージョン情報用のファイルを簡単に生成できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">library</span><span class="o">/</span><span class="n">_version</span><span class="o">.</span><span class="n">py</span><span class="p">:</span> <span class="n">bzr</span> <span class="n">version</span><span class="o">-</span><span class="n">info</span> <span class="o">--</span><span class="nb">format</span> <span class="n">python</span> <span class="o">></span> <span class="n">library</span><span class="o">/</span><span class="n">_version</span><span class="o">.</span><span class="n">py</span> </pre></div> </div> <p>これは3つのディレクトリを含むファイルを生成します:</p> <blockquote> <div><ul class="simple"> <li><cite>version_info</cite>: 現在の状態に関する基本情報を含むディレクトリ。</li> <li><cite>revisions</cite>: コミット時間とコミットメッセージと一緒に、 ツリーの履歴の中のすべてのリビジョンのリストを表示するディクショナリ。 <code class="docutils literal"><span class="pre">--all</span></code> もしくは <code class="docutils literal"><span class="pre">--include-history</span></code> が提供されない限り、デフォルトではこれは空です。 リリースバージョンに含まれる、バグ修正などを追跡したい場合に便利です。 しかし多くのプロジェクトに対してこれは必要以上の情報です。</li> <li><cite>file_revisions</cite>: プロジェクトのすべてのファイルに対する最終修正のリビジョンのリストを示すディクショナリ。 これは <code class="docutils literal"><span class="pre">$Id$</span></code> キーワードがCVSで管理されたファイルと同じように使われます。 最終修正の日付は <code class="docutils literal"><span class="pre">revisions</span></code> マップで探すことで決定されます。 デフォルトではこれは空で、 <code class="docutils literal"><span class="pre">--all</span></code> もしくは <code class="docutils literal"><span class="pre">--include-file-revisions</span></code> によってのみ有効になります</li> </ul> </div></blockquote> </div> <div class="section" id="id221"> <h4>別のフォーマットでバージョン情報を得る<a class="headerlink" href="#id221" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>任意のフォーマットのバージョン情報を取得するためにBazaarはテンプレートベースの方法をサポートします。 <code class="docutils literal"><span class="pre">version-info</span></code> への <code class="docutils literal"><span class="pre">--custom</span></code> オプションは作業ツリーのステータスに基づいて拡張された変数を含む <code class="docutils literal"><span class="pre">--template</span></code> 引数を提供することで使用できます。</p> <p>たとえば、現在のリビジョン番号を含むフォーマットされた文字列を伴うCヘッダーファイルを生成するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">version</span><span class="o">-</span><span class="n">info</span> <span class="o">--</span><span class="n">custom</span> \ <span class="o">--</span><span class="n">template</span><span class="o">=</span><span class="s2">"#define VERSION_INFO </span><span class="se">\"</span><span class="s2">Project 1.2.3 (r</span><span class="si">{revno}</span><span class="s2">)</span><span class="se">\"\n</span><span class="s2">"</span> \ <span class="o">></span> <span class="n">version_info</span><span class="o">.</span><span class="n">h</span> </pre></div> </div> <p><code class="docutils literal"><span class="pre">{revno}</span></code> は作業ツリーのリビジョン番号に置き換えされます。 (上記の例があなたのOSで動作しない場合、一行ですべてのコマンドを入力してみてください) テンプレートの中で利用できる変数の詳細な情報に関しては、 Bazaarのユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#version-info">Version Info</a> を参照してください。</p> <p>特定の言語でバージョン情報をダンプするために予め定義されるフォーマットはは現在開発段階にあります。 この領域の要求に関してはメーリングリストで私達開発者に連絡して下さるようお願いします。</p> </div> <div class="section" id="id222"> <h4>チェッククリーン<a class="headerlink" href="#id222" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プロジェクトの内容に関する大抵の情報はリビジョンエントリを読むだけで簡単に決定できます。 しかしながら、作業ツリーがパッケージされたときにそれが最新であったこと、 もしくはローカルな修正があったことを知るためには便利です。 <code class="docutils literal"><span class="pre">--all</span></code> もしくは <code class="docutils literal"><span class="pre">--check-clean</span></code> のどちらかを提供することで <code class="docutils literal"><span class="pre">bzr</span></code> は作業ツリーを検査して、 <code class="docutils literal"><span class="pre">version_info</span></code> <code class="docutils literal"><span class="pre">clean</span></code> を設定します。 同様に <code class="docutils literal"><span class="pre">modified</span></code> が適切である場合に <code class="docutils literal"><span class="pre">file_revisions</span></code> でエントリを設定します。</p> </div> </div> </div> <div class="section" id="id223"> <h2><a class="toc-backref" href="#id329">人気のあるプラグインの手短なツアー</a><a class="headerlink" href="#id223" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="bzrtools"> <h3><a class="toc-backref" href="#id330">BzrTools</a><a class="headerlink" href="#bzrtools" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id224"> <h4>概要<a class="headerlink" href="#id224" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>BzrToolsは便利なBazaar強化機能のコレクションです。 インストールの手引きに関しては、BzrToolsのホームページを参照してください: <a class="reference external" href="http://wiki.bazaar.canonical.com/BzrTools">http://wiki.bazaar.canonical.com/BzrTools</a>. よく使われるコマンドのサンプルは下記のとおりです。</p> </div> <div class="section" id="shell"> <h4>shell<a class="headerlink" href="#shell" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">shell</span></code> はBazaarのコマンドを理解する以上のことを行うコマンドインタープリタを起動します。 これはいくつかの利点を持ちます:</p> <blockquote> <div><ul class="simple"> <li>すべてのコマンドの冒頭で <code class="docutils literal"><span class="pre">bzr</span></code> を入力する必要が無くなります。</li> <li>インテリジェントな自動入力補完が提供されます。</li> <li>Bazaarのライブラリを毎回ロードする必要がないのでコマンドは少し速く動作します。</li> </ul> </div></blockquote> </div> <div class="section" id="cdiff"> <h4>cdiff<a class="headerlink" href="#cdiff" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><code class="docutils literal"><span class="pre">bzr</span> <span class="pre">cdiff</span></code> は GNU/Linux、UNIXとOS Xで <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></code> の出力の色つきバージョンを提供します。 次のようによく使われます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">cdiff</span> <span class="o">|</span> <span class="n">less</span> <span class="o">-</span><span class="n">R</span> </pre></div> </div> </div> </div> <div class="section" id="bzr-svn"> <h3><a class="toc-backref" href="#id331">bzr-svn</a><a class="headerlink" href="#bzr-svn" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id225"> <h4>概要<a class="headerlink" href="#id225" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>bzr-svnによって集中型のSubversionリポジトリをまだ利用しているプロジェクトでBazaarをVCSクライアントとして使うことができます。 Subversionリポジトリへのアクセスは大部分は透明、すなわちネイティブのBazaarブランチで <code class="docutils literal"><span class="pre">bzr</span></code> を使用するようにSubversionリポジトリで大部分の <code class="docutils literal"><span class="pre">bzr</span></code> コマンドを直接利用できます。</p> <p>多くのbzr-svnユーザーは集中型のSubversionトランクのローカルミラーを作成し、機能ブランチに取り組み、準備ができたときに変更をすべててSubversionに戻します。 これによって既存のチーム規模のプロセスとSubversionの上に現在組み込まれているツール統合フックを妨げずに分散型VCSツールの多くの利点を得られます。 本当に、これはBazaarを採用しようとしているがタイミングもしくは非技術的な利用からまだ採用していないチームのための共通の暫定ステップです</p> <p>インストールの手引きに関しては、bzr-svnのホームページをご覧ください: <a class="reference external" href="http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion">http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion</a></p> </div> <div class="section" id="id226"> <h4>シンプルな例<a class="headerlink" href="#id226" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>GNOMEプロジェクトの <strong>beagle</strong> でのシンプルな使い方です。 最初に、ブランチの保存用のローカルな共用リポジトリをセットアップしてトランクをチェックアウトします:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">beagle</span><span class="o">-</span><span class="n">repo</span> <span class="n">cd</span> <span class="n">beagle</span><span class="o">-</span><span class="n">repo</span> <span class="n">bzr</span> <span class="n">checkout</span> <span class="n">svn</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">svn</span><span class="o">.</span><span class="n">gnome</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">svn</span><span class="o">/</span><span class="n">beagle</span><span class="o">/</span><span class="n">trunk</span> <span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> </pre></div> </div> <p>次に、フィーチャブランチを作成してハックします:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> <span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="n">cd</span> <span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"blah blah blah"</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"blah blah blah"</span> </pre></div> </div> <p>機能がクックされたとき、トランクをリフレッシュして変更をマージします:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">../</span><span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">update</span> <span class="n">bzr</span> <span class="n">merge</span> <span class="o">../</span><span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Complete comment for SVN commit"</span> </pre></div> </div> <p>トランクミラーはチェックアウトなので、それにコミットすれば実際のSubversionトランクにコミットされます。 以上です!</p> </div> <div class="section" id="id227"> <h4>集中型のミラーを利用する<a class="headerlink" href="#id227" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>大きなプロジェクトに関しては、上記のレシピを調整すれば役立つことがしばしあります。 とりわけ、初期のチェックアウトはとても遅い可能性があるのでプロジェクトに関するすべてのSubversionリポジトリをBazaarリポジトリに一旦インポートして、 そのネイティブのBazaarリポジトリからブランチを作成します。 bzr-svnはリポジトリからリポジトリへの変換を行うために <code class="docutils literal"><span class="pre">svn-import</span></code> コマンドを提供します。 使い方の例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">svn</span><span class="o">-</span><span class="kn">import</span> <span class="nn">svn</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">svn</span><span class="o">.</span><span class="n">gnome</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">svn</span><span class="o">/</span><span class="n">beagle</span> </pre></div> </div> <p>中央のBazaarミラーを利用するために更新された上記からのレシピです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">beagle</span><span class="o">-</span><span class="n">repo</span> <span class="n">cd</span> <span class="n">beagle</span><span class="o">-</span><span class="n">repo</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">bzr</span><span class="o">+</span><span class="n">ssh</span><span class="p">:</span><span class="o">//</span><span class="n">bzr</span><span class="o">.</span><span class="n">gnome</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">beagle</span><span class="o">.</span><span class="n">bzr</span><span class="o">/</span><span class="n">trunk</span> <span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> <span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="n">cd</span> <span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"blah blah blah"</span> <span class="p">(</span><span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">,</span> <span class="n">hack</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"blah blah blah"</span> <span class="n">cd</span> <span class="o">../</span><span class="n">beagle</span><span class="o">-</span><span class="n">trunk</span> <span class="n">bzr</span> <span class="n">pull</span> <span class="n">bzr</span> <span class="n">merge</span> <span class="o">../</span><span class="n">beagle</span><span class="o">-</span><span class="n">feature1</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"Complete comment for SVN commit"</span> <span class="n">bzr</span> <span class="n">push</span> </pre></div> </div> <p>この場合、トランクへのコミットをしてもローカルでマージをコミットするだけです。 マスターのSubversionトランクにコミットを戻すには、追加コマンド(<code class="docutils literal"><span class="pre">bzr</span> <span class="pre">push</span></code>)が必要です。</p> <p>注: トランクブランチで <code class="docutils literal"><span class="pre">pull</span></code> と <code class="docutils literal"><span class="pre">push</span></code> のコマンドを最初に使う際に これらのコマンドに関連URLを渡す必要があります。 その後で、bzrはそれらを記憶します。</p> <p>このセットアップの最後のピースはSubversionのものと同期される中心のBazaarミラーをSubversionのリポジトリと同期し続けるためにスクリプトを適切な場所に設置することです。 これはcronジョブを追加したり、Subversionフックを利用するなどによって行われます。</p> </div> <div class="section" id="id228"> <h4>bzr-svnの制限<a class="headerlink" href="#id228" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>BazaarとはSubversionは異なる機能を持つ異なるツールなので何らかの相互運用問題が常に存在します。 bzr-svn 0.5.4 に関するいくつかの例です:</p> <blockquote> <div><ul class="simple"> <li>Bazaarはversioned propertiesをサポートしません</li> <li>Bazaarはファイルのコピーのトラッキングをサポートしません</li> </ul> </div></blockquote> <p>現在の制約の一覧に関しては、bzr-svnのウェブページ、 <a class="reference external" href="http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion">http://wiki.bazaar.canonical.com/BzrForeignBranches/Subversion</a> を参照してください。</p> </div> </div> </div> <div class="section" id="id229"> <h2><a class="toc-backref" href="#id332">Bazaarを環境に統合する</a><a class="headerlink" href="#id229" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="id230"> <h3><a class="toc-backref" href="#id333">ウェブブラウジング</a><a class="headerlink" href="#id230" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id231"> <h4>概要<a class="headerlink" href="#id231" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>BazaarのリポジトリをWeb上で閲覧するために利用できる選択肢は幅広くあり、主要なものは Loggerhead です。 Loggerhead のホームページは <a class="reference external" href="https://launchpad.net/loggerhead">https://launchpad.net/loggerhead</a> にあります。</p> <p>ダウンロードリンクを含めてこれらのパッケージの最新情報に関しては <a class="reference external" href="http://wiki.bazaar.canonical.com/WebInterface">http://wiki.bazaar.canonical.com/WebInterface</a> を参照してください。</p> <p>注: プロジェクトがホストされているもしくはLaunchpadでミラーリングされている場合、 Loggerheadのコードブラウジング機能はサービスの一部として提供されます。</p> </div> </div> <div class="section" id="id232"> <h3><a class="toc-backref" href="#id334">バグトラッカー</a><a class="headerlink" href="#id232" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>Bazaarにはコミットをプロジェクトのバグトラッカーのバグに関連づけできる機能があります。 コミットとバグの間のハイパーリンクを生成する、もしくはコミットを含むブランチで閉じたバグを自動的にマークするために、他のツール (もしくはフック) はこの情報を使うことができます。</p> <div class="section" id="id233"> <h4>コミットとバグを関連付ける<a class="headerlink" href="#id233" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>コミットを行うとき、 <code class="docutils literal"><span class="pre">commit</span></code> の <code class="docutils literal"><span class="pre">--fixes</span></code> オプションを利用することでバグと関連付けることができます。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr commit --fixes lp:12345 -m "Properly close the connection" </pre></div> </div> <p>このコマンドの実行によってコミットとLaunchpdのバグ12345とリンクするBazaarのメタデータが記録されます。 異なるバグトラッカーを使う場合、( <code class="docutils literal"><span class="pre">lp</span></code> の代わりに) 独自のトラッカーコードを渡して代わりに使うことができます。 Bugzilla、Trac、Roundupとその他のバグ/問題トラッカーに対してこれを設定する方法の詳細に関しては、 Bazaarユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#bug-tracker-settings">バグトラッカーの設定</a> を参照してください。</p> </div> <div class="section" id="id235"> <h4>メタデータの記録 vs バグトラッカーの更新<a class="headerlink" href="#id235" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>コミット時に修正されたバグに関するメタデータの記録は完全なバグトラッカーの統合機能の中で唯一必要なものです。 Bazaarは分散型VCSなので、ユーザーがオフラインでコミットしているためバグトラッカー自身へのアクセスが不可能な場合があります。 代わりに、プロジェクトのワークフローに適切な中心位置に変更をpushするとき、バグトラッカーを更新するためにフックをインストールすることが推奨されます。</p> <p>注: この2番目の処理段階はLaunchpadの外部もしくはホストされているブランチがスキャンされるときに Launchpadによって提供される統合機能の一部です。</p> </div> <div class="section" id="id236"> <h4>訂正をする<a class="headerlink" href="#id236" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>リビジョンとバグを関連付けるこの方法にはいくつかの制限があります。 最初のものは関連づけはコミット時のみにしかできないことです。 このことは、コミットするもしくは修正した後でバグが報告することを忘れた場合、 一般的に後から差し戻してリンクを追加できないことを意味します。</p> <p>これに関連したことは関連づけは不変であるという事実です。 バグがあるコミットによって修正されたものとしてマークされたが、リビジョンがバグを十分に解決しない、 もしくは後で回帰がある場合、差し戻してリンクを削除できません。</p> <p>もちろん、正しいオプションで行うために最新コミットをアンドゥする <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">uncommit</span></code> が常に使われます。 これは正しくないコミットメッセージを訂正するためによく行われ、(たとえば <code class="docutils literal"><span class="pre">--fixes</span></code> を通した)最新コミットに 記録されたメタデータを訂正するために等しく当てはまります。</p> <p>注: 正しくないリビジョンが公開される前に <code class="docutils literal"><span class="pre">uncommit</span></code> を行うのがベストです。</p> </div> </div> </div> <div class="section" id="id237"> <h2><a class="toc-backref" href="#id335">付録</a><a class="headerlink" href="#id237" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="specifying-revisions"> <span id="id238"></span><h3><a class="toc-backref" href="#id336">リビジョンを指定する</a><a class="headerlink" href="#specifying-revisions" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="revision-identifiers-and-ranges"> <span id="id239"></span><h4>リビジョンの識別子と範囲<a class="headerlink" href="#revision-identifiers-and-ranges" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarは1つのリビジョンもしくはリビジョンの範囲を指定するための豊富な表現方法を持ちます。 リビジョンの範囲を指定するには、上限と下限を <code class="docutils literal"><span class="pre">..</span></code> のシンボルで区切ります。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r 1..4 </pre></div> </div> <p>境界値の片方を省略できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r 1.. $ bzr log -r ..4 </pre></div> </div> <p>コマンドの中には範囲ではなく1つのリビジョンだけをとるものがあります。例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr cat -r 42 foo.c </pre></div> </div> <p>他の場合、範囲は必要ですが、範囲の長さを1つにします。 これに関連したコマンドについて、 <code class="docutils literal"><span class="pre">-c</span></code> オプションは次のように使われます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr diff -c 42 </pre></div> </div> </div> <div class="section" id="available-revision-identifiers"> <span id="id240"></span><h4>利用可能なリビジョンの識別子<a class="headerlink" href="#available-revision-identifiers" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>リビジョン、もしくは範囲の境界、は 下記に示される異なるフォーマットを利用して渡すことができます。</p> <blockquote> <div><table border="1" class="docutils"> <colgroup> <col width="39%" /> <col width="61%" /> </colgroup> <tbody valign="top"> <tr class="row-odd"><td>引数の型</td> <td>説明</td> </tr> <tr class="row-even"><td><em>number</em></td> <td>リビジョン番号</td> </tr> <tr class="row-odd"><td><strong>revno</strong>:<em>number</em></td> <td>リビジョン番号</td> </tr> <tr class="row-even"><td><strong>last</strong>:<em>number</em></td> <td>負のリビジョン番号</td> </tr> <tr class="row-odd"><td><em>guid</em></td> <td>グローバルでユニークなリビジョンID</td> </tr> <tr class="row-even"><td><strong>revid</strong>:<em>guid</em></td> <td>グローバルでユニークなリビジョンID</td> </tr> <tr class="row-odd"><td><strong>before</strong>:<em>rev</em></td> <td>‘’rev’‘の左端の親</td> </tr> <tr class="row-even"><td><em>date-value</em></td> <td>渡された日付の後の最初のエントリ</td> </tr> <tr class="row-odd"><td><strong>date</strong>:<em>date-value</em></td> <td>渡された日付の後の最初のエントリ</td> </tr> <tr class="row-even"><td><em>tag-name</em></td> <td>渡されたタグにマッチするリビジョン</td> </tr> <tr class="row-odd"><td><strong>tag</strong>:<em>tag-name</em></td> <td>渡されたタグにマッチするリビジョン</td> </tr> <tr class="row-even"><td><strong>ancestor</strong>:<em>path</em></td> <td>ブランチからのマージされた最新のリビジョン</td> </tr> <tr class="row-odd"><td><strong>branch</strong>:<em>path</em></td> <td>別のブランチの最新リビジョン</td> </tr> <tr class="row-even"><td><strong>submit</strong>:<em>path</em></td> <td>投稿ブランチの共通の祖先</td> </tr> </tbody> </table> </div></blockquote> <p>これらのフォーマットの手短な紹介は下記のとおりです。 完全な詳細内容に関しては、 Bazaarユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#revision-identifiers">リビジョンの識別子</a> を参照してください。</p> <div class="section" id="id242"> <h5>番号<a class="headerlink" href="#id242" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>正の数は現在のブランチにおけるリビジョン番号を表します。 リビジョン番号は <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></code> の出力の中で “revno”とラベルされます。 最初の10のリビジョンのログを表示するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r ..10 </pre></div> </div> <p>負の数は最新リビジョンから数えます。-1は最後にコミットされたリビジョンです。</p> <p>最新の10のリビジョンのログを表示するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r -10.. </pre></div> </div> </div> <div class="section" id="revid"> <h5>revid<a class="headerlink" href="#revid" title="このヘッドラインへのパーマリンク">¶</a></h5> <p><strong>revid</strong> は <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span> <span class="pre">--show-ids</span></code> や他のコマンドによって示される内部の リビジョンIDの指定を可能にします。</p> <p>例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r revid:Matthieu.Moy@imag.fr-20051026185030-93c7cad63ee570df </pre></div> </div> </div> <div class="section" id="before"> <h5>before<a class="headerlink" href="#before" title="このヘッドラインへのパーマリンク">¶</a></h5> <dl class="docutils"> <dt><strong>before</strong></dt> <dd>‘’rev’‘は’‘rev’’ の左端の親を指定します。 これはリビジョンの履歴で ‘’rev’’ の前に現れるリビジョン、 もしくは ‘’rev’’ がコミットされたときに最新であったリビジョンです。</dd> </dl> <p>‘’rev’’ はリビジョンの識別子であり連結できます。</p> <p>例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r before:before:4 ... revno: 2 ... </pre></div> </div> </div> <div class="section" id="date"> <h5>date<a class="headerlink" href="#date" title="このヘッドラインへのパーマリンク">¶</a></h5> <dl class="docutils"> <dt><strong>date</strong></dt> <dd>‘’value’’ は真夜中もしくは指定された時刻での与えられた日付の、 深夜12時か指定された時刻の後の最初の履歴エントリにマッチします。</dd> </dl> <p>正式な値は次のとおりです:</p> <blockquote> <div><ul class="simple"> <li><strong>yesterday</strong></li> <li><strong>today</strong></li> <li><strong>tomorrow</strong></li> <li><strong>YYYY-MM-DD</strong> 書式の日付</li> <li><strong>YYYY-MM-DD,HH:MM:SS</strong> 書式の日付/時間、2番目はオプションです (コンマに注意)</li> </ul> </div></blockquote> <p>“今日のログエントリすべてをください”ということを伝える適切な方法は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr log -r date:yesterday..date:today </pre></div> </div> </div> <div class="section" id="ancestor"> <h5>Ancestor<a class="headerlink" href="#ancestor" title="このヘッドラインへのパーマリンク">¶</a></h5> <dl class="docutils"> <dt><strong>ancestor</strong>:<em>path</em></dt> <dd>現在のブランチと異なるブランチ間の共通の祖先を指定します。 これはマージの目的に使われる同じ祖先です。</dd> </dl> <p><em>path</em> はリモートブランチのURLもしくはローカルブランチへのファイルパスになります。</p> <p>たとえば、 <code class="docutils literal"><span class="pre">../parent</span></code> からフォークされた以降のブランチで行われた変更を見るには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr diff -r ancestor:../parent </pre></div> </div> </div> <div class="section" id="branch"> <h5>Branch<a class="headerlink" href="#branch" title="このヘッドラインへのパーマリンク">¶</a></h5> <dl class="docutils"> <dt>branch</dt> <dd><code class="docutils literal"><span class="pre">path</span></code> は別のブランチの最新リビジョンを指定します。</dd> </dl> <p><code class="docutils literal"><span class="pre">path</span></code> はリモートブランチのURLもしくはローカルブランチへのファイルパスです。</p> <p>たとえば、手元のブランチと別のブランチの間の違いを取得するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr diff -r branch:http://example.com/bzr/foo.dev </pre></div> </div> </div> </div> </div> <div class="section" id="organizing-your-workspace"> <span id="id243"></span><h3><a class="toc-backref" href="#id337">作業スペースを構成する</a><a class="headerlink" href="#organizing-your-workspace" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="common-workspace-layouts"> <span id="id244"></span><h4>一般的なレイアウト<a class="headerlink" href="#common-workspace-layouts" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarのユーザーがプロジェクトのための作業スペースを構成するベストな方法は、次のような要素に依存します:</p> <ul class="simple"> <li>ユーザーの役割: プロジェクトオーナー vs コア開発者 vs カジュアルな貢献者</li> <li>ワークフロー: プロジェクトが推奨/強制している、貢献のためのワークフロー</li> <li>サイズ: 大きいプロジェクトは小さいプロジェクトよりもリソースを要求します。</li> </ul> <p>少なくとも4つの一般的なワークスペースの構成方法があります。</p> <ul class="simple"> <li>lightweight checkout</li> <li>standalone tree</li> <li>feature branches</li> <li>switchable sandbox.</li> </ul> <p>各レイアウトの簡単な説明を以下に記します。</p> </div> <div class="section" id="id245"> <h4>軽量チェックアウト<a class="headerlink" href="#id245" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このレイアウトでは、作業ツリーはローカルですがブランチはリモートにあります。 これはCVSやSVNで一般的に利用されるレイアウトで、シンプルで簡単に理解できます。</p> <p>セットアップするには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">checkout</span> <span class="o">--</span><span class="n">lightweight</span> <span class="n">URL</span> <span class="n">project</span> <span class="n">cd</span> <span class="n">project</span> </pre></div> </div> <p>作業するには:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> </pre></div> </div> <p>各コミットが暗黙的に変更を同じブランチを利用している他の人に公開していることに注意してください。ただし、コミットが成功するには作業ツリーがリモートのブランチの最新の状態になっている必要があります。最新のコードを取得してマージするには、:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">update</span> </pre></div> </div> </div> <div class="section" id="id246"> <h4>スタンドアロンツリー<a class="headerlink" href="#id246" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このレイアウトでは、作業ツリーとブランチは一つの場所にあります。 共有リポジトリが上位のディレクトリに無い限り、リポジトリも同じ場所に格納されます。これはBazaarのデフォルトレイアウトで、小規模から中規模の大きさのプロジェクトに適しています。</p> <p>セットアップ:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">URL</span> <span class="n">project</span> <span class="n">cd</span> <span class="n">project</span> </pre></div> </div> <p>作業:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> </pre></div> </div> <p>変更を中央の場所に公開する:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">push</span> <span class="p">[</span><span class="n">URL</span><span class="p">]</span> </pre></div> </div> <p>pushするURLは最初の一回だけ要求されます。</p> <p>もし中央の場所が、pushするまでの間に他のユーザーからの変更を受け取っていた場合、pushする前にそれらの変更をローカルブランチにmergeする必要があります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">merge</span> <span class="p">(</span><span class="n">resolve</span> <span class="n">conflicts</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> </pre></div> </div> <p>代替手段として、チェックアウトを使うこともできます。ブランチと同じようにチェックアウトも履歴全体をローカルにコピーしますが、ローカルブランチがリモートの場所に束縛されているので、両方のブランチに一度にコミットされます。</p> <p>注意: チェックアウトはローカルコミット+pushに比べてスマートです。 チェックアウトはまずリモートにコミットして、それが成功したときにだけローカルにもコミットします。</p> </div> <div class="section" id="feature-branches"> <span id="id247"></span><h4>機能ブランチ<a class="headerlink" href="#feature-branches" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このレイアウトでは、いくつかのブランチとツリーがあって、一般的にリポジトリを共有します。 一つのブランチは “trunk” のミラーを保存していて、それ以外の作業単位(例:バグ修正や 機能追加)にはそれぞれの “機能ブランチ” を作ります。 このレイアウトはほとんどのプロジェクト、特に中規模のものにとって理想的です。</p> <p>セットアップ:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="n">project</span> <span class="n">cd</span> <span class="n">project</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">URL</span> <span class="n">trunk</span> </pre></div> </div> <p>機能ブランチを開始する:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">trunk</span> <span class="n">featureX</span> <span class="n">cd</span> <span class="n">featureX</span> </pre></div> </div> <p>作業する:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> <span class="p">(</span><span class="n">make</span> <span class="n">changes</span><span class="p">)</span> <span class="n">bzr</span> <span class="n">commit</span> </pre></div> </div> <p>変更をメーリングリストに公開してレビュー&承認してもらう:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">send</span> </pre></div> </div> <p>変更を公開ブランチで公開する(たとえばLaunchpad上でmerge要求を出すために):</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">push</span> <span class="p">[</span><span class="n">URL</span><span class="p">]</span> </pre></div> </div> <p>変化形として、trunkをチェックアウトとして作ることもできます。 もしtrunkへのコミット権限を持っているのであれば、trunkへマージしてコミットするとその変更は暗黙的に公開されます。 他には、trunkのURLが読み込み専用だった場合(例: HTTP アドレス)、チェックアウトを利用することはローカルのtrunkミラーに間違えて変更を登録してしまうことを防止します。これはプロジェクトがPQMなどのゲートキーパー型のワークフローを利用していたときに有用です。</p> </div> <div class="section" id="sandbox"> <span id="local-sandbox"></span><h4>ローカルのsandbox<a class="headerlink" href="#sandbox" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>このレイアウトは機能ブランチのレイアウトとほぼ同じですが、機能ブランチがそれぞれ作業ツリーを持つ代わりに一つの作業ツリーを共用する点が違います。 これはgitのデフォルトレイアウトに似ていて、大きなツリー(10000ファイル以上とか)を持つプロジェクトや、ビルドによる加工物(.oや.classファイルといった)を大量に作るプロジェクトに適しています。</p> <p>セットアップ:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">init</span><span class="o">-</span><span class="n">repo</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">trees</span> <span class="n">project</span> <span class="n">cd</span> <span class="n">project</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">URL</span> <span class="n">trunk</span> <span class="n">bzr</span> <span class="n">checkout</span> <span class="o">--</span><span class="n">lightweight</span> <span class="n">trunk</span> <span class="n">sandbox</span> <span class="n">cd</span> <span class="n">sandbox</span> </pre></div> </div> <p>これでsandboxで作業を開始できますが、sandboxがtrunkを参照したままコミットしてしまうと、(trunkがcheckoutで無い限り)trunkが元のtrunkのミラーではなくなってしまいます。 なので、まず機能branchを作ってsandboxをそちらに紐づけましょう:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="o">../</span><span class="n">trunk</span> <span class="o">../</span><span class="n">featureX</span> <span class="n">bzr</span> <span class="n">switch</span> <span class="o">../</span><span class="n">featureX</span> </pre></div> </div> <p>この後の、変更を行ったりその変更を公開して適用してもらうまでのプロセスは機能ブランチレイアウトの時と同じです。</p> </div> <div class="section" id="id248"> <h4>進んだレイアウト<a class="headerlink" href="#id248" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>お望みとあれば、あなたのお好みの構成に合わせてレイアウトを決めることができます。 例やアイデアについては <a class="reference external" href="shared_repository_layouts.html">共有リポジトリのレイアウト</a> を参照してください。</p> </div> </div> <div class="section" id="id250"> <h3><a class="toc-backref" href="#id338">共用レポジトリのレイアウト</a><a class="headerlink" href="#id250" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>Bazaarは共用ブランチ内部のブランチのレイアウトを柔軟に決められるように設計されました。 この柔軟性によってユーザーはBazaarを自分のワークフローに合わせることができますが、”よい”レイアウトとは何かということを疑問に持つようになります。 ここでは代わりになるものをいくつか説明しそれぞれの利点を検討します。</p> <p>言及すべき重要な点はよいレイアウトは”一般的な”ユーザーが理解できるように ブランチの内容を何らかの形でハイライトします。 SVNにおいて これは “<code class="docutils literal"><span class="pre">trunk/</span></code>” ブランチであると考えられ、 大抵のレイアウトではこの命名規約が守られています。 これを “<code class="docutils literal"><span class="pre">mainline</span></code>” もしくは “<code class="docutils literal"><span class="pre">dev</span></code>” と呼ぶ人もいれば、 CVSから来た人々はしばし “<code class="docutils literal"><span class="pre">HEAD</span></code>” と言及します。</p> <div class="section" id="svn-trunk-branches"> <h4>“SVN形式” (<code class="docutils literal"><span class="pre">trunk/</span></code>, <code class="docutils literal"><span class="pre">branches/</span></code>)<a class="headerlink" href="#svn-trunk-branches" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>SVNからやってきた人々は次のような”標準的な”プロジェクトのレイアウトに慣れています:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">repository</span><span class="o">/</span> <span class="c1"># リポジトリ全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># 開発のメインライン</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">foo</span><span class="o">/</span> <span class="c1"># 開発中のfoo機能用ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">+-</span> <span class="n">tags</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">+-</span> <span class="n">release</span><span class="o">-</span><span class="n">X</span> <span class="c1"># 特定のリリースバージョンをマークするために専用ブランチ</span> <span class="o">...</span> </pre></div> </div> <p>Bazaarでは、これは完全に適切なレイアウトです。 SVNからやって来た人が慣れ親しめることが利点で開発の焦点を当てる場所が明確になります。</p> <p>同じリポジトリで複数のプロジェクトを持つとき、SVNのレイアウトは何を行うのか少し不透明です。</p> <div class="section" id="project-trunk"> <h5><code class="docutils literal"><span class="pre">project/trunk</span></code><a class="headerlink" href="#project-trunk" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>SVN用の望ましい方法はプロジェクトごとにレイアウト用のトップレベルのディレクトリを用意することです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">repository</span><span class="o">/</span> <span class="c1"># リポジトリ全体</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># project1の開発のメインライン</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">foo</span><span class="o">/</span> <span class="c1"># project1のfoo機能の開発用ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project2</span><span class="o">/</span> <span class="c1"># project2用のコンテナ</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># project2用のメインライン</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># project2のブランチ用のコンテナ</span> </pre></div> </div> <p>これはBazaarでも機能します。 しかしながら、Bazaarでリポジトリを作るのは簡単で( <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">init-repo</span></code> )、 それらの主要な恩恵を受けられるのは複数のブランチが共通の祖先を共有するときです。</p> <p>ですのでBazaarに対して望ましい方法は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project1</span><span class="o">/</span> <span class="c1"># project1用のリポジトリ</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># project1の開発のメインライン</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">+-</span> <span class="n">foo</span><span class="o">/</span> <span class="c1"># project1のfoo機能の開発用ブランチ</span> <span class="o">...</span> <span class="n">project2</span><span class="o">/</span> <span class="c1"># project2用のリポジトリ</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># project2用のメインライン</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># project2のブランチ用のコンテナ</span> </pre></div> </div> </div> <div class="section" id="trunk-project"> <h5><code class="docutils literal"><span class="pre">trunk/project</span></code><a class="headerlink" href="#trunk-project" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>SVNで次のようなレイアウトを利用するプロジェクトもたまにあります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">repository</span><span class="o">/</span> <span class="c1"># リポジトリ全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project1</span> <span class="c1"># project1用のメインライン</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project2</span> <span class="c1"># project2用のメインライン</span> <span class="o">|</span> <span class="o">...</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># コンテナ</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">/</span> <span class="c1"># コンテナ (?)</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">foo</span> <span class="c1"># project1の'foo'ブランチ</span> <span class="o">+-</span> <span class="n">project2</span><span class="o">/</span> <span class="o">+-</span> <span class="n">bar</span> <span class="c1"># project2の'bar'ブランチ</span> </pre></div> </div> <p>次のレイアウトはちょっと変形させたものです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">repository</span><span class="o">/</span> <span class="c1"># リポジトリ全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project1</span> <span class="c1"># project1用のメインライン</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project2</span> <span class="c1"># project2用のメインライン</span> <span class="o">|</span> <span class="o">...</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">branches</span><span class="o">/</span> <span class="c1"># コンテナ</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">-</span><span class="n">foo</span><span class="o">/</span> <span class="c1"># project1の'foo'ブランチ</span> <span class="o">+-</span> <span class="n">project2</span><span class="o">-</span><span class="n">bar</span><span class="o">/</span> <span class="c1"># project2の'bar'ブランチ</span> </pre></div> </div> <p>“<code class="docutils literal"><span class="pre">trunk/</span></code>” 全体をチェックアウトすることで、すべてのプロジェクト用のメインラインを入手できるようにすることが、このレイアウトが採用されている理由だと筆者は考えます。</p> <p>このレイアウトはBazaarでも使えますが、一般的にお勧めできません。</p> <blockquote> <div><ol class="arabic simple"> <li>一回の <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">branch/checkout/get</span></code> は一つのブランチを作ります。 単独のコマンドですべてのメインラインを入手する利点が得られません。 <a class="footnote-reference" href="#id252" id="id251">[1]</a></li> <li><code class="docutils literal"><span class="pre">repository/trunk/foo</span></code> が <code class="docutils literal"><span class="pre">foo</span></code> プロジェクトの <code class="docutils literal"><span class="pre">trunk</span></code> か <code class="docutils literal"><span class="pre">trunk</span></code> ブランチの単なる <code class="docutils literal"><span class="pre">foo</span></code> ディレクトリなのか明らかではありません。 この混乱の一部はSVNによるものです。 SVNはプロジェクトのブランチ用に使う1つのプロジェクトのファイルに対して同じ”名前空間”を使うからです。 Bazaarにおいて、プロジェクトを構成するファイルの明確な定義、もしくはブランチの位置の対立軸があります (ブランチごとに唯一の <code class="docutils literal"><span class="pre">.bzr/</span></code> ディレクトリか、チェックアウトの中にたくさんの <code class="docutils literal"><span class="pre">.svn/</span></code> ディレクトリかという対立軸です)</li> </ol> </div></blockquote> <table class="docutils footnote" frame="void" id="id252" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id251">[1]</a></td><td>注: <a class="reference external" href="http://wiki.bazaar.canonical.com/NestedTrees">NestedTreeSupport</a> は”メタプロジェクト”を作成する方法を提供します。 メタプロジェクトはリポジトリのレイアウトにかかわらず複数のプロジェクトを集約します。 1つのプロジェクトを <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">checkout</span></code> すれば、必要なサブプロジェクトがすべて手に入ります。</td></tr> </tbody> </table> </div> </div> <div class="section" id="project-branch-sub-branch"> <h4>入れ子形式 (<code class="docutils literal"><span class="pre">project/branch/sub-branch/</span></code>)<a class="headerlink" href="#project-branch-sub-branch" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>SVNではできない、Bazaarによる別のスタイルは、ブランチ同士を入れ子にすることです。 Bazaarは作業ツリーなしのリポジトリ作成(<code class="docutils literal"><span class="pre">--no-trees</span></code>)をサポート(と推奨)しているのでこのスタイルが可能になります。 作業ファイルはブランチの設置場所に混ぜられていないので、 好きな名前空間にブランチを設置できます。</p> <p>1つの可能性は次のとおりです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project</span><span class="o">/</span> <span class="c1"># リポジトリ全体、*と* プロジェクトのメインラインのブランチ</span> <span class="o">+</span> <span class="n">joe</span><span class="o">/</span> <span class="c1"># 開発者Joeの開発のプライマリブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature1</span><span class="o">/</span> <span class="c1"># 開発者Joeのfeature1開発ブランチ</span> <span class="o">|</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">broken</span><span class="o">/</span> <span class="c1"># feature1を開発するためのステージングブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature2</span><span class="o">/</span> <span class="c1"># Joeのfeature2開発ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">+</span> <span class="n">barry</span><span class="o">/</span> <span class="c1"># Barryの開発ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">+</span> <span class="n">releases</span><span class="o">/</span> <span class="o">+-</span> <span class="mf">1.0</span><span class="o">/</span> <span class="o">+-</span> <span class="mf">1.1</span><span class="o">.</span><span class="mi">1</span><span class="o">/</span> </pre></div> </div> <p>このレイアウトのアイディアはブランチ用の階層的なレイアウトを作ることです。 変更はたいていより上位の名前空間のブランチへと流れていきます。 また、このレイアウトではユーザーに独自の作業をするための場所も提供します。 このレイアウトの素晴らしい点の1つは、グローバルな <code class="docutils literal"><span class="pre">branches</span></code> 名前空間を散らかさずにミニブランチを置けるので、ブランチ作成が”手軽”になることです。</p> <p>このレイアウトのもう一つの利点は、ブランチの名前の中で詳細な内容を指定する際に繰り返しが減ることです。</p> <p>例です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">repository</span><span class="o">/</span><span class="n">project</span><span class="o">/</span><span class="n">branches</span><span class="o">/</span><span class="n">joe</span><span class="o">-</span><span class="n">feature</span><span class="o">-</span><span class="n">foo</span><span class="o">-</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">10</span><span class="o">/</span> </pre></div> </div> <p>上と下を比較します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">project</span><span class="o">/</span><span class="n">joe</span><span class="o">/</span><span class="n">foo</span><span class="o">/</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">10</span> </pre></div> </div> <p>また、 <code class="docutils literal"><span class="pre">repository/project/branches/</span></code> ディレクトリの中のリストがあれが何かわかるかもしれません:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">barry</span><span class="o">-</span><span class="n">feature</span><span class="o">-</span><span class="n">bar</span><span class="o">/</span> <span class="n">barry</span><span class="o">-</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">10</span><span class="o">/</span> <span class="n">barry</span><span class="o">-</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">12</span><span class="o">/</span> <span class="n">joe</span><span class="o">-</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">10</span><span class="o">/</span> <span class="n">joe</span><span class="o">-</span><span class="n">bugfix</span><span class="o">-</span><span class="mi">13</span><span class="o">/</span> <span class="n">joe</span><span class="o">-</span><span class="n">frizban</span><span class="o">/</span> </pre></div> </div> <p>Versus こういったブランチが開発者のディレクトリに分散している。 ブランチの数が少なければ、 <code class="docutils literal"><span class="pre">branches/</span></code> は一見するだけですべてのブランチが見えるという素晴らしい利点があります。 ブランチの数が多ければ、 <code class="docutils literal"><span class="pre">branches/</span></code> はすべてのブランチが見えてしまうというはっきりした欠点があります。 (調べるブランチが100あるとき、興味のあるブランチを見つけるのが難しくなります)。</p> <p>入れ子ブランチはたくさんのブランチよりもスケーラブルのようです。 しかしながら、それぞれの個別のブランチは見つけにくいです。 (たとえば”Joeはfoo機能ブランチでバグ修正10に取り組んでいるのか、それともbarの機能ブランチを取り組んでいるのか?”)</p> <p>他の小さな利点は次のようなものです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">project</span><span class="o">/</span><span class="n">release</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">1</span> <span class="n">もしくは</span> <span class="n">bzr</span> <span class="n">branch</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">host</span><span class="o">/</span><span class="n">project</span><span class="o">/</span><span class="n">release</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">1</span><span class="o">/</span><span class="mi">2</span> </pre></div> </div> <p>1.1.1と1.1.2のリリースを示します。 これはリリースする数と一度に見られる能力よりも分割する方がゲインが多いかによります。</p> </div> <div class="section" id="dev-merged-experimental"> <h4>ステータスによる種類分け (<code class="docutils literal"><span class="pre">dev/</span></code>, <code class="docutils literal"><span class="pre">merged/</span></code>, <code class="docutils literal"><span class="pre">experimental/</span></code>)<a class="headerlink" href="#dev-merged-experimental" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>ブランチをbreak upする他の方法はこれらを現在のステータス順でソートすることです。 そうするとレイアウトは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project</span><span class="o">/</span> <span class="c1"># レイアウト全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># 開発に焦点を当てたブランチ</span> <span class="o">+-</span> <span class="n">dev</span><span class="o">/</span> <span class="c1"># 進行中の作業用コンテナディレクトリ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">joe</span><span class="o">-</span><span class="n">feature1</span> <span class="c1"># Joeの現在のfeature-1ブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">barry</span><span class="o">-</span><span class="n">bugfix10</span> <span class="c1"># bugfix 10に対するBarryの作業内容</span> <span class="o">|</span> <span class="o">...</span> <span class="o">+-</span> <span class="n">merged</span><span class="o">/</span> <span class="c1"># これらのブランチがマージされたことを示すコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">bugfix</span><span class="o">-</span><span class="mi">12</span> <span class="c1"># すでにマージされたバグ修正</span> <span class="o">+-</span> <span class="n">abandonded</span><span class="o">/</span> <span class="c1"># 'dead-end'と見なされているブランチ</span> </pre></div> </div> <p>これはたくさんの利点と欠点があります。 あまり多くない数のアクティブに開発されているブランチを見ることができるか、今までに作られた全てのブランチが見えるかという違いがあります。 古いブランチは削除しない限り失われませんが、別ディレクトリへと整理されるのでたいていの場合お目当てのブランチを見つけやすくなります。 (反対に、古いブランチは見つけにくくなります)。</p> <p>このレイアウトで最大の欠点、ブランチが移動することです。 誰かが <code class="docutils literal"><span class="pre">project/dev/new-feature</span></code> ブランチをフォローしているとき、 そのブランチが <code class="docutils literal"><span class="pre">trunk/</span></code> にマージされると <code class="docutils literal"><span class="pre">project/merged/new-feature</span></code> に移動するので <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">pull</span></code> が突然機能しなくなります。 この回避策はいくつかあります。 1つは利用者を導くために古いブランチから新しいブランチにリクエストするHTTPリダイレクトを使うことです。 <code class="docutils literal"><span class="pre">bzr</span></code> >= 0.15 ではユーザーに <code class="docutils literal"><span class="pre">http://old/path</span> <span class="pre">が</span> <span class="pre">http://new/path</span></code> にリダイレクトされることを教えてくれます。 しかしながら、HTTP以外の方法(SFTP、ローカルファイルシステム、など)を通してブランチにアクセスしている場合は役に立ちません。</p> <p>一時的なリダイレクト用にシンボリックリンクを利用することも可能です (シンボリックリンクがリポジトリ内にある限りトラブルはほんのわずかしかありません)。 しかし、シンボリックリンクを結局削除したくなったり、散乱の削減の恩恵を得られません。 シンボリックリンクの代わりの別の可能性は <code class="docutils literal"><span class="pre">BranchReference</span></code> を使うことです。 <code class="docutils literal"><span class="pre">bzr</span></code> コマンドを通してこれらを作るのは現時点では難しいですが、便利だと思う人がいれば変わるかもしれません。 これは実際には <a class="reference external" href="https://launchpad.net">Launchpad</a> が <code class="docutils literal"><span class="pre">bzr</span> <span class="pre">checkout</span> <span class="pre">https://launchpad.net/bzr</span></code> をできるようにしている方法です。 <code class="docutils literal"><span class="pre">BranchReference</span></code> は機能的にはシンボリックリンクですが、他のURLの参照ができます。 相対パスによる参照ができるように拡張されれば、HTTP、SFTP、ローカルパスを通しても動作するでしょう。</p> </div> <div class="section" id="id253"> <h4>日付/リリース/その他で種類分け (<code class="docutils literal"><span class="pre">2006-06/</span></code>, <code class="docutils literal"><span class="pre">2006-07/</span></code>, <code class="docutils literal"><span class="pre">0.8/</span></code>, <code class="docutils literal"><span class="pre">0.9</span></code>)<a class="headerlink" href="#id253" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スケーラビリティを可能にする別の方法は”現在の”ブランチのブラウジングを許可することです。 基本的に、活発に開発されるブランチは新しく作られ古いブランチはマージもしくは廃棄されることを前提とします。</p> <p>基本的に日付レイアウトは次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project</span><span class="o">/</span> <span class="c1"># projectリポジトリ全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># 一般的なメインライン</span> <span class="o">+-</span> <span class="mi">2006</span><span class="o">-</span><span class="mi">06</span><span class="o">/</span> <span class="c1"># この月に作成されたブランチ用のディレクトリのコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature1</span><span class="o">/</span> <span class="c1"># "project"の"feature1"用ブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature2</span><span class="o">/</span> <span class="c1"># "project"の"feature2"用ブランチ</span> <span class="o">+-</span> <span class="mi">2005</span><span class="o">-</span><span class="mi">05</span><span class="o">/</span> <span class="c1"># 異なる月に作成されるブランチ用のコンテナディレクトリ</span> <span class="o">+-</span> <span class="n">feature3</span><span class="o">/</span> <span class="o">...</span> </pre></div> </div> <p>これは “私の新しいブランチをどこに設置すればいいの?” という質問に素早く答えてくれます。 機能が長期間開発されるのであれば、ブランチを最新の日付にコピーして、そこで作業を続けることも道理にかなっています。 最新の日付と、そこからのさかのぼっていくことで活発なブランチを見つけることができます。 (小さな欠点は 大抵のディレクトリリストは古い順にソートされているので、多くの場合新しいブランチにたどり着くために余計なスクロールが必要になることです)。 古いブランチを新しい位置にコピーしたくない場合、ブランチを探すのが面倒になるのも欠点です。</p> <p>別の候補は、リリースをターゲットにしたものです:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project</span><span class="o">/</span> <span class="c1"># リポジトリ概要</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># メインラインの開発ブランチ</span> <span class="o">+-</span> <span class="n">releases</span><span class="o">/</span> <span class="c1"># リリースブランチ用のコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="mf">0.8</span><span class="o">/</span> <span class="c1"># リリース0.8のブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="mf">0.9</span><span class="o">/</span> <span class="c1"># リリース0.9のブランチ</span> <span class="o">+-</span> <span class="mf">0.8</span><span class="o">/</span> <span class="c1"># リリース0.8をターゲットとするブランチ用のコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature1</span><span class="o">/</span> <span class="c1"># 0.8にマージする予定の"feature1"用のブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">feature2</span><span class="o">/</span> <span class="c1"># "リリース0.8をターゲットとしたfeature2"用のブランチ</span> <span class="o">+-</span> <span class="mf">0.9</span><span class="o">/</span> <span class="o">+-</span> <span class="n">feature3</span><span class="o">/</span> <span class="c1"># リリース0.9をターゲットとした"feature3"用のブランチ</span> </pre></div> </div> <p>その派生として、ブランチが <code class="docutils literal"><span class="pre">0.9</span></code> ディレクトリに入っていることが 0.9に <em>向けた</em> ブランチであることではなく 0.9 <em>から</em> 派生したブランチであることを意味するようにすることや、 <code class="docutils literal"><span class="pre">0.8/release</span></code> が0.8ブランチの公式リリースであることを意味するようにすることが考えられます。</p> <p>一般的なアイディアはリリースをターゲットにすることで、何のブランチがマージされるのを待っているのか調べることができます。 このレイアウトはブランチの状態(開発中なのか、終了してレビューを待っているのか)に関する情報を提供しません。 これは履歴を隠す効果もあり、日付ベースの種類分けと同じような利点と欠点を持っています。</p> </div> <div class="section" id="project-joe-foo-project-barry-bar"> <h4>シンプルな開発者名 (<code class="docutils literal"><span class="pre">project/joe/foo</span></code>, <code class="docutils literal"><span class="pre">project/barry/bar</span></code>)<a class="headerlink" href="#project-joe-foo-project-barry-bar" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>別の利用できるレイアウトは、開発者ごとにディレクトリを割り当てて、その下にブランチのためのサブディレクトリを作ることです。次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">project</span><span class="o">/</span> <span class="c1"># リポジトリ全体</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># メインラインのブランチ</span> <span class="o">+-</span> <span class="n">joe</span><span class="o">/</span> <span class="c1"># Joeのブランチ用のコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">foo</span><span class="o">/</span> <span class="c1"># Joeの"project"の"foo"ブランチ</span> <span class="o">+-</span> <span class="n">barry</span><span class="o">/</span> <span class="o">+-</span> <span class="n">bar</span><span class="o">/</span> <span class="c1"># Barryの"project"の"bar"ブランチ</span> </pre></div> </div> <p>このアイデアでは、branchは入れ子になっておらず、branchは開発者によってのみグループ化されます。</p> <p><a class="reference external" href="https://launchpad.net">Launchpad</a> で使われている派生系はこのようになっています:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">repository</span><span class="o">/</span> <span class="o">+-</span> <span class="n">joe</span><span class="o">/</span> <span class="c1"># Joeのブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">/</span> <span class="c1"># Joeのブランチである"project1"用のコンテナ</span> <span class="o">|</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">foo</span><span class="o">/</span> <span class="c1"># Joeの"project1"の"foo"ブランチ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project2</span><span class="o">/</span> <span class="c1"># Joeの"project2"ブランチ用のコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">bar</span><span class="o">/</span> <span class="c1"># Joeの"project2"の"bar"ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">barry</span><span class="o">/</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">/</span> <span class="c1"># Barryの"project1"のブランチ用のコンテナ</span> <span class="o">|</span> <span class="o">+-</span> <span class="n">bug</span><span class="o">-</span><span class="mi">10</span><span class="o">/</span> <span class="c1"># Barryの"project1"の"bug-10"ブランチ</span> <span class="o">|</span> <span class="o">...</span> <span class="o">+-</span> <span class="n">group</span><span class="o">/</span> <span class="o">+-</span> <span class="n">project1</span><span class="o">/</span> <span class="o">+-</span> <span class="n">trunk</span><span class="o">/</span> <span class="c1"># "project1"に焦点をあてたメイン開発</span> </pre></div> </div> <p>このレイアウトではそれぞれの開発者が取り組んでいるものを簡単に見ることができます。 焦点のブランチは”group” ディレクトリに保存されます。 これによって”グループ”が取り組んでいるブランチを見分けられます。</p> <p>これによって異なる人々の作業内容をそれぞれ分離できますが、”プロジェクトX用のすべてのブランチ”を見つけるのが難しくなります。 <a class="reference external" href="https://launchpad.net">Launchpad</a> はデータベースバックエンドを伴う素晴らしいウェブインターフェイスを提供していて、”view”をこのレイアウトのトップに追加することでこの欠点を補っています。 これはそれぞれの個人が “<code class="docutils literal"><span class="pre">~/public_html</span></code>” ディレクトリを持ち、そこで独自のウェブページを公開する個人用ホームページのモデルに近いです。 一般的に、集中型のプロジェクト用に共用リポジトリを作成するとき、個人単位で分割してからプロジェクト単位に分割することを望まないでしょう。 通常はプロジェクト単位で分割してから個人単位で分割するとよいでしょう。</p> </div> <div class="section" id="id254"> <h4>要約<a class="headerlink" href="#id254" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>最後に、誰にとってもうまくいく唯一の命名規則はありません。 開発者の人数、新しいブランチが作成される頻度、ブランチのライフサイクルなどによって異なります。 自身に問いかける質問は次のとおりです:</p> <blockquote> <div><ol class="arabic simple"> <li>寿命の長い少数のブランチを作るか、もしくはたくさんの”ミニ”機能ブランチを作るか (加えて: ミニ機能ブランチをたくさん <em>作りたい</em> が現在のVCSでは苦痛なのでできないのではないか?)</li> <li>1人で開発しているのか、大きなチームか?</li> <li>チームであれば、一般的に全員が同時に同じブランチに取り組むことを計画しているか? もしくは人々が追跡することを想定した”安定”ブランチを持つか。</li> </ol> </div></blockquote> </div> </div> <div class="section" id="e"> <h3><a class="toc-backref" href="#id339">Eメールを設定する</a><a class="headerlink" href="#e" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="bazaare"> <h4>なぜBazaarでEメールアドレスをセットアップするのか?<a class="headerlink" href="#bazaare" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>リビジョンが作成されたとき誰がどのリビジョンをコミットしたのかわかるように Bazaarは指定されたEメールアドレスをリビジョンに保存します。 Eメールアドレスは検証されないので、それゆえ 偽造できるので、プロジェクトに関わる人々を信用しなければなりません。</p> <p>加えて、リビジョンのEメールアドレスはクレジットかつ/もしくは注釈に関してリビジョンの筆者とコンタクトをとる別の方法を提供します。</p> </div> <div class="section" id="id255"> <h4>Eメールアドレスをセットアップする方法<a class="headerlink" href="#id255" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Eメールアドレスが設定されていない場合、Bazaarはユーザー名とホスト名に基づいて推測を試みます。 これは望む状況ではないかもしれないので、Bazaarに使うメールを伝える方法は3つ存在します:</p> <p>いくつかの設定ファイルの1つにEメールを設定できます。 他の設定値のように、 <code class="docutils literal"><span class="pre">bazaar.conf</span></code> で一般的な設定として設定できます。 特定のブランチ、もしくは複数のブランチの一式用に値を上書きしたい場合、 <code class="docutils literal"><span class="pre">locations.conf</span></code> を利用できます。 <code class="docutils literal"><span class="pre">.bzr/branch/branch.conf</span></code> も動作しますが、 他の人であってもそのブランチへのすべてのコミットで同じEメールアドレスが使われます。</p> <p>優先順位は</p> <blockquote> <div><ol class="arabic simple"> <li><code class="docutils literal"><span class="pre">BZR_EMAIL</span></code> 環境変数が設定されている場合</li> <li>Eメールが現在のブランチの <code class="docutils literal"><span class="pre">locations.conf</span></code> ファイルに対して設定されている場合。</li> <li>Eメールが現在のブランチの <code class="docutils literal"><span class="pre">.bzr/branch/branch.conf</span></code> ファイルに設定されている場合。</li> <li>Eメールがデフォルトの <code class="docutils literal"><span class="pre">bazaar.conf</span></code> 設定ファイルで設定されている場合。</li> <li><cite>EMAIL</cite> 環境変数が設定されている場合</li> <li>Bazaarはユーザー名とホスト名から推測しようとします。</li> </ol> </div></blockquote> <p>Bazaarが現在のEメールと考えるものを確認するには、 <code class="docutils literal"><span class="pre">whoami</span></code> (“who am i?”) コマンドを使います:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">whoami</span> <span class="n">Joe</span> <span class="n">Cool</span> <span class="o"><</span><span class="n">joe</span><span class="nd">@example</span><span class="o">.</span><span class="n">com</span><span class="o">></span> </pre></div> </div> </div> <div class="section" id="whoami-e"> <h4>‘whoami’コマンドでEメールを設定する<a class="headerlink" href="#whoami-e" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Eメールをグローバルに設定するにはwhoamiコマンドを使用します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">whoami</span> <span class="s2">"Joe Cool <joe@example.com>"</span> </pre></div> </div> <p>もしくは現在のブランチのみの場合:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">%</span> <span class="n">bzr</span> <span class="n">whoami</span> <span class="o">--</span><span class="n">branch</span> <span class="s2">"Joe Cool <joe@example.com>"</span> </pre></div> </div> <p>これらのコマンドによってグローバルな <code class="docutils literal"><span class="pre">bazaar.conf</span></code> もしくはブランチの <code class="docutils literal"><span class="pre">branch.conf</span></code> ファイルがそれぞれ修正されます。</p> </div> <div class="section" id="id256"> <h4>デフォルトの設定ファイルでEメールを設定する<a class="headerlink" href="#id256" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>デフォルトのiniファイルを使うには、 <code class="docutils literal"><span class="pre">bazaar.conf</span></code> ファイル (Unix では <code class="docutils literal"><span class="pre">~/.bazaar/</span></code> 、Windowsでは <code class="docutils literal"><span class="pre">%APPDATA%\bazaar\2.0\</span></code> )を作成し編集して 下記で示すようにEメールアドレスを設定します。 DEFAULTは大文字と個別を区別して、大文字でなければならないことに注意をお願いします。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">DEFAULT</span><span class="p">]</span> <span class="n">email</span><span class="o">=</span><span class="n">Your</span> <span class="n">Name</span> <span class="o"><</span><span class="n">name</span><span class="nd">@isp</span><span class="o">.</span><span class="n">com</span><span class="o">></span> </pre></div> </div> <p>iniファイルのフォーマットの詳細情報に関しては、Bazaarユーザーリファレンスの <a class="reference external" href="../user-reference/index.html#configuration-settings">構成設定</a> を参照してください。</p> </div> <div class="section" id="id258"> <h4>ブランチ単位でEメールを設定する<a class="headerlink" href="#id258" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>2番目のアプローチは <code class="docutils literal"><span class="pre">locations.conf</span></code> 設定ファイルを使用してブランチごとにEメールを設定する方法です:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o">/</span><span class="n">some</span><span class="o">/</span><span class="n">branch</span><span class="o">/</span><span class="n">location</span><span class="p">]</span> <span class="n">email</span><span class="o">=</span><span class="n">Your</span> <span class="n">Name</span> <span class="o"><</span><span class="n">name</span><span class="nd">@other</span><span class="o">-</span><span class="n">isp</span><span class="o">.</span><span class="n">com</span><span class="o">></span> </pre></div> </div> <p>これによってブランチのEメールアドレスは <code class="docutils literal"><span class="pre">/some/branch/location</span></code> に設定され、 上記の <code class="docutils literal"><span class="pre">bazaar.conf</span></code> で指定されたデフォルトの値を上書きします。</p> </div> <div class="section" id="id259"> <h4>環境変数を通してEメールを設定する<a class="headerlink" href="#id259" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>Bazaarが利用する最後の方法は <code class="docutils literal"><span class="pre">BZR_EMAIL</span></code> と <code class="docutils literal"><span class="pre">EMAIL</span></code> 環境変数 に対するチェックです。 一般的に、スクリプトのコンテキストでEメールを上書きするためにこの方法を利用できます。 一般的なデフォルトの値に設定したい場合、上記のiniの方法を参照して下さるようお願いします。</p> </div> <div class="section" id="id260"> <h4>スパムに関する懸念事項<a class="headerlink" href="#id260" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>スパムの標的にされないようにEメールアドレスを共有したくない人達がいます。 公開された場所で自分でブランチもしくはチェンジセットを公開しない限り、BazaarはけっしてEメールアドレスを露出しません。 他の人があなたに作業内容に関して連絡できるように実際のアドレスを使うことを <em>強く</em> お勧めしますが、必須ではありません。 メールアドレスは難読にしたり、宛先がわからず戻ってくるようにする、もしくは <cite>spamgourmet.cm</cite> のような アンチスパムサービスの検査をうけさせたりします。</p> </div> </div> <div class="section" id="apache-bazaar"> <h3><a class="toc-backref" href="#id340">Apache を使って Bazaar サーバーをたてる</a><a class="headerlink" href="#apache-bazaar" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>このドキュメントでは、 Apache 2.0 と FastCGI, mod_python, mod_wsgi の どれかを利用して Bazaar の HTTP スマートサーバーをセットアップする方法を 説明します。</p> <p>スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、 <a class="reference external" href="server.html">スマートサーバーのドキュメント</a> を参照してください。</p> <div class="section" id="id262"> <h4>例<a class="headerlink" href="#id262" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プレーンなHTTPで <cite>/srv/example.com/www/code</cite> を <cite>http://example.com/code/...</cite> として すでに公開しているとします。これはbzrのブランチと <cite>/srv/example.com/www/code/branch-one</cite> と <cite>/srv/example.com/www/code/my-repo/branch-two</cite> のようなディレクトリを含みます。 既存のHTTP形式のアクセス権限に加えてリードオンリーのスマートサーバーのアクセス権限を これらのディレクトリに提供したい場合を考えます。</p> </div> <div class="section" id="apache-2-0"> <h4>Apache 2.0を設定する<a class="headerlink" href="#apache-2-0" title="このヘッドラインへのパーマリンク">¶</a></h4> <div class="section" id="fastcgi"> <h5>FastCGI<a class="headerlink" href="#fastcgi" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">LoadModule</span> <span class="n">fastcgi_module</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">modules</span><span class="o">/</span><span class="n">mod_fastcgi</span><span class="o">.</span><span class="n">so</span> <span class="n">FastCgiIpcDir</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">fastcgi</span> </pre></div> </div> <p>我々の例では、<cite>http://example.com/code</cite> で <cite>/srv/example.com/www/code</cite> をすでに提供しているので 既存のApacheの設定は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">Alias</span> <span class="o">/</span><span class="n">code</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">www</span><span class="o">/</span><span class="n">code</span> <span class="o"><</span><span class="n">Directory</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">www</span><span class="o">/</span><span class="n">code</span><span class="o">></span> <span class="n">Options</span> <span class="n">Indexes</span> <span class="c1"># ...</span> <span class="o"></</span><span class="n">Directory</span><span class="o">></span> </pre></div> </div> <p>.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために 次のように変更する必要があります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>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> </pre></div> </div> <p>この設定はFastCGIを通して <cite>/code</cite> 内部の <cite>/.bzr/smart</cite> で終わるURLに対する Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。</p> <p>詳細な情報は <a class="reference external" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> と <a class="reference external" href="http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html">mod_fastcgi</a> のドキュメントを参照してください。</p> </div> <div class="section" id="mod-python"> <h5>mod_python<a class="headerlink" href="#mod-python" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>最初に、次のようなコードを httpd.conf に追加して mod_python を設定します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">LoadModule</span> <span class="n">python_module</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">modules</span><span class="o">/</span><span class="n">mod_python</span><span class="o">.</span><span class="n">so</span> </pre></div> </div> <p>FastCGI と同じ方法で mod_rewrite を用いて書き換えルールを定義します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi </pre></div> </div> <p>変更は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span>RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py </pre></div> </div> <p>mod_fastcgi のように、スクリプトがどのように扱われるのかも定義します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">Alias</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">scripts</span><span class="o">/</span><span class="n">bzr</span><span class="o">-</span><span class="n">smart</span><span class="o">.</span><span class="n">py</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">scripts</span><span class="o">/</span><span class="n">bzr</span><span class="o">-</span><span class="n">smart</span><span class="o">.</span><span class="n">py</span> <span class="o"><</span><span class="n">Directory</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">scripts</span><span class="o">></span> <span class="o"><</span><span class="n">Files</span> <span class="n">bzr</span><span class="o">-</span><span class="n">smart</span><span class="o">.</span><span class="n">py</span><span class="o">></span> <span class="n">PythonPath</span> <span class="s2">"sys.path+['/srv/example.com/scripts']"</span> <span class="n">AddHandler</span> <span class="n">python</span><span class="o">-</span><span class="n">program</span> <span class="o">.</span><span class="n">py</span> <span class="n">PythonHandler</span> <span class="n">bzr</span><span class="o">-</span><span class="n">smart</span><span class="p">::</span><span class="n">handler</span> <span class="o"></</span><span class="n">Files</span><span class="o">></span> <span class="o"></</span><span class="n">Directory</span><span class="o">></span> </pre></div> </div> <p>この設定は mod_python を通して <cite>/code</cite> 内部の <cite>/.bzr/smart</cite> で終わるURLに対するリクエストを Bazaar のスマートサーバーに渡すように指示します。</p> <p>注: bzrlib が PATH の中に存在しない場合、次の行を変更する必要があります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">PythonPath</span> <span class="s2">"sys.path+['/srv/example.com/scripts']"</span> </pre></div> </div> <p>変更後は次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">PythonPath</span> <span class="s2">"['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"</span> </pre></div> </div> <p>詳細な情報は <a class="reference external" href="http://www.modpython.org/">mod_python</a> のドキュメントを参照してください。</p> </div> <div class="section" id="mod-wsgi"> <h5>mod_wsgi<a class="headerlink" href="#mod-wsgi" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>最初に、 a2enmod wsgi などで mod_wsgi を有効にしておきます。 次に、 <cite>.bzr/smart</cite> で終わる全ての URL に対するリクエストを mod_wsgi 経由 で処理するように設定します。設定例は次のようになります。</p> <div class="highlight-default"><div class="highlight"><pre><span></span>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> </pre></div> </div> <p>この設定では、 Apache は <cite>/code</cite> 以下の <cite>/.bzr/smart</cite> で終わる URL に 対する全てのリクエストを WSGI 経由で Bazaar のスマートサーバーに渡し、 それ以外の全てのリクエストは Apache が直接扱うようにしています。</p> <p>詳細は <a class="reference external" href="http://code.google.com/p/modwsgi/">mod_wsgi</a> のドキュメントを参照してください。</p> </div> </div> <div class="section" id="id265"> <h4>Bazaarを設定する<a class="headerlink" href="#id265" title="このヘッドラインへのパーマリンク">¶</a></h4> <div class="section" id="id266"> <h5>FastCGI<a class="headerlink" href="#id266" title="このヘッドラインへのパーマリンク">¶</a></h5> <p><cite>/srv/example.com/scripts/bzr-smart.fcgi</cite> でスマートサーバーを実行するためにApacheを設定しました。 これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで サーバーをFastCGIのゲートウェイに結びつけます。次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">fcgi</span> <span class="kn">from</span> <span class="nn">bzrlib.transport.http</span> <span class="k">import</span> <span class="n">wsgi</span> <span class="n">smart_server_app</span> <span class="o">=</span> <span class="n">wsgi</span><span class="o">.</span><span class="n">make_app</span><span class="p">(</span> <span class="n">root</span><span class="o">=</span><span class="s1">'/srv/example.com/www/code'</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s1">'/code/'</span><span class="p">,</span> <span class="n">path_var</span><span class="o">=</span><span class="s1">'REQUEST_URI'</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">load_plugins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">enable_logging</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="n">fcgi</span><span class="o">.</span><span class="n">WSGIServer</span><span class="p">(</span><span class="n">smart_server_app</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span> </pre></div> </div> <p> <cite>fcgi</cite> のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。 これは <a class="reference external" href="http://www.saddi.com/software/flup/">flup</a> の一部です。</p> </div> <div class="section" id="id267"> <h5>mod_python<a class="headerlink" href="#id267" title="このヘッドラインへのパーマリンク">¶</a></h5> <p><cite>/srv/example.com/scripts/bzr-smart.py</cite> でスマートサーバーを実行するためにApacheを設定しました。 これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの ゲートウェイに結びつけます。次のようになります:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">modpywsgi</span> <span class="kn">from</span> <span class="nn">bzrlib.transport.http</span> <span class="k">import</span> <span class="n">wsgi</span> <span class="n">smart_server_app</span> <span class="o">=</span> <span class="n">wsgi</span><span class="o">.</span><span class="n">make_app</span><span class="p">(</span> <span class="n">root</span><span class="o">=</span><span class="s1">'/srv/example.com/www/code'</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s1">'/code/'</span><span class="p">,</span> <span class="n">path_var</span><span class="o">=</span><span class="s1">'REQUEST_URI'</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">load_plugins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">enable_logging</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">handler</span><span class="p">(</span><span class="n">request</span><span class="p">):</span> <span class="sd">"""Handle a single request."""</span> <span class="n">wsgi_server</span> <span class="o">=</span> <span class="n">modpywsgi</span><span class="o">.</span><span class="n">WSGIServer</span><span class="p">(</span><span class="n">smart_server_app</span><span class="p">)</span> <span class="k">return</span> <span class="n">wsgi_server</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> </pre></div> </div> <p><cite>modpywsgi</cite> モジュールは <a class="reference external" href="http://ice.usq.edu.au/svn/ice/trunk/apps/ice-server/modpywsgi.py">http://ice.usq.edu.au/svn/ice/trunk/apps/ice-server/modpywsgi.py</a> で見つかります。 これは <a class="reference external" href="http://dev.pocoo.org/projects/pocoo/">pocoo</a> の一部でした。 modpywsgi.py を bzr-smart.py と同じディレクトリ (すなわち/srv/example.com/scripts/)に設置していることを確認してください。</p> </div> <div class="section" id="id268"> <h5>mod_wsgi<a class="headerlink" href="#id268" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>We’ve configured Apache to run the smart server at <cite>/srv/example.com/scripts/bzr.wsgi</cite>. 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:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">bzrlib.transport.http</span> <span class="k">import</span> <span class="n">wsgi</span> <span class="k">def</span> <span class="nf">application</span><span class="p">(</span><span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">):</span> <span class="n">app</span> <span class="o">=</span> <span class="n">wsgi</span><span class="o">.</span><span class="n">make_app</span><span class="p">(</span> <span class="n">root</span><span class="o">=</span><span class="s2">"/srv/example.com/www/code/"</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">"/code"</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">enable_logging</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">return</span> <span class="n">app</span><span class="p">(</span><span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="section" id="id269"> <h4>クライアント<a class="headerlink" href="#id269" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>これで <cite>bzr+http://</cite> 形式のURLやただの <cite>http://</cite> のURLを利用できます:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">bzr</span><span class="o">+</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">code</span><span class="o">/</span><span class="n">my</span><span class="o">-</span><span class="n">branch</span> </pre></div> </div> <p>プレーンなHTTP形式のアクセスも持続します:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span> <span class="n">log</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">code</span><span class="o">/</span><span class="n">my</span><span class="o">-</span><span class="n">branch</span> </pre></div> </div> </div> <div class="section" id="id270"> <h4>高度な設定<a class="headerlink" href="#id270" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、 WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。 唯一の要件は以下のとおりです:</p> <blockquote> <div><ul class="simple"> <li><cite>SmartWSGIApp</cite> をコンストラクトするためには、それが提供する <strong>root transport</strong> を指定する必要があります。</li> <li>それぞれのリクエストの <cite>environ</cite> dict は <strong>‘bzrlib.relpath’</strong> 変数の設定を持たなければなりません。</li> </ul> </div></blockquote> <p>この例で使われている <cite>make_app</cite> ヘルパーは それに渡される <cite>root</cite> パスに基づいたトランスポートを伴う <cite>SmartWSGIApp</cite> をコンストラクトし、引数 <cite>prefix</cite> と`path_var` に基づくそれぞれのリクエストに対する <cite>bzrlib.relpath</cite> を算出します。 上記の例において、これは (Apacheによって設定される)’REQUEST_URI’ を取り、接頭辞の ‘/code/’ と接尾辞の ‘/.bzr/smart’ をはぎ取り、それを ‘bzrlib.relpath’ として設定するので、 ‘/code/foo/bar/.bzr/smart’ に対するリクエストは ‘foo/bzr’ の ‘bzrlib.relpath’ になります。</p> <p><cite>SmartWSGIApp</cite> を直接コンストラクトすることで、ローカルではないトランスポートに対して スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。 詳細な情報に関しては <cite>bzrlib.transport.http.wsgi</cite> のdocstringsと <a class="reference external" href="http://www.python.org/dev/peps/pep-0333/">WSGI標準</a> を参照してください。</p> <div class="section" id="id271"> <h5>HTTP スマートサーバー経由で push する<a class="headerlink" href="#id271" title="このヘッドラインへのパーマリンク">¶</a></h5> <p>HTTP スマートサーバーを通してデータをプッシュすることは可能です。 これを行うための最も簡単な方法は、 <code class="docutils literal"><span class="pre">wsgi.make_app()</span></code> コールに <code class="docutils literal"><span class="pre">readonly=False</span></code> を 提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。 書き込みのサポートを有効にする場合、 実際にシステム上のデータを書き込みできる人を制限するために、 <code class="docutils literal"><span class="pre">.bzr/smart</span></code> URLへの権限を制限するとよいでしょう。例えば Apache で次のような設定を します。</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">Location</span> <span class="o">/</span><span class="n">code</span><span class="o">></span> <span class="n">AuthType</span> <span class="n">Basic</span> <span class="n">AuthName</span> <span class="s2">"example"</span> <span class="n">AuthUserFile</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">example</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">conf</span><span class="o">/</span><span class="n">auth</span><span class="o">.</span><span class="n">passwd</span> <span class="o"><</span><span class="n">LimitExcept</span> <span class="n">GET</span><span class="o">></span> <span class="n">Require</span> <span class="n">valid</span><span class="o">-</span><span class="n">user</span> <span class="o"></</span><span class="n">LimitExcept</span><span class="o">></span> <span class="o"></</span><span class="n">Location</span><span class="o">></span> </pre></div> </div> <p>現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を 分けることはできません。 (認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。 しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、 プレーンなHTTPは読み込み限定のアクセスを許可することはできます。</p> <p>HTTPS サイトに対してアクセスしたときに bzr が次のようなエラーを表示する 場合:</p> <div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bzr</span><span class="p">:</span> <span class="n">ERROR</span><span class="p">:</span> <span class="n">Connection</span> <span class="n">error</span><span class="p">:</span> <span class="n">curl</span> <span class="n">connection</span> <span class="n">error</span> <span class="p">(</span><span class="n">server</span> <span class="n">certificate</span> <span class="n">verification</span> <span class="n">failed</span><span class="o">.</span> <span class="n">CAfile</span><span class="p">:</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">ca</span><span class="o">-</span><span class="n">certificates</span><span class="o">.</span><span class="n">crt</span> <span class="n">CRLfile</span><span class="p">:</span> <span class="n">none</span><span class="p">)</span> </pre></div> </div> <p>You can workaround it by using <code class="docutils literal"><span class="pre">https+urllib</span></code> rather than <code class="docutils literal"><span class="pre">http</span></code> in your URL, or by uninstalling pycurl. See <a class="reference external" href="https://bugs.launchpad.net/bzr/+bug/82086">bug 82086</a> for more details.</p> <p>URL に <code class="docutils literal"><span class="pre">https</span></code> の代わりに <code class="docutils literal"><span class="pre">https+urllib</span></code> を使うことで問題を回避 できます。 詳細については <a class="reference external" href="https://bugs.launchpad.net/bzr/+bug/82086">bug 82086</a> を参照してください。</p> </div> </div> </div> <div class="section" id="writing-a-plugin"> <span id="id272"></span><h3><a class="toc-backref" href="#id341">プラグインを書く</a><a class="headerlink" href="#writing-a-plugin" title="このヘッドラインへのパーマリンク">¶</a></h3> <div class="section" id="id273"> <h4>導入<a class="headerlink" href="#id273" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プラグインはbzrのコア機能ととてもよく似ています。 これらはbzrlibから何でもインポートできます。 プラグインは標準機能を上書きすることもできますが、大抵プラグインは新しいコマンドを提供します。</p> </div> <div class="section" id="creating-a-new-command"> <span id="id274"></span><h4>新しいコマンドを作る<a class="headerlink" href="#creating-a-new-command" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>コマンドを書くには、 <code class="docutils literal"><span class="pre">bzrlib.commands.Command</span></code> を継承する新しいオブジェクトを作り、 <code class="docutils literal"><span class="pre">cmd_foo</span></code> と命名します。 fooはコマンドの名前です。 名前にアンダースコアが含まれるコマンドを作ると、UIではアンダースコアはハイフンとして表示されます。 たとえば、 <cite>cmd_baz_import</cite> は <cite>baz-import</cite> として表示されます。 コマンドの書き方の実例に関しては、 <code class="docutils literal"><span class="pre">builtins.py</span></code> を参照して頂くようお願いします。</p> <p>コマンドを作成したらファイルがインポートされるときに <code class="docutils literal"><span class="pre">bzrlib.commands.register_command(cmd_foo)</span></code> でコマンドを登録しなければなりません。 さもなければbzrはコマンドを見つけることはありません。</p> </div> <div class="section" id="installing-a-hook"> <span id="id275"></span><h4>フックをインストールする<a class="headerlink" href="#installing-a-hook" title="このヘッドラインへのパーマリンク">¶</a></h4> <p><a class="reference external" href="hooks.txt">Using hooks</a> を参照してください。</p> </div> <div class="section" id="specifying-a-plugin-version-number"> <span id="id276"></span><h4>プラグインのバージョン番号を指定する<a class="headerlink" href="#specifying-a-plugin-version-number" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>プラグインのバージョン番号を定義するにはタプルで <code class="docutils literal"><span class="pre">version_info</span></code> を定義します。例: <code class="docutils literal"><span class="pre">version_info</span> <span class="pre">=</span> <span class="pre">(0,</span> <span class="pre">9,</span> <span class="pre">0)</span></code> <code class="docutils literal"><span class="pre">version_info</span> <span class="pre">=</span> <span class="pre">(0,</span> <span class="pre">9,</span> <span class="pre">0,</span> <span class="pre">'dev',</span> <span class="pre">0)</span></code></p> </div> <div class="section" id="plugin-searching-rules"> <span id="id277"></span><h4>プラグインの検索ルール<a class="headerlink" href="#plugin-searching-rules" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>デフォルトではbzrはプラグインを見つけるために <code class="docutils literal"><span class="pre">~/.bazaar/plugins</span></code> と <code class="docutils literal"><span class="pre">bzrlib/plugins</span></code> をスキャンします。 <code class="docutils literal"><span class="pre">BZR_PLUGIN_PATH</span></code> でこれを上書きできます。 (詳細は、 <a class="reference external" href="../user-reference/configuration-help.html#bzr-plugin-path">ユーザーリファレンス</a> を参照してください。)</p> <p>プラグインはモジュールもしくはパッケージの形態をとることができます。 プラグインが単独のファイルであれば、構造をモジュールにできます。 プラグインが複数のファイルを持つ場合やbzrのブランチとして配布したい場合は、 構造をパッケージ、すなわち、ディレクトリの中に <code class="docutils literal"><span class="pre">__init__.py</span></code> を含めます。</p> </div> <div class="section" id="id279"> <h4>詳しい情報<a class="headerlink" href="#id279" title="このヘッドラインへのパーマリンク">¶</a></h4> <p>他の人にも役立つと考えましたら、プラグインをBzrToolsにお気軽に寄付してください。</p> <p>Bazaarの開発ガイドラインと方針の詳細に関しては <a class="reference external" href="../developer-guide/HACKING.html">Bazaar開発者ガイド</a> を参照してください。</p> </div> </div> <div class="section" id="licence"> <h3><a class="toc-backref" href="#id342">Licence</a><a class="headerlink" href="#licence" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>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 <<a class="reference external" href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>>.</p> </div> </div> </div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="../index.html">目次</a></h3> <ul> <li><a class="reference internal" href="#">Bazaarユーザーガイド</a><ul> <li><a class="reference internal" href="#id1">紹介</a><ul> <li><a class="reference internal" href="#id2">Bazaarの紹介</a><ul> <li><a class="reference internal" href="#id3">Bazaarとは?</a></li> <li><a class="reference internal" href="#id4">バージョン管理システムの小史</a></li> <li><a class="reference internal" href="#vs">集中型 vs 分散型</a></li> <li><a class="reference internal" href="#id5">Bazaarの主要な機能</a></li> <li><a class="reference internal" href="#id6">さらに学ぶ</a></li> </ul> </li> <li><a class="reference internal" href="#id10">コアの概念</a><ul> <li><a class="reference internal" href="#id11">単純なユーザーモデル</a></li> <li><a class="reference internal" href="#id12">リビジョン</a></li> <li><a class="reference internal" href="#id15">作業ツリー</a></li> <li><a class="reference internal" href="#id16">ブランチ</a></li> <li><a class="reference internal" href="#id17">レポジトリ</a></li> <li><a class="reference internal" href="#id18">概念をまとめる</a></li> </ul> </li> <li><a class="reference internal" href="#id19">ワークフロー</a><ul> <li><a class="reference internal" href="#id20">Bazaarはただのツール</a></li> <li><a class="reference internal" href="#id21">ソロ</a></li> <li><a class="reference internal" href="#id22">パートナー</a></li> <li><a class="reference internal" href="#id23">集中型</a></li> <li><a class="reference internal" href="#id24">ローカルなコミットで集中型</a></li> <li><a class="reference internal" href="#id25">共用のメインラインで分散型</a></li> <li><a class="reference internal" href="#id26">人間のゲートキーパーで分散型</a></li> <li><a class="reference internal" href="#id27">自動的なゲートキーパーで分散型</a></li> <li><a class="reference internal" href="#id28">ワークフローを実施する</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id29">始める</a><ul> <li><a class="reference internal" href="#id30">Bazaarをインストールする</a><ul> <li><a class="reference internal" href="#gnu-linux">GNU/Linux</a></li> <li><a class="reference internal" href="#windows">Windows</a></li> <li><a class="reference internal" href="#id31">他のオペレーティングシステム</a></li> <li><a class="reference internal" href="#id32">ゼロからインストールする</a><ul> <li><a class="reference internal" href="#site-wide">site-wide な場所にインストールする</a></li> </ul> </li> <li><a class="reference internal" href="#id33">開発バージョンを稼働させる</a></li> <li><a class="reference internal" href="#id34">複数のバージョンを稼働させる</a></li> </ul> </li> <li><a class="reference internal" href="#id35">コマンドを入力する</a><ul> <li><a class="reference internal" href="#id36">ユーザーインターフェイス</a></li> <li><a class="reference internal" href="#bzr">bzrを使う</a></li> <li><a class="reference internal" href="#id37">共通のオプション</a></li> </ul> </li> <li><a class="reference internal" href="#help">helpを表示する</a></li> <li><a class="reference internal" href="#id38">Bazaarを設定する</a><ul> <li><a class="reference internal" href="#id39">Bazaarにあなたの名前を教える</a></li> <li><a class="reference internal" href="#id40">ネットワークプロクシを使う</a></li> <li><a class="reference internal" href="#id41">いろいろな設定方法</a></li> <li><a class="reference internal" href="#id42">設定ファイル</a></li> <li><a class="reference internal" href="#id44">アクティブな設定を確認する</a></li> <li><a class="reference internal" href="#modifying-the-active-configuration">有効な設定を変更する</a></li> <li><a class="reference internal" href="#id47">ルールベースのプリファレンス</a></li> <li><a class="reference internal" href="#escaping-command-lines">コマンドラインのエスケープ</a></li> </ul> </li> <li><a class="reference internal" href="#id50">エイリアスを利用する</a><ul> <li><a class="reference internal" href="#id51">エイリアスとは?</a></li> <li><a class="reference internal" href="#id52">エイリアスを定義する</a></li> <li><a class="reference internal" href="#id53">定義したエイリアスを利用する</a></li> <li><a class="reference internal" href="#id54">エイリアスのためのルール</a></li> </ul> </li> <li><a class="reference internal" href="#id55">プラグインを利用する</a><ul> <li><a class="reference internal" href="#id56">プラグインとは?</a></li> <li><a class="reference internal" href="#id57">プラグインが見つかる場所</a></li> <li><a class="reference internal" href="#id58">プラグインをインストールする方法</a></li> <li><a class="reference internal" href="#id59">プラグインの代替用の場所</a></li> <li><a class="reference internal" href="#id61">インストールされたプラグインの一覧を表示する</a></li> <li><a class="reference internal" href="#id62">人気のあるプラグイン</a></li> </ul> </li> <li><a class="reference internal" href="#id64">Bazaarの哲学</a><ul> <li><a class="reference internal" href="#id65">Bazaarを完全に理解する</a></li> <li><a class="reference internal" href="#id66">リビジョン番号を理解する</a></li> <li><a class="reference internal" href="#id69">階層形式の履歴はよいものである</a></li> <li><a class="reference internal" href="#id70">それぞれのブランチは履歴の独自のビューを持つ</a></li> <li><a class="reference internal" href="#id71">要約</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id72">個人用途のバージョン管理</a><ul> <li><a class="reference internal" href="#id73">単独で始める</a><ul> <li><a class="reference internal" href="#id74">個人の生産性を向上させるツール</a></li> <li><a class="reference internal" href="#id75">単独用途のワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#id76">プロジェクトを始める</a><ul> <li><a class="reference internal" href="#id77">既存のプロジェクトをバージョン管理する</a></li> <li><a class="reference internal" href="#id78">新しいプロジェクトを始める</a></li> </ul> </li> <li><a class="reference internal" href="#id79">ファイルの登録を制御する</a><ul> <li><a class="reference internal" href="#id80">Bazaarは何を追跡するのか?</a></li> <li><a class="reference internal" href="#id81">登録を選ぶ</a></li> <li><a class="reference internal" href="#id82">ファイルを無視する</a></li> <li><a class="reference internal" href="#id83">グローバルで無視する</a></li> </ul> </li> <li><a class="reference internal" href="#id86">変更をレビューする</a><ul> <li><a class="reference internal" href="#id87">リープする前にロックする</a></li> <li><a class="reference internal" href="#bzr-status">bzr status</a></li> <li><a class="reference internal" href="#bzr-diff">bzr diff</a></li> </ul> </li> <li><a class="reference internal" href="#id88">変更を記録する</a><ul> <li><a class="reference internal" href="#bzr-commit">bzr commit</a></li> <li><a class="reference internal" href="#id89">エディタからのメッセージ</a></li> <li><a class="reference internal" href="#id90">選択可能なコミット</a></li> <li><a class="reference internal" href="#id91">変更に署名をつける</a></li> </ul> </li> <li><a class="reference internal" href="#id92">履歴を閲覧する</a><ul> <li><a class="reference internal" href="#bzr-log">bzr log</a></li> <li><a class="reference internal" href="#id93">マージされたリビジョンを見る</a></li> <li><a class="reference internal" href="#id94">出力をチューニングする</a></li> <li><a class="reference internal" href="#id95">ファイルの履歴を閲覧する</a></li> <li><a class="reference internal" href="#id96">古いバージョンのファイルを閲覧する</a></li> <li><a class="reference internal" href="#id97">グラフィカルな履歴ビューワ</a></li> </ul> </li> <li><a class="reference internal" href="#id99">プロジェクトをリリースする</a><ul> <li><a class="reference internal" href="#id100">リリースをパッケージ化する</a></li> <li><a class="reference internal" href="#id101">リリースをタギングする</a></li> </ul> </li> <li><a class="reference internal" href="#id102">間違いを取り消す</a><ul> <li><a class="reference internal" href="#id103">間違いは起きる</a></li> <li><a class="reference internal" href="#id104">プロジェクトのリビジョンの履歴をドロップする</a></li> <li><a class="reference internal" href="#id105">ファイルもしくはディレクトリの登録を解除する</a></li> <li><a class="reference internal" href="#id106">最後のコミット以降の変更を取り消す</a></li> <li><a class="reference internal" href="#id107">最後のコミット以降のファイルへの変更を取り消す</a></li> <li><a class="reference internal" href="#id108">最後のコミットを取り消す</a></li> <li><a class="reference internal" href="#id110">複数のコミットを取り消す</a></li> <li><a class="reference internal" href="#id111">過去のバージョンの状態に戻す</a></li> <li><a class="reference internal" href="#id113">タグを訂正する</a></li> <li><a class="reference internal" href="#id114">タグをクリアする</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id115">同僚と共有する</a><ul> <li><a class="reference internal" href="#id116">他の人と連携する</a><ul> <li><a class="reference internal" href="#peer-to-peer">Peer-to-peerをうまくやる</a></li> <li><a class="reference internal" href="#id117">パートナーのワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#id118">プロジェクトをブランチする</a><ul> <li><a class="reference internal" href="#url">ブランチのURL</a></li> <li><a class="reference internal" href="#a-reminder-about-shared-repositories">共用レポジトリに関するリマインダ</a></li> <li><a class="reference internal" href="#id123">ブランチのコマンド</a></li> <li><a class="reference internal" href="#id124">時間とスペースへの考慮</a></li> <li><a class="reference internal" href="#id125">ブランチの情報を閲覧する</a></li> </ul> </li> <li><a class="reference internal" href="#id126">変更をマージする</a><ul> <li><a class="reference internal" href="#id127">並行開発</a></li> <li><a class="reference internal" href="#merge">mergeコマンド</a></li> <li><a class="reference internal" href="#id128">マージの動作方法は?</a></li> <li><a class="reference internal" href="#id130">マージを記録する</a></li> <li><a class="reference internal" href="#id131">マージの追跡</a></li> </ul> </li> <li><a class="reference internal" href="#id132">衝突の解消</a><ul> <li><a class="reference internal" href="#id133">ワークフロー</a></li> <li><a class="reference internal" href="#id134">衝突の一覧を表示する</a></li> <li><a class="reference internal" href="#id135">衝突を解消する</a></li> <li><a class="reference internal" href="#remerge">remergeコマンドを使う</a></li> <li><a class="reference internal" href="#id136">衝突を解消するために外部ツールを利用する</a></li> </ul> </li> <li><a class="reference internal" href="#id137">変更に注釈を付ける</a><ul> <li><a class="reference internal" href="#id138">内容の起源を探し出す</a></li> <li><a class="reference internal" href="#gui">GUIツール</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id139">集中スタイルの、チームコラボレーション</a><ul> <li><a class="reference internal" href="#id140">集中型の開発</a><ul> <li><a class="reference internal" href="#id141">動機</a></li> <li><a class="reference internal" href="#id142">集中型のワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#publishing-a-branch">ブランチを公開する</a><ul> <li><a class="reference internal" href="#id144">集中型リポジトリをセットアップする</a></li> <li><a class="reference internal" href="#id146">集中型ブランチを始める</a></li> </ul> </li> <li><a class="reference internal" href="#id147">チェックアウト機能を利用する</a><ul> <li><a class="reference internal" href="#id148">ブランチをチェックアウトに変更する</a></li> <li><a class="reference internal" href="#id149">チェックアウトをブランチに変更する</a></li> <li><a class="reference internal" href="#id150">チェックアウトを入手する</a></li> <li><a class="reference internal" href="#getting-a-lightweight-checkout">軽量チェックアウトを入手する</a></li> <li><a class="reference internal" href="#id155">最新の内容に更新する</a></li> <li><a class="reference internal" href="#id156">コミットの失敗を扱う</a></li> </ul> </li> <li><a class="reference internal" href="#id157">オフラインで集中型のブランチに取り組む</a><ul> <li><a class="reference internal" href="#id158">集中型のローカルコミットのワークフロー</a></li> <li><a class="reference internal" href="#id159">ローカルでコミットする</a></li> <li><a class="reference internal" href="#id160">長期間切断する</a></li> <li><a class="reference internal" href="#id161">ローカルコミットのシリーズをマージする</a></li> </ul> </li> <li><a class="reference internal" href="#id162">チェックアウトを再利用する</a><ul> <li><a class="reference internal" href="#id163">動機</a></li> <li><a class="reference internal" href="#id164">ブランチが結びつけられた場所を変更する</a></li> <li><a class="reference internal" href="#id165">軽量型チェックアウトを切り替える</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id166">分散スタイルの、チームコラボレーション</a><ul> <li><a class="reference internal" href="#id167">分散型の開発</a><ul> <li><a class="reference internal" href="#id168">動機</a></li> <li><a class="reference internal" href="#id169">分散型の共用のメインラインのワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#id170">ブランチを編成する</a><ul> <li><a class="reference internal" href="#id171">ミラーブランチ</a></li> <li><a class="reference internal" href="#id172">タスクのブランチ</a></li> <li><a class="reference internal" href="#id173">ミラーブランチをリフレッシュする</a></li> <li><a class="reference internal" href="#id174">最新のトランクを機能ブランチにマージする</a></li> <li><a class="reference internal" href="#id175">機能をトランクにマージする</a></li> <li><a class="reference internal" href="#id176">タスクブランチをバックアップする</a></li> </ul> </li> <li><a class="reference internal" href="#id177">ゲートキーパーを利用する</a><ul> <li><a class="reference internal" href="#id178">分散型の人間のゲートキーパーのワークフロー</a></li> <li><a class="reference internal" href="#id179">分散型の自動ゲートキーパーのワークフロー</a></li> </ul> </li> <li><a class="reference internal" href="#id180">変更を送信する</a><ul> <li><a class="reference internal" href="#id181">動機</a></li> <li><a class="reference internal" href="#id182">マージのディレクティブを理解する</a></li> <li><a class="reference internal" href="#id183">マージディレクティブを作る</a></li> <li><a class="reference internal" href="#id185">マージのディレクティブを適用する</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id186">その他のトピック</a><ul> <li><a class="reference internal" href="#id187">これからの長い旅</a></li> <li><a class="reference internal" href="#id188">疑似マージ</a><ul> <li><a class="reference internal" href="#id189">チェリーピッキング</a></li> <li><a class="reference internal" href="#id190">親のないマージ</a></li> <li><a class="reference internal" href="#reverse-cherrypicking">リバースチェリーピッキング</a></li> <li><a class="reference internal" href="#id192">コミットされていない変更をマージする</a></li> <li><a class="reference internal" href="#id193">リベースする</a></li> </ul> </li> <li><a class="reference internal" href="#shelving-changes">Shelving Changes</a></li> <li><a class="reference internal" href="#filtered-views">Filtered views</a><ul> <li><a class="reference internal" href="#filtered-view">Filtered view の紹介</a></li> <li><a class="reference internal" href="#view">view を作る</a></li> <li><a class="reference internal" href="#id194">現在のviewをリストする</a></li> <li><a class="reference internal" href="#id195">viewを切り替える</a></li> <li><a class="reference internal" href="#id196">一時的にviewを無効にする</a></li> <li><a class="reference internal" href="#id197">viewを削除する</a></li> <li><a class="reference internal" href="#id198">注意点</a></li> </ul> </li> <li><a class="reference internal" href="#id199">スタックブランチを利用する</a><ul> <li><a class="reference internal" href="#motivation">ユースケース</a></li> <li><a class="reference internal" href="#id201">スタックブランチとは?</a></li> <li><a class="reference internal" href="#id202">スタックブランチを作成する</a></li> <li><a class="reference internal" href="#id203">スタックチェックアウトを作成する</a></li> <li><a class="reference internal" href="#id204">スタックブランチをプッシュする</a></li> <li><a class="reference internal" href="#id205">スタックブランチの制限</a></li> <li><a class="reference internal" href="#id206">スタックするブランチを変更する</a></li> </ul> </li> <li><a class="reference internal" href="#id207">スマートサーバーを稼働させる</a><ul> <li><a class="reference internal" href="#id208">ダムサーバー</a></li> <li><a class="reference internal" href="#id209">ハイパフォーマンスなスマートサーバー</a><ul> <li><a class="reference internal" href="#ssh">SSH</a></li> <li><a class="reference internal" href="#inetd">inetd</a></li> <li><a class="reference internal" href="#id210">専用サーバー</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id211">フックを利用する</a><ul> <li><a class="reference internal" href="#id212">フックとは?</a></li> <li><a class="reference internal" href="#id214">フックを使用する</a></li> <li><a class="reference internal" href="#id216">フックをデバッグする</a></li> <li><a class="reference internal" href="#id217">例: マージプラグイン</a></li> </ul> </li> <li><a class="reference internal" href="#id218">バージョンの情報をエクスポートする</a><ul> <li><a class="reference internal" href="#id219">最新のリビジョン番号を得る</a></li> <li><a class="reference internal" href="#id220">詳細なバージョン情報を得る</a></li> <li><a class="reference internal" href="#python">Pythonのプロジェクト</a></li> <li><a class="reference internal" href="#id221">別のフォーマットでバージョン情報を得る</a></li> <li><a class="reference internal" href="#id222">チェッククリーン</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id223">人気のあるプラグインの手短なツアー</a><ul> <li><a class="reference internal" href="#bzrtools">BzrTools</a><ul> <li><a class="reference internal" href="#id224">概要</a></li> <li><a class="reference internal" href="#shell">shell</a></li> <li><a class="reference internal" href="#cdiff">cdiff</a></li> </ul> </li> <li><a class="reference internal" href="#bzr-svn">bzr-svn</a><ul> <li><a class="reference internal" href="#id225">概要</a></li> <li><a class="reference internal" href="#id226">シンプルな例</a></li> <li><a class="reference internal" href="#id227">集中型のミラーを利用する</a></li> <li><a class="reference internal" href="#id228">bzr-svnの制限</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id229">Bazaarを環境に統合する</a><ul> <li><a class="reference internal" href="#id230">ウェブブラウジング</a><ul> <li><a class="reference internal" href="#id231">概要</a></li> </ul> </li> <li><a class="reference internal" href="#id232">バグトラッカー</a><ul> <li><a class="reference internal" href="#id233">コミットとバグを関連付ける</a></li> <li><a class="reference internal" href="#id235">メタデータの記録 vs バグトラッカーの更新</a></li> <li><a class="reference internal" href="#id236">訂正をする</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#id237">付録</a><ul> <li><a class="reference internal" href="#specifying-revisions">リビジョンを指定する</a><ul> <li><a class="reference internal" href="#revision-identifiers-and-ranges">リビジョンの識別子と範囲</a></li> <li><a class="reference internal" href="#available-revision-identifiers">利用可能なリビジョンの識別子</a><ul> <li><a class="reference internal" href="#id242">番号</a></li> <li><a class="reference internal" href="#revid">revid</a></li> <li><a class="reference internal" href="#before">before</a></li> <li><a class="reference internal" href="#date">date</a></li> <li><a class="reference internal" href="#ancestor">Ancestor</a></li> <li><a class="reference internal" href="#branch">Branch</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#organizing-your-workspace">作業スペースを構成する</a><ul> <li><a class="reference internal" href="#common-workspace-layouts">一般的なレイアウト</a></li> <li><a class="reference internal" href="#id245">軽量チェックアウト</a></li> <li><a class="reference internal" href="#id246">スタンドアロンツリー</a></li> <li><a class="reference internal" href="#feature-branches">機能ブランチ</a></li> <li><a class="reference internal" href="#sandbox">ローカルのsandbox</a></li> <li><a class="reference internal" href="#id248">進んだレイアウト</a></li> </ul> </li> <li><a class="reference internal" href="#id250">共用レポジトリのレイアウト</a><ul> <li><a class="reference internal" href="#svn-trunk-branches">“SVN形式” (<code class="docutils literal"><span class="pre">trunk/</span></code>, <code class="docutils literal"><span class="pre">branches/</span></code>)</a><ul> <li><a class="reference internal" href="#project-trunk"><code class="docutils literal"><span class="pre">project/trunk</span></code></a></li> <li><a class="reference internal" href="#trunk-project"><code class="docutils literal"><span class="pre">trunk/project</span></code></a></li> </ul> </li> <li><a class="reference internal" href="#project-branch-sub-branch">入れ子形式 (<code class="docutils literal"><span class="pre">project/branch/sub-branch/</span></code>)</a></li> <li><a class="reference internal" href="#dev-merged-experimental">ステータスによる種類分け (<code class="docutils literal"><span class="pre">dev/</span></code>, <code class="docutils literal"><span class="pre">merged/</span></code>, <code class="docutils literal"><span class="pre">experimental/</span></code>)</a></li> <li><a class="reference internal" href="#id253">日付/リリース/その他で種類分け (<code class="docutils literal"><span class="pre">2006-06/</span></code>, <code class="docutils literal"><span class="pre">2006-07/</span></code>, <code class="docutils literal"><span class="pre">0.8/</span></code>, <code class="docutils literal"><span class="pre">0.9</span></code>)</a></li> <li><a class="reference internal" href="#project-joe-foo-project-barry-bar">シンプルな開発者名 (<code class="docutils literal"><span class="pre">project/joe/foo</span></code>, <code class="docutils literal"><span class="pre">project/barry/bar</span></code>)</a></li> <li><a class="reference internal" href="#id254">要約</a></li> </ul> </li> <li><a class="reference internal" href="#e">Eメールを設定する</a><ul> <li><a class="reference internal" href="#bazaare">なぜBazaarでEメールアドレスをセットアップするのか?</a></li> <li><a class="reference internal" href="#id255">Eメールアドレスをセットアップする方法</a></li> <li><a class="reference internal" href="#whoami-e">‘whoami’コマンドでEメールを設定する</a></li> <li><a class="reference internal" href="#id256">デフォルトの設定ファイルでEメールを設定する</a></li> <li><a class="reference internal" href="#id258">ブランチ単位でEメールを設定する</a></li> <li><a class="reference internal" href="#id259">環境変数を通してEメールを設定する</a></li> <li><a class="reference internal" href="#id260">スパムに関する懸念事項</a></li> </ul> </li> <li><a class="reference internal" href="#apache-bazaar">Apache を使って Bazaar サーバーをたてる</a><ul> <li><a class="reference internal" href="#id262">例</a></li> <li><a class="reference internal" href="#apache-2-0">Apache 2.0を設定する</a><ul> <li><a class="reference internal" href="#fastcgi">FastCGI</a></li> <li><a class="reference internal" href="#mod-python">mod_python</a></li> <li><a class="reference internal" href="#mod-wsgi">mod_wsgi</a></li> </ul> </li> <li><a class="reference internal" href="#id265">Bazaarを設定する</a><ul> <li><a class="reference internal" href="#id266">FastCGI</a></li> <li><a class="reference internal" href="#id267">mod_python</a></li> <li><a class="reference internal" href="#id268">mod_wsgi</a></li> </ul> </li> <li><a class="reference internal" href="#id269">クライアント</a></li> <li><a class="reference internal" href="#id270">高度な設定</a><ul> <li><a class="reference internal" href="#id271">HTTP スマートサーバー経由で push する</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#writing-a-plugin">プラグインを書く</a><ul> <li><a class="reference internal" href="#id273">導入</a></li> <li><a class="reference internal" href="#creating-a-new-command">新しいコマンドを作る</a></li> <li><a class="reference internal" href="#installing-a-hook">フックをインストールする</a></li> <li><a class="reference internal" href="#specifying-a-plugin-version-number">プラグインのバージョン番号を指定する</a></li> <li><a class="reference internal" href="#plugin-searching-rules">プラグインの検索ルール</a></li> <li><a class="reference internal" href="#id279">詳しい情報</a></li> </ul> </li> <li><a class="reference internal" href="#licence">Licence</a></li> </ul> </li> </ul> </li> </ul> <div role="note" aria-label="source link"> <h3>このページ</h3> <ul class="this-page-menu"> <li><a href="../_sources/user-guide/index-plain.txt" rel="nofollow">ソースコードを表示</a></li> </ul> </div> <div id="searchbox" style="display: none" role="search"> <h3>クイック検索</h3> <form class="search" action="../search.html" method="get"> <div><input type="text" name="q" /></div> <div><input type="submit" value="検索" /></div> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>ナビゲーション</h3> <ul> <li class="nav-item nav-item-0"><a href="../index.html">目次 (2.7.0)</a> »</li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2009-2011 Canonical Ltd. このドキュメントは <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.9 で生成しました。 </div> </body> </html>