regexps.com
本章で調べはじめることは ブランチの概念についてです. これは他のリビジョン管理システムですでに良く知ってる人もいることでしょう.
そうであれば, 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
では多くのやりかたがあります.
既に紹介した, update
やreplay
コマンドを
使うこともできます. この例では、replay
を使ってみます.
% cd ~/wd/hw-candice % tla replay -A lord@emf.net--2003-example \ hello-world--mainline--0.1 [...]
注意してほしいことは, 引数 -A
を使ってどのアーカイブからの変更を replay するのか指定したことと, バージョン番号を使ってどの変更が必要かを指定したことです.
この場合, replay
は patch-2
と patch-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-patch
と show-changeset
を思い出して下さい)を調査すれば、それが行っていること全ては、ツリーのパッチログへのログエントリーを加えることであると言うことを理解するでしょう。
ソースファイル (...base-0.tar.gz
)は archive-cache-revision
によって作成されました。
それは、キャンディスの base-0
リビジョンの完全なコピーを含みます.
ファイルがそこにあるので、 get
はこのリビジョンを構築するのにアリスとボブのアーカイブを見る必要はありません.
regexps.com