<!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bazaar チュートリアル — Bazaar v2.2.4 documentation</title> <link rel="stylesheet" href="../_static/default.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.2.4', 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="top" title="Bazaar v2.2.4 documentation" href="../index.html" /> <link rel="up" title="チュートリアル" href="index.html" /> <link rel="next" title="LaunchpadでBazaarを使う" href="using_bazaar_with_launchpad.html" /> <link rel="prev" title="5分でわかるBazaar" href="../mini-tutorial/index.html" /> </head> <body> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="using_bazaar_with_launchpad.html" title="LaunchpadでBazaarを使う" accesskey="N">次へ</a></li> <li class="right" > <a href="../mini-tutorial/index.html" title="5分でわかるBazaar" accesskey="P">前へ</a> |</li> <li><a href="../index.html">目次 (2.2.4)</a> »</li> <li><a href="index.html" accesskey="U">チュートリアル</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="bazaar"> <h1>Bazaar チュートリアル<a class="headerlink" href="#bazaar" title="このヘッドラインへのパーマリンク">¶</a></h1> <div class="section" id="id1"> <h2>はじめに<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>もし、もう分散型バージョン管理に慣れ親しんでいるなら、 “Bazaarに自己紹介する” の節までとばしてください。 もし、分散型でないバージョン管理に慣れ親しんでいるけれど分散型バージョン管理はよくわからないのであれば、”分散バージョン管理と分散でないバージョン管理の違い”までとばしてください。 それ以外の場合、コーヒーか紅茶(訳注:日本茶でもいいですよ)を用意して、リラックスして読み始めてください。</p> </div> <div class="section" id="id2"> <h2>バージョン管理の目的<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>なにかのテキストデータ(プログラムのソースコード、Webサイト、Unixシステムでの設定ファイルなど)を扱う作業をしているとしましょう。 なにかミスをして、重大なデグレードを引き起こしてしまうかもしれません。 例えばメールサーバーの設定ファイルを消してしまったり、だいじなプロジェクトのソースコードを壊してしまったりすることがあります。 だいじな情報を失って、何が何でも取り戻したいと思った経験があるのであれば、きっとあなたはBazaarを使う準備ができています。</p> <p>Bazaarをはじめとするバージョン管理システムは、ディレクトリに起こった変更を<strong>ブランチ (branch)</strong> というディレクトリよりも複雑なものの中に入れて追跡します。 ブランチはディレクトリの中に何が入っているかだけでなく、過去のいろいろな時点でのディレクトリの中身を格納しています。 なので、望まぬ変更をしてしまったときには過去の時点の状態に戻すことができます。</p> <p>バージョン管理システムは、ユーザーが “<strong>リビジョン (revision)</strong> をコミット” することで変更をブランチに保存します。 このときに生成されるリビジョンとは、本質的にいって、前回保存したときからの変更点になります。</p> <p>リビジョンはそれ以外のものも持っています(原文:These revisions have other uses as well.) たとえば、オプションのログメッセージをつけることで、変更が何を意味しているのかというコメントを残すことができます。 実際に利用されるログメッセージは、 “Webテンプレートをテーブルを閉じるように修正” とか “sftpに対応した。 #595 を修正。” といったものです。</p> <p>こういったログが保存されているおかげで、たとえば後になって sftp に問題が発生したときに、問題が発生するようになったのがどの時点なのか目星をつけることができます。</p> </div> <div class="section" id="id3"> <h2>分散バージョン管理と分散でないバージョン管理の違い<a class="headerlink" href="#id3" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>多くのバージョン管理システムはサーバーに配置されています。 バージョン管理されているコードに対して作業をしたい場合、サーバーに接続してコードを “チェックアウト (checkout)” する必要があります。 そうすると、変更やコミットができるディレクトリができます。 バージョン管理システムのクライアントは、バージョン管理システムのサーバーにコミットされた変更を保存します。この方式は集中型として知られています。</p> <p>集中型にはいくつかの欠点があります。 集中型バージョン管理システムは、動作するためにサーバーとの接続を要求します。 このことは、サーバーがどこかインターネット上にあって、あなたのマシンがインターネットに接続できないときに問題になります。 もしくは、あなたのマシンがインターネットに接続できてもサーバーが落ちているときにもやはり問題になります。</p> <p>分散バージョン管理システムは、ブランチをクライアントと同じマシンに置くことでこの問題を解決しています。 Bazaarの場合、ブランチはバージョン管理されているコードと同じディレクトリに保存されます。 これにより、ユーザーは(たとえオフラインであったとしても)好きなときに変更を保存(<strong>コミット (commit)</strong>)することができます。 インターネット接続が必要になるのは、どこか別の場所にあるブランチの変更にアクセスするときだけです。</p> <p>多くの人が必要としていることは、ディレクトリ内でおこったファイルやサブディレクトリの変更を追跡することです。 この追跡を手でおこなうのは面倒で不恰好な作業です。 これは、Bazaarのようなバージョン管理システムの目的のひとつです。 バージョン管理システムはユーザーが指示したときにディレクトリツリーの <strong>リビジョン (revision)</strong> を作ることでこの作業を自動化します。</p> <p>バージョン管理システムは単に保存したりundoしたりするだけではありません。 たとえばBazaarでは、ソフトウェアのあるブランチから変更を取り出して、関連する別のブランチに適用することができます。このとき、変更を取り出すブランチは別の人のものであってもかまいません。これにより、開発者のグループはお互いに書き込み権を与えることなく共同作業することができます。</p> <p>Bazaarではリビジョンの ‘’親 (ancestry)’’ 、つまりそのリビジョンの元になったリビジョンを記録しています。 ひとつのリビジョンは複数の、それぞれ別の変更を含む子供リビジョンを持つことがあり、それはツリーの進化が分岐していることを意味しています。 Bazaarではブランチを作ることによって、複数の人が厳しい lock-step をとらなくても協力することができます。 ブランチを作ることは個人での開発でも便利です。</p> </div> <div class="section" id="id4"> <h2>Bazaarに自己紹介する<a class="headerlink" href="#id4" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>Bazaarは <strong>bzr</strong> という新しいコマンドをひとつインストールします。 他の全ては bzr のサブコマンドになります。 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">help</span></tt> コマンドでいくつかのヘルプを見られます。 幾つかの話題は topic にまとめられていて、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">help</span> <span class="pre">topics</span></tt> で利用可能なトピックの一覧を見られます。</p> <p>バージョン管理システムの一つの機能は、誰が何を変更したのかを追跡することです。 分散型バージョン管理システムでは、各開発者がグローバルユニークなIDを持つ必要があります。 ほとんどの人はこのIDとして利用できる eメールアドレス を持っています。 Bazaarはコンピュータのユーザー名とホスト名から自動でメールアドレスを生成します。Bazaarが自動で作成したメールアドレス以外のものを使いたい場合、3つの選択肢があります。</p> <ol class="arabic"> <li><p class="first"><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">whoami</span></tt> を使ってメールアドレスを設定します。これはグローバルなIDを設定する最も簡単な方法です。グローバルなIDを設定するには:</p> <div class="highlight-python"><pre>% bzr whoami "Your Name <email@example.com>"</pre> </div> <p>特定のブランチでべつのアドレスを使いたい場合、そのブランチのディレクトリのなかで次のコマンドを実行します:</p> <div class="highlight-python"><pre>% bzr whoami --branch "Your Name <email@example.com>"</pre> </div> </li> <li><p class="first"><tt class="docutils literal"><span class="pre">?/.bazaar/bazaar.conf</span></tt> <a class="footnote-reference" href="#id6" id="id5">[1]</a> の中のメールアドレスを、以下のようにして設定します。 <tt class="docutils literal"><span class="pre">[DEFAULT]</span></tt> の部分が大文字と小文字を区別するので注意してください:</p> <div class="highlight-python"><pre>[DEFAULT] email=Your Name <email@isp.com></pre> </div> <p>特定のブランチにおける設定は、 <tt class="docutils literal"><span class="pre">?/.bazaar/locations.conf</span></tt> にブランチのセクションを作成して次のように書くことができます。</p> <div class="highlight-python"><pre>[/the/path/to/the/branch] email=Your Name <email@isp.com></pre> </div> </li> <li><p class="first">環境変数 <tt class="docutils literal"><span class="pre">$BZR_EMAIL</span></tt> もしくは <tt class="docutils literal"><span class="pre">$EMAIL</span></tt> (<tt class="docutils literal"><span class="pre">$BZR_EMAIL</span></tt> の方が優先されます)にメールアドレスを設定することで、上の二つの方法で設定されたオプションを上書きすることができます。</p> </li> </ol> <table class="docutils footnote" frame="void" id="id6" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id5">[1]</a></td><td>Windowsではユーザー設定ファイルはアプリケーションデータディレクトリにおかれます。なので、設定ファイルの場所は <tt class="docutils literal"><span class="pre">?/.bazaar/branch.conf</span></tt> ではなく<tt 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></tt> になります。 同じことが <tt class="docutils literal"><span class="pre">locations.conf</span></tt>, <tt class="docutils literal"><span class="pre">ignore</span></tt>, <tt class="docutils literal"><span class="pre">plugins</span></tt> ディレクトリも同じです。</td></tr> </tbody> </table> </div> <div class="section" id="id7"> <h2>ブランチを作る<a class="headerlink" href="#id7" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>履歴はデフォルトではブランチの .bzr ディレクトリの中に保存されます。</p> <p>既存のディレクトリの中で <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">init</span></tt> をすると新しいブランチを作成できます:</p> <div class="highlight-python"><pre>% mkdir tutorial % cd tutorial % ls -a ./ ../ % pwd /home/mbp/work/bzr.test/tutorial % % bzr init % ls -aF ./ ../ .bzr/ %</pre> </div> <p>ファイルには3つのクラス、 unknown, ignored, versioned があります。 <strong>add</strong> コマンドはファイルを versioned にし、そのファイルへの変更の記録を開始します:</p> <div class="highlight-python"><pre>% echo 'hello world' > hello.txt % bzr status unknown: hello.txt % bzr add hello.txt added hello.txt % bzr status added: hello.txt</pre> </div> <p>もし間違えたファイルを add してしまった場合、そのファイルを unversioned 状態に戻すために <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">remove</span></tt> してください。 この場合の <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">remove</span></tt> は、ほかの場合 <a class="footnote-reference" href="#id9" id="id8">[2]</a> とちがってファイルを削除しません。</p> <table class="docutils footnote" frame="void" id="id9" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label">[2]</td><td><em>(<a class="fn-backref" href="#id8">1</a>, <a class="fn-backref" href="#id22">2</a>)</em> <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">remove</span></tt> はファイルがバージョン管理されていて何も変更されていない場合に、そのファイルを削除します。 <tt class="docutils literal"><span class="pre">--keep</span></tt> オプションで常にファイルを残すことができます。 <tt class="docutils literal"><span class="pre">--force</span></tt> オプションで常にファイルを削除することもできます。</td></tr> </tbody> </table> </div> <div class="section" id="id10"> <h2>ブランチの場所<a class="headerlink" href="#id10" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>すべての履歴はブランチに格納されます。ブランチとは、管理用のファイルを含んだただのディレクトリです。デフォルトでは、svnやsvkのような、分離したリポジトリやデータベースはありません。分離したリポジトリを作成することもできます(<tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">init-repo</span></tt> コマンドを参照してください)。大規模なブランチを利用する場合や、中規模のブランチをたくさん利用する場合にはリポジトリを分離するといいでしょう。</p> <p>自分のコンピュータのファイルシステム上にあるブランチを参照するときはブランチを格納しているディレクトリ名で指定できます。 bzr は http や ftp経由でブランチにアクセスすることもできます。例:</p> <div class="highlight-python"><pre>% bzr log http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/ % bzr log sftp://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/</pre> </div> <p>プラグインをインストールすれば、 rsync プロトコルを使ってブランチにアクセスすることもできます。</p> <p>ブランチを指定した場所に置く方法については、 <a class="reference internal" href="#id26">ブランチを公開する</a> 節をご覧ください。</p> </div> <div class="section" id="id11"> <h2>変更をレビューする<a class="headerlink" href="#id11" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>一仕事終えたら、それを履歴に <strong>コミット (commit)</strong> しましょう。 新しい機能を追加したり、バグを直したり、コードやドキュメントを更新したらいつでもコミットするのは良いことです。 すべてのリビジョンが良い状態であるようにするために、コミットする前にコードをコンパイルしたりテストスイートを実行するのも良い習慣です。 コミットする前にコミットしようとしているものを確認するためにレビューすることができます。</p> <p>この目的で便利な二つのコマンドがあります。 <strong>status</strong> と <strong>diff</strong> です。</p> <div class="section" id="bzr-status"> <h3>bzr status<a class="headerlink" href="#bzr-status" title="このヘッドラインへのパーマリンク">¶</a></h3> <p><strong>status</strong> コマンドは、今の作業ツリーが最後のリビジョンからどのように変更されたのかを教えてくれます:</p> <div class="highlight-python"><pre>% bzr status modified: foo</pre> </div> <p><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">status</span></tt> は変更が無かったり無視されているファイルを隠します。 status コマンドはオプションとして、確認対象となる複数のファイル名やディレクトリ名を渡すことができます。</p> </div> <div class="section" id="bzr-diff"> <h3>bzr diff<a class="headerlink" href="#bzr-diff" title="このヘッドラインへのパーマリンク">¶</a></h3> <p><strong>diff</strong> コマンドは通常の unified diff フォーマットですべてのファイルのテキストの変更を表示します。 このコマンドの出力を pipe 経由で、’‘patch’‘, ‘’diffstat’‘, ‘’fileterdiff’‘, ‘’colordiff’’ といったコマンドに渡すことができます。</p> <div class="highlight-python"><pre>% bzr diff === added file 'hello.txt' --- hello.txt 1970-01-01 00:00:00 +0000 +++ hello.txt 2005-10-18 14:23:29 +0000 @@ -0,0 +1,1 @@ +hello world</pre> </div> <p><tt class="docutils literal"><span class="pre">-r</span></tt> オプションをつけると、作業ツリーを古いリビジョンと比較したり、二つのリビジョン間の差分を見ることができます。</p> <div class="highlight-python"><pre>% bzr diff -r 1000.. # everything since r1000 % bzr diff -r 1000..1100 # changes from 1000 to 1100</pre> </div> <p><tt class="docutils literal"><span class="pre">--diff-options</span></tt> オプションをつけると、 bzr は外部の diff プログラムにオプションをつけて起動します。 例:</p> <div class="highlight-python"><pre>% bzr diff --diff-options --side-by-side foo</pre> </div> <p>プロジェクトによっては二つのファイルに接頭辞がついた patch が好まれます。 <tt class="docutils literal"><span class="pre">--prefix</span></tt> オプションでそのような接頭辞をつけることができます。 ショートカットとして、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span> <span class="pre">-p1</span></tt> は <tt class="docutils literal"><span class="pre">patch</span> <span class="pre">-p1</span></tt> コマンドが受け付ける形で差分を出力します。</p> </div> </div> <div class="section" id="id12"> <h2>変更をコミットする<a class="headerlink" href="#id12" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>作業ツリーの状態に満足したら、ブランチに <strong>コミット (commit)</strong> しましょう。 コミットとは作業ツリーの状態のスナップショットを保持するリビジョンを新しく作ることです。</p> <div class="section" id="bzr-commit"> <h3>bzr commit<a class="headerlink" href="#bzr-commit" title="このヘッドラインへのパーマリンク">¶</a></h3> <p><strong>commit</strong> コマンドはそのリビジョンの変更を説明するメッセージを受け取ります。 また、あなたのユーザーID、今の時間とタイムゾーン、ツリーの内容をあわせて記録します。 コミットメッセージは <tt class="docutils literal"><span class="pre">-m</span></tt> もしくは <tt class="docutils literal"><span class="pre">--message</span></tt> オプションで指定できます。 複数行のコメントも利用できます。多くのシェルはクォートを開いたままで改行することで複数行の入力が可能です。</p> <div class="highlight-python"><pre>% bzr commit -m "added my first file"</pre> </div> <p>メッセージをファイルで渡すには <tt class="docutils literal"><span class="pre">-F</span></tt> オプションを使います。 コミットメッセージを先に作成し、それとdiffを合わせてレビューすることで、 コミットメッセージとコミット内容が一致していることを確認する人もいます。 (このファイルは休憩から戻ってきて作業を思い出すときにも役に立つでしょう)</p> </div> <div class="section" id="id13"> <h3>エディタからメッセージを入力する<a class="headerlink" href="#id13" title="このヘッドラインへのパーマリンク">¶</a></h3> <p><tt class="docutils literal"><span class="pre">-m</span></tt> オプションも <tt class="docutils literal"><span class="pre">-F</span></tt> オプションも指定しなかった場合、 bzr はメッセージを入力するためにエディタを立ち上げます。 このエディタは <tt class="docutils literal"><span class="pre">$VISUAL</span></tt> か <tt class="docutils literal"><span class="pre">$EDITOR</span></tt> 環境変数で制御することができます。 この環境変数を `` /.bazaar/bazaar.conf`` 内の <tt class="docutils literal"><span class="pre">editor</span></tt> を設定して上書きすることができ、さらに <tt class="docutils literal"><span class="pre">$BZR_EDITOR</span></tt> 環境変数がそれらすべてを上書きします。 もし何も変更せずにエディタを閉じたなら、コミットはキャンセルされます。</p> <p>エディタで開かれるファイルには水平線が含まれています。この線より下の部分は参考用であり、コミットメッセージには含まれません。 水平線の下にはコミットで変更されるファイルのリストが表示されます。 メッセージは水平線の上に書く必要があります。そうしたら、ファイルを保存してエディタを終了してください。</p> <p><tt class="docutils literal"><span class="pre">commit</span></tt> コマンドに <tt class="docutils literal"><span class="pre">--show-diff</span></tt> オプションをつけると、コミットされる変更の diff を見ることができます。この diff はエディタが開いたときに水平線やコミットされるファイルの情報よりも下に含まれます。 なので、コミットメッセージを書くときに diff を見ることができますが、コミットメッセージ自体には diff が含まれません。 コミットメッセージに diff を含めたい場合は、水平線より上にコピーペーストしてください。</p> </div> <div class="section" id="id14"> <h3>選択コミット<a class="headerlink" href="#id14" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>commit コマンドにファイル名やディレクトリ名を渡したとき、それらのファイルの変更だけがコミットされます。 例</p> <div class="highlight-python"><pre>% bzr commit -m "documentation fix" commit.py</pre> </div> <p>デフォルトでは bzr は、サブディレクトリから実行される場合でもすべての変更をコミットします。 カレントディレクトリ以下だけをコミットする場合は、次のようにします</p> <div class="highlight-python"><pre>% bzr commit .</pre> </div> </div> </div> <div class="section" id="id15"> <h2>コミットされていない変更を削除する<a class="headerlink" href="#id15" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>不要な変更がある場合、 <strong>revert</strong> コマンドで最後のリビジョンの状態に戻ることができます。 revert するまえに <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></tt> で何が削除されるのかを確認しておくと良いでしょう。 デフォルトでは revert コマンドはツリー全体を revert します。ファイル名やディレクトリ名が指定されている場合は、そのファイルだけが revert されます。 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span></tt> はマージ待ちリビジョンのリストも削除します。</p> </div> <div class="section" id="id16"> <h2>ファイルを無視する<a class="headerlink" href="#id16" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="bzrignore"> <h3>.bzrignore ファイル<a class="headerlink" href="#bzrignore" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>多くのソースツリーはバージョン管理する必要のないファイルをたくさん含んでいます。 たとえば、エディタのバックアップファイルや、オブジェクトファイル、バイトコード、 ビルドされたプログラムなどです。 こういったファイルを単に add しないこともできますが、そうすると毎回 unknown file としてたびたび出現することになります。 ツリートップにある <tt class="docutils literal"><span class="pre">.bzrignore</span></tt> とよばれるファイルにそれらのファイルを追加することで、bzrにそれらのファイルを無視させることができます。</p> <p>このファイルは行ごとにワイルドカード (もしくは”glob”) のリストを含みます。 典型的な内容の例です:</p> <div class="highlight-python"><pre>*.o *? *.tmp *.py[co]</pre> </div> <p>glob がスラッシュを含む場合、ツリーのトップからのパス全体にマッチします。 そうでない場合は、単にファイル名にマッチします。 なので、上の例はすべてのサブディレクトリの <tt class="docutils literal"><span class="pre">.o</span></tt> 拡張子を持つファイルを無視しますが、次の例ではツリーのトップにある <tt class="docutils literal"><span class="pre">config.h</span></tt> ファイルと、 <tt class="docutils literal"><span class="pre">doc/</span></tt> ディレクトリ以下のHTMLファイルだけを無視します:</p> <div class="highlight-python"><pre>./config.h doc/*.html</pre> </div> <p>どのファイルがどのパターンにマッチして無視されているのかを、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">ignored</span></tt> コマンドで表示することができます:</p> <div class="highlight-python"><pre>% bzr ignored config.h ./config.h configure.in? *?</pre> </div> <p>バージョン管理されているファイルが無視パターンにマッチしたり無視リストに入っていても大丈夫です。無視パターンはバージョン管理されたファイルには影響しません。バージョン管理されていないファイルを ‘unknown’ として扱うか’ignored’ として扱うかを決めるためだけに使われます。</p> <p><tt class="docutils literal"><span class="pre">.bzrignore</span></tt> ファイルは普通はバージョン管理されます。なのでそのブランチのコピーでも同じパターンが無視されます。</p> <div class="highlight-python"><pre>% bzr add .bzrignore % bzr commit -m "Add ignore patterns"</pre> </div> </div> <div class="section" id="id17"> <h3>グローバルの無視設定<a class="headerlink" href="#id17" title="このヘッドラインへのパーマリンク">¶</a></h3> <p>エディタの一時ファイルや個人の一時ファイルなど、幾つかの無視ファイルはプロジェクト依存ではなくてユーザー依存です。 こういったファイルを全プロジェクトで無視設定するかわりに、グローバルの無視設定ファイル <tt class="docutils literal"><span class="pre">~/.bazaar/ignore</span></tt> を利用できます。 これはプロジェクトの ignore ファイルと同じ文法で記述します。</p> </div> </div> <div class="section" id="id18"> <h2>履歴を閲覧する<a class="headerlink" href="#id18" title="このヘッドラインへのパーマリンク">¶</a></h2> <div class="section" id="bzr-log"> <h3>bzr log<a class="headerlink" href="#bzr-log" title="このヘッドラインへのパーマリンク">¶</a></h3> <p><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></tt> コマンドは過去のリビジョンのリストを表示します。 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span> <span class="pre">--forward</span></tt> コマンドは同じ内容を、時系列順で最新のものが最後にくるように出力します。</p> <p><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">diff</span></tt> と同じように、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">log</span></tt> も <tt class="docutils literal"><span class="pre">-r</span></tt> 引数をサポートします:</p> <div class="highlight-python"><pre>% bzr log -r 1000.. # リビジョン r1000 とそれ以降すべて % bzr log -r ..1000 # r1000 とそれ以前のすべて % bzr log -r 1000..1100 # r1000 から r1100 まで % bzr log -r 1000 # リビジョン r1000 だけ</pre> </div> </div> </div> <div class="section" id="id19"> <h2>ブランチの情報<a class="headerlink" href="#id19" title="このヘッドラインへのパーマリンク">¶</a></h2> <p><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">info</span></tt> コマンドは作業ツリーとブランチの履歴に関する情報の要約を表示します。</p> </div> <div class="section" id="id20"> <h2>ディレクトリをバージョン管理する<a class="headerlink" href="#id20" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>bzr はファイルとディレクトリを、名前の変更を追跡して賢くマージできるようにバージョン管理します:</p> <div class="highlight-python"><pre>% mkdir src % echo 'int main() {}' > src/simple.c % bzr add src added src added src/simple.c % bzr status added: src/ src/simple.c</pre> </div> </div> <div class="section" id="id21"> <h2>ファイルを削除する<a class="headerlink" href="#id21" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>ファイルを削除するのは、単純に作業ツリーからファイルを削除するだけでできます。 これは、 <tt class="docutils literal"><span class="pre">cvs</span> <span class="pre">remove</span></tt> が必要な CVS とは少し異なります。</p> <p><tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">remove</span></tt> はファイルをバージョン管理対象からはずしますが、作業ツリーから削除することも削除しないこともできます。 <a class="footnote-reference" href="#id9" id="id22">[2]</a> これは間違ったファイルを追加してしまったり、あるファイルをバージョン管理するのをやめる場合に便利です。</p> <div class="highlight-python"><pre>% rm -r src % bzr remove -v hello.txt ? hello.txt % bzr status removed: hello.txt src/ src/simple.c unknown: hello.txt</pre> </div> <p>もし間違ってファイルを削除してしまった場合、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span></tt> でリストアできます。</p> </div> <div class="section" id="id23"> <h2>ブランチを作る<a class="headerlink" href="#id23" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>自分でプロジェクトを始めるのではなく、既存のプロジェクトに変更を加えたい場合があります。 この場合、既存のブランチのコピーを取得する必要があります。 このコピーは新しいブランチになるので、このコマンドは <strong>branch</strong> という名前になっています:</p> <div class="highlight-python"><pre>% bzr branch lp:bzr bzr.dev % cd bzr.dev</pre> </div> <p>これでブランチの完全な履歴をコピーできたので、すべての操作 (log, annotate, branch の作成とマージなど) をローカルで実行できます。 履歴の一部だけを取得するオプションも追加される予定です。</p> <p>既存のブランチをコピーするには、普通にディレクトリをコピーしたり、tarballを展開したり、リモートから rsync のような方法でコピーすることもできます。</p> </div> <div class="section" id="id24"> <h2>上流の変更を追いかける<a class="headerlink" href="#id24" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>変更を “pull” することで手元のブランチを上流のブランチに対して最新に保つことができます。</p> <blockquote> <div>% bzr pull</div></blockquote> <p>このコマンドを実行した後、ローカルディレクトリはpull元のミラーになります。 ミラーするものには、 ‘’revision-history’’ を含みます。つまり、別のブランチからマージするのではなくて、このブランチに対してコミットした履歴になります。</p> <p>このコマンドはローカルの(pull先)ブランチが親ブランチの古いコピーで独自のあたらしいリビジョンを一切含まないか、ローカルブランチへの最新のコミットが親ブランチにマージされているときにのみ成功します。</p> </div> <div class="section" id="id25"> <h2>関連ブランチからマージする<a class="headerlink" href="#id25" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>二つのブランチが分岐している(互いに異なる変更を持っている)とき、 <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">merge</span></tt> コマンドの出番です。 merge はマージ元ブランチにあって手元のブランチにない変更を自動で探して、その変更を手元に適用しようと試みます。</p> <div class="highlight-python"><pre>% bzr merge URL</pre> </div> <p>マージ中に衝突(conflict)が発生した場合、同じ基本名(basename)をもつ3つのファイルが作成されます。 共通の祖先になるファイルのファイル名には ”.BASE” が、 手元のブランチの変更を含むファイル名には ”.THIS” が、 マージ元の変更を含むファイル名には ”.OTHER” が末尾に追加されます。 kdiff3 のようなプログラムを利用してこれらのファイルをひとつにマージすることができます。 コミットするには、マージされた ”.THIS” ファイルを元のファイル名にリネームします。 衝突の解決を完了するには、 resolve コマンドを使います。 このコマンドは ”.OTHER” と ”.BASE” ファイルを削除します。 .BASE, .THIS, .OTHER ファイルが残っている場合、 commit コマンドはエラーを報告します。</p> <div class="highlight-python"><pre>% kdiff3 file.BASE file.OTHER file.THIS % mv file.THIS file % bzr resolve file</pre> </div> <p>[<strong>TODO</strong>: explain conflict markers within files]</p> </div> <div class="section" id="id26"> <h2>ブランチを公開する<a class="headerlink" href="#id26" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>bzrのブランチを公開するには特別なサーバーは必要ありません、普通のWebサーバーが使えます。 .bzr ディレクトリを含めてファイルをサーバーにミラーしてください。 ブランチをpush(やブランチに対する操作)するのに以下の3つの方法があります。</p> <ul> <li><p class="first">最良の方法は bzr 自体を使うことです。</p> <div class="highlight-python"><pre>% bzr push sftp://servername.com/path/to/directory</pre> </div> </li> </ul> <ul class="simple"> <li>別の選択肢は bzrtools に含まれる <tt class="docutils literal"><span class="pre">rspush</span></tt> プラグインを利用することです。 これはリモートの履歴と作業ツリーに変更を push するのに rsync を利用します。</li> </ul> <ul class="simple"> <li>手動で、 tarball を送ったり rsync を使ったりほかの転送方法を利用してファイルを送ることで</li> </ul> </div> <div class="section" id="id27"> <h2>変更をツリー間で移動する<a class="headerlink" href="#id27" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>どんな人にでもありえることですが、適切ではないツリー上で変更してしまうことがあります。 単純に作業するディレクトリを間違えたり、変更がよそうよりも大きくなってしまったりして、 その変更のために新しいブランチを作りなおすことがあります。</p> <p>変更をあるツリーから別のツリーに移動するには</p> <div class="highlight-python"><pre>% cd NEWDIR % bzr merge --uncommitted OLDDIR</pre> </div> <p>これですべてのコミットされていないOLDDIR上の変更がNEWDIRに適用されます。 コミットされていない変更は、通常のmergeでNEWDIRに適用することができる場合でも適用されません。 OLDDIR上の変更はそのまま残りますが、NEWDIRの状態に満足したら <tt class="docutils literal"><span class="pre">bzr</span> <span class="pre">revert</span> <span class="pre">OLDDIR</span></tt> で削除することができます。</p> <p>NEWDIRはOLDDIRのコピーである必要はありませんが、関連しているべきです。 両者の違いが大きければそれだけ衝突が起こる可能性が大きくなります。</p> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <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></li> <li><a class="reference internal" href="#id2">バージョン管理の目的</a></li> <li><a class="reference internal" href="#id3">分散バージョン管理と分散でないバージョン管理の違い</a></li> <li><a class="reference internal" href="#id4">Bazaarに自己紹介する</a></li> <li><a class="reference internal" href="#id7">ブランチを作る</a></li> <li><a class="reference internal" href="#id10">ブランチの場所</a></li> <li><a class="reference internal" href="#id11">変更をレビューする</a><ul> <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="#id12">変更をコミットする</a><ul> <li><a class="reference internal" href="#bzr-commit">bzr commit</a></li> <li><a class="reference internal" href="#id13">エディタからメッセージを入力する</a></li> <li><a class="reference internal" href="#id14">選択コミット</a></li> </ul> </li> <li><a class="reference internal" href="#id15">コミットされていない変更を削除する</a></li> <li><a class="reference internal" href="#id16">ファイルを無視する</a><ul> <li><a class="reference internal" href="#bzrignore">.bzrignore ファイル</a></li> <li><a class="reference internal" href="#id17">グローバルの無視設定</a></li> </ul> </li> <li><a class="reference internal" href="#id18">履歴を閲覧する</a><ul> <li><a class="reference internal" href="#bzr-log">bzr log</a></li> </ul> </li> <li><a class="reference internal" href="#id19">ブランチの情報</a></li> <li><a class="reference internal" href="#id20">ディレクトリをバージョン管理する</a></li> <li><a class="reference internal" href="#id21">ファイルを削除する</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> </ul> </li> </ul> <h4>前のトピックへ</h4> <p class="topless"><a href="../mini-tutorial/index.html" title="前の章へ">5分でわかるBazaar</a></p> <h4>次のトピックへ</h4> <p class="topless"><a href="using_bazaar_with_launchpad.html" title="次の章へ">LaunchpadでBazaarを使う</a></p> <h3>このページ</h3> <ul class="this-page-menu"> <li><a href="../_sources/tutorials/tutorial.txt" rel="nofollow">ソースコードを表示</a></li> </ul> <div id="searchbox" style="display: none"> <h3>クイック検索</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="検索" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> モジュール、クラス、または関数名を入力してください </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="using_bazaar_with_launchpad.html" title="LaunchpadでBazaarを使う" >次へ</a></li> <li class="right" > <a href="../mini-tutorial/index.html" title="5分でわかるBazaar" >前へ</a> |</li> <li><a href="../index.html">目次 (2.2.4)</a> »</li> <li><a href="index.html" >チュートリアル</a> »</li> </ul> </div> <div class="footer"> © Copyright 2009, Canonical Ltd. このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7 で生成しました。 </div> </body> </html>