すでに述べたように GNU arch には非常に原始的なたくさんのコマ ンドがある。これは Unix コマンドのようにパイプライン上などで組み合 わせて利用することを前提として作られたプリミティブがたくさんあるか らだ。これは融通が利く反面、利用しはじめた人にとってはどれとどれを どのように組み合わせれば作業が楽になるかがはっきりしない。実践的な ワークフローを作るにはノウハウがいる。ここではそのような「必殺技」 の数々をおめにかけよう。
人生をやり直したい。残念ながらそんな深刻な君の悩みに対して 私は何もできないが、君のアーカイブバージョンについてならまかせて ほしい。いま、A/C--B--V--patch-10 をコミットした直後のプロジェク トツリーにいるとする。A/C--B--V--patch-8 に戻って、それをそのま ま A/C--B--V--patch-11 としてコミットしたい。ここでのポイントは tla replay コマンドの --reverse オプションで時間を逆向きに進むと いうものだが、パッチログも patch-8 の状態に戻ってしまう関係でそ のままではコミットできない。そこで最後に sync-tree を、お見舞い する。最初の undo はプリスティンからの変更があったときのことを考 えて一応バックアップしてみたということ。
$ tla undo $ tla replay --reverse patch-10 $ tla replay --reverse patch-9 $ tla sync-tree patch-9 $ tla sync-tree patch-10 $ tla commit -L'hello my new world.' $
チェンジセット patch-10 は、patch-9 と patch-10 をつなぐも のであることに注意。つまりチェンジセットの逆向きの適用は後のリビ ジョン名を指定すればうまくいく。
今いる A/C--B--V--patch-5 のプロジェクトツリーの分岐を作っ てそちらで作業を続けたい。たとえば、ちょっとした実験的な機能を思 いついたから、分岐を作ってそっちで実験してみたいが、もともとの開 発ラインをその作業で汚したくない。普通ならこうやる:
$ tla -S tag A/C--B--V--patch-5 A1/C1--B1--V1 $ cd [これからサブディレクトリを作るどこかのディレクトリ] $ tla get A1/C1--B1--V1 $
これだとそれまでいたプロジェクトツリーとは別のディレクトリ を用意してそちらに移る必要がある。こんなこと年中やるような処理で もないし、いいじゃないかという気もするのだが、君はそれすら面倒だ と言う。このようなものぐさこそ、フリーソフトウェアの輝かしい歴史 の原動力になるのだと君は理屈を言う。よろしい。私にまかせたまえ。 君はいまプロジェクトツリーにいることが前提になる。
$ tla -S tag A/C--B--V--patch-5 A1/C1--B1--V1 $ tla join-branch A1/C1--B1--V1 $ tla set-tree-version A1/C1--B1--V1 $
実はこれは私が思いついたものではない。Miles Bader のアーカ イブなどを参考にしてほしい。tla fork-tree のようなコマンドの実装 がある。
あるリモートアーカイブにあるバージョンの内容をちょっと見た くて tla get してみたが、後で本格的な分岐を作ってハックしたくなっ たとする。ところがネットワーク障害でリモートアーカイブがダウンし ていたり、いま自分がいる場所が電車の中でラップトップをいじってい るような状況で、そのアーカイブに接続できない。tla tag コマンドは リモートアーカイブにアクセスしにいこうとするので、一つ前の方法で はローカルマシンに分岐を作ることができない。さて困った。こんなと きには以下のようにすると、オフラインのまま分岐することができる。 tla rescue-tree とも呼ぶことのできる技だ。分岐先アーカイブバージョ ンを A/C--B--V とし、元アーカイブバージョンのプロジェクトツリー にいると仮定する。
$ tla undo $ tla archive-setup A/C--B--V $ tla set-tree-version A/C--B--V $ tla add-log-version A/C--B--V $ tla import $ tla redo $ tla commit -L'hehe, now switched. :)' $
実はこうして作ったアーカイブバージョン A/C--B--V は base-0 リビジョンに継続情報を持たないので厳密に言えば本当の分岐ではない。 しかし保持しているパッチログは本物の分岐と等価なので、これ以降の 親バージョンからのマージについては update/replay/star-merge いず れも問題なく動作することを確認している。継続情報は実は分岐先のパッ チログの数を減らすための最適化に関係した仕組みでしかないのだ。
tla inventory はプロジェクトツリー内部のディレクトリのトラ バースには欠かせない。君のプロジェクトを tar で固めてみよう。こ れには次のようにする。固めたファイルは一つ上のディレクトリにでき るようなサンプルにしてみた。
$ tla inventory -s | tar -T- -zcvf ../`tla tree-version`.tar.gz $
tla inventory + xargs のような組み合わせもよく利用する。 unix の find(1) でも同じことができそうに思うが、{arch}サブディレ クトリ配下がノイズになってしまう。君のプロジェクト内にあるソース ファイル全体に対して grep してみよう。
$ tla inventory -s | xargs -l grep -H 'arch-tag'
tla inventory はソースファイルだけではなく、6っつのグルー プそれぞれを列挙するオプションがあるので、応用の仕方は明らかだろ う。たとえば、「プロジェクトツリー内のバックアップ属性ファイルを すべて消す」などなど。