The Hackerlab at regexps.com

基本ブランチ -- 私的な変更の保守

up: arch Meets hello-world
next: パッチログとプロジェクトツリーの履歴
prev: 選択的なファイルのコミット

本章で調べはじめることは ブランチの概念についてです. これは他のリビジョン管理システムですでに良く知ってる人もいることでしょう.

そうであれば, arch のブランチが, いままで慣れ親しんでいたものをはるかに越えていることに気づくでしょう.

この概念を良く知ってるかどうかに係わらず, 不安にならないでください. ゆっくりと始めていきます:

ブランチの大筋 -- 私的な変更の必要性

さしあたり仮定することは, hello-world プロジェクトが公開の読み出し専用ミラーとして, そのソースを利用可能にしていることです (共有, 公開アーカイブを参照).

最初に、(hello-world プロジェクトに関係のない) あなたは彼らのプログラムを使用したいが、いくつかの私的な変更を加える必要があるだろうと決心します。

おもちゃの例として, あなたの環境では hello world では承知しがたい、より正しく句読点を付け hello, world としたいと要求したとします.

さて、ここで問題があります: 確かに、それらのソースをダウンロードして変更することはできます. しかし同時に, プロジェクトは動き続けます。変更が起き続けるでしょう。 だから, 繰り返しそれらの最新のソースをダウンロードし、 最新版にあなたの修正をコピーするという永遠の労役に直面することになります。

arch は、その作業の自動化を助けることができます. 本章でその方法を説明します。

リモートプロジェクトからローカルアーカイブの中にブランチを作る

以下の事例では、あなたの役を変えます. hello-worldプロジェクトのプログラマである アリスまたはボブを"演じる"代わりに、 あなたは, 第三者のプログラマ, キャンディスを演じることになります。

キャンディスに自分用のアーカイブを与えて、 それをデフォルト・アーカイブにすることから始めましょう:


        % tla make-archive candice@candice.net--2003-candice \
                             ~/{archives}/2003-candice

        % tla my-default-archive candice@candice.net--2003-candice
        default archive set (candice@candice.net--2003-candice)


(これらのコマンドを復習するには 新規アーカイブの作成 を読んでください.)

キャンディスは自分のアーカイブで hello-world プロジェクトを作成する必要があります。 彼女は次のコマンドを使えます:


        % tla archive-setup  hello-world--candice--0.1


彼女はアリスとボブが使用しているものと同じプロジェクト名を使用しなけらばならないというわけではありません. 実際, この場合彼女は異なるブランチ名を選びました. (それらのコマンドを調べるには, 新規プロジェクトの開始を見てください)

アリスとボブが彼らのアーカイブを作った時、最初のリビジョンを作成するために import コマンドを使いました。 私たちは、ブランチを作っているので、別のコマンドを使います.

例として、キャンディスの出発点は, アリスとボブのアーカイブの patch-1 リビジョンだとします:


    % tla tag \
        lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1 \
        hello-world--candice--0.1
    [....]


いくつか注意すべきことが, このコマンドにはあります.

まず、アリスおよびボブの patch-1 リビジョンの参照のために、 私たちは完全修飾リビジョン名 (fully qualified revision name)を使用したことに注意してください。 理由はそのリビジョンが現在のデフォルトアーカイブ以外のアーカイブにあるからです. (いくつかのアーカイブでいちどに作業するを参照)

次に、patch-1 リビジョンを明示的に指定したことを注意してください。 もし --patch-1 を付けない場合, tag コマンドが仮定することは, アリスおよびボブのアーカイブで最新のリビジョン (patch-3となります) を指すことです.

どのタグがそれを行ったか

tag を使った後で, キャンディスは彼女のアーカイブに新しいリビジョンを持っています:


   % tla revisions --summary hello-world--candice--0.1
   base-0
       tag of lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1



彼女は、ふつうのやりかたでそのリビジョンを取得できます:


   % tla get hello-world--candice--0.1 hw-candice
   [...]

   % ls hw-candice
   hw.c         main.c          {arch}


しゃれた arch の機能: 例をよく追うと, キャンディスは, 別のアーカイブに格納された arch のリビジョンから, 彼女のアーカイブにブランチを作ったことに気付くはずです. この例では, たまたま両方ともローカルなファイルシステム上にありましたが, その必要はありません: もしキャンディスがアリスとボブのアーカイブを ネットワーク経由でアクセスしていたとしても, 彼女のブランチは作成できます.

使用上の注意: キャンディスの作業はまだ終わってません. 次節で彼女が恐らくとりたい次の段階を説明します。

タグリビジョンのキャッシュ

キャンディスは tag を使ってアリスとボブのアーカイブからブランチを作りました. 彼女が get を使ってそのリビジョンをチェックアウトする場合に何が起るでしょうか? おおざっぱに言えば、arch はリビジョンがブランチであることに 気づきます. そして, アリスとボブのアーカイブを参照して実際にソースを取得します.

すると, 次の疑問が出てきます: もしアリスとボブのアーカイブが "なくなっちゃた"らどうなるでしょう. そうなれば, キャンディスはもはや彼女のブランチから get できなくなるでしょう.

彼女のアーカイブにそのリビジョンを構築するのに必要な情報を全て キャッシュすることで, この問題は解決できます.


   % tla cacherev hello-world--candice--0.1--base-0
   [...]


そして、それが次のように働いたことを確認します:


   % tla cachedrevs hello-world--candice--0.1
   hello-world--candice--0.1--base-0


その後、arch はキャンディスの base-0 リビジョンを取得するのに、もはや, アリスとボブのアーカイブには依存しません。

新ブランチの探索

以前に、キャンディスは彼女のブランチを作成し, get を使用してチェックアウトしました。 そのツリーを探索しましょう:


        % cd ~/wd/hw-candice

        % tla log-versions
        candice@candice.net--2003-candice/hello-world--candice--0.1
        lord@emf.net--2003-example/hello-world--mainline--0.1


キャンディスのツリーがアリスとボブのバージョン、および自分のブランチのためのパッチログを持っていることに注意してください:


    % tla logs --summary \
            lord@emf.net--2003-example/hello-world--mainline--0.1
    base-0
        initial import
    patch-1
        Fix bugs in the "hello world" string


    % tla logs --summary hello-world--candice--0.1
    base-0
        tag of \
        lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1



キャンディスのブランチ上では、以降はなんの変更もされていません:

        % tla missing hello-world--candice--0.1
        [出力無し]

しかし、アリスとボブが patch-3まで既に至っていることを思い出してください:

        % tla missing -A lord@emf.net--2003-example \
                hello-world--mainline--0.1
        patch-2
        patch-3

ローカルに変更する

初めの tag の後に、 キャンディスは通常の方法で彼女のブランチの変更をコミットすることができます。

hw.c を編集して, 以下のようになったとします (抜粋):


        % cat hw.c
        [...]
        void
        hello_world (void)
        {
          (void)printf ("hello, world\n");
        }
        [...]


そして彼女がログメッセージを準備したとします:


    % cat ++log.hello-world--candice--0.1--lord@emf.net--2003-candice
    Summary: Punctuated the output correctly
    Keywords: 


    This program should say "hello, world" not "hello world".


今、彼女は単に普段通りにコミットして, 自身の patch-1 リビジョンを作ることができます:


   % tla commit
   [....]

   % tla revisions --summary hello-world--candice--0.1
   base-0
       tag of \
       lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1
   patch-1
       Punctuated the output correctly


ブランチ元のバージョンからの更新

その間に、アリスとボブは彼らの patch-2 および patch-3リビジョンを作りました。 どのようにすれば, キャンディスは彼女のブランチにこれらの変更を加えることができるでしょう。

ええと, 実際, archでは多くのやりかたがあります. 既に紹介した, updatereplayコマンドを 使うこともできます. この例では、replayを使ってみます.


        % cd ~/wd/hw-candice

        % tla replay -A lord@emf.net--2003-example \
                hello-world--mainline--0.1
        [...]


注意してほしいことは, 引数 -A を使ってどのアーカイブからの変更を replay するのか指定したことと, バージョン番号を使ってどの変更が必要かを指定したことです. この場合, replaypatch-2patch-3 のチェンジセットをキャンディスのツリーに適用しました.

ここで replayを使ったことは, 一種の マージ (merging)です: キャンディスのローカルな変更は, Alice と Bob の mainline の変更とマージされました.

学習上の注意: この例をたどるときは, hw.c を調べ, キャンディスが変更した printf の文字列と, Alice が加えた "copywrong" を注目すべきです; 両方が反映されてることに注意してください.

学習上の注意: また、キャンディスの patch-1リビジョンの別のコピーをチェックアウトして, 同様のマージの実験を, replay の代わりに update を使ってするべきです. 正確なオプションや与える引数を確認するには tla update -help を見なければならないかもしれません。

さらに注意して欲しいのは, ここまでで変更したのが キャンディスのプロジェクトツリーだけだということです. これらはキャンデスのアーカイブにはチエックインされてません. 彼女のアーカイブにマージを実際に記録するには, ログメッセージを作り 普段通りにコミットする必要があります (変更物のチェックインを参照).

しかし、もう一つ便利な点を指摘します. キャンディスがログメッセージを書く時、恐らくマージの起きた場所とそれが含むものを記録したいでしょう. arch には、出力がそのようなログメッセージに含めるのに理想的な出力をするコマンドがあります:


  % cd ~/wd/hw-candice

  % tla log-for-merge
  Patches applied:

    * lord@emf.net--2003-example/hello-world--mainline--0.1--patch-3
       added copywrong statements

    * lord@emf.net--2003-example/hello-world--mainline--0.1--patch-2
       commented return from main


それはどのように動作するか -- タグと基本的なブランチ

tag は何をしたのか? キャンディスのアーカイブを見ましょう:


        % cd ~/{archives}
        % cd 2003-candice
        % cd hello-world
        % cd hello-world--candice
        % cd hello-world--candice--0.1

        % ls
        +version-lock   base-0          patch-1
        patch-2


特に興味深いのは base-0リビジョンです -- これを生成したのは tagです:


        % cd base-0

        % ls
        CONTINUATION
        hello-world--candice--0.1--base-0.patches.tar.gz
        hello-world--candice--0.1--base-0.tar.gz
        log

        % cat CONTINUATION
        lord@emf.net--2003-example/hello-world--mainline--0.1--patch-1


ファイル CONTINUATION はこのリビジョンが tag リビジョンであることを識別します. その内容から, どのリビジョンからブランチしたかがわかります.

このリビジョンに対応するチェンジセット (... patches.tar.gz)も tag によって作成されました。 そのチェンジセット (get-patchshow-changeset を思い出して下さい)を調査すれば、それが行っていること全ては、ツリーのパッチログへのログエントリーを加えることであると言うことを理解するでしょう。

ソースファイル (...base-0.tar.gz)は archive-cache-revision によって作成されました。 それは、キャンディスの base-0 リビジョンの完全なコピーを含みます. ファイルがそこにあるので、 get はこのリビジョンを構築するのにアリスとボブのアーカイブを見る必要はありません.

arch Meets hello-world: A Tutorial Introduction to The arch Revision Control System
The Hackerlab at regexps.com