目次
前の章では一人で一つの開発ラインをバージョン管理するのに必要 な基本的なコマンドについて一通り見てきた。主に基本的なコマンドの紹 介をすることが目的であったため、ファイルの個数も、ごく少数の構成に とどめた。この章では、すでに別の方法で管理されているソースファイル を GNU arch 管理下に置いたり、たくさんのソースファイルから構成され る未管理のディレクトリをGNU arch管理下に置く方法について説明する。 基本的には前章の応用だが、たくさんのファイルを一度にインポートしよ うとすると、ファイルタイプ識別やインベントリ識別からくるエラーでう まくいかないことが多くなる。そこで前半では GNU arch 特有の概念 「インベントリ」について詳しく説明し、インベントリタグ とファイルのアイデンティティー、タグづけの方法などとの関係について 議論する。そして後半でこの応用として既存のプロジェクトを GNU arch 管理下に 2 通りの方法でインポートしてみる。この章を理解すれば、な ぜある場面であるファイルがソースファイルと認識されたり、そうならな かったりするのか、また、明示的なタグ付けの方法ではなぜファイル名称 の変更に注意しなくてはならないのか、また arch-tag: がなぜ必要なの かを明らかになるだろう。
あるプロジェクトツリーをアーカイブバージョンの最初のリビジョ ンとしてインポートしたり、その後プロジェクトツリーに加えた変更点を 直前のリビジョンからの差分としてコミットしたりする時点で、GNU arch は常に前のリビジョンの内容と比較して、プロジェクトツリーに何が起き たかをスキャンする。プロジェクト中のあるファイルには変更が加えられ ているかも知れないし、新しいファイルが追加されたり既存のファイルが 削除されていたり、別のサブディレクトリに移動していたりすることもあ るだろう。GNU arch はプロジェクトツリー中のすべてのファイルを管理 対象にするわけではない。ある決まった規則にしたがっているファイルだ けをバージョン管理対象ファイルとみなす。あるファイルがGNU arch の 管理対象であるかどうかは、3種類のテストによって決められる。最初に ファイル名称がどんな形をしているかのチェック、二番目に、ファイルに 正しく「インベントリ」が振られているかのチェックだ。「インベントリ」 と「非認識」という言葉が説明なしに出てきたが、これについても順を追っ て説明していく。
二つのチェックは設定によってかなり自由に変更することができる。 設定は、主にプロジェクトツリーの{arch} 管理領域にある =tagging-method という定義ファイルの内容によって決まるが、それ以外 の情報も関係してくる。=tagging-method ファイルは tla init-tree コ マンドを発行してあるツリーを最初にプロジェクトツリーにした時点で、 このファイルの内容はデフォルト値に初期化される。
最初は、ファイルタイプのチェックだ。GNU arch はファイルを 以下の 6 種類に分類する決まりがある。プロジェクトツリー中のどの ファイルも、必ず以下の 6 種類のどれかに分類されます。このような 複雑な分類には、それぞれきちんとした意味があると考える人もいるが、 少なくとも最初のうちはあまり深く掘り下げず、そのようなものだと考 えると良いと思う。必ず覚える必要はないものだが、覚えようと思う人 は不規則動詞の変化を覚える方の脳みそで覚えよう。いろいろな名前が ついているが、言葉の意味を深追いせず、単にグループ1, グループ2 ... グループ 6 の別名だと考えても良いかも知れない。グループ 4 の ソースファイルが、主なバージョン管理対象となる。
ゴミファイル、 たとえば作業用に一時的に使う中間ファイルなどを分類することを 狙っている。主にディレクトリごとにある .arch-inventory ファ イル、または=tagging-method ファイルの、junk 正規表現で設定 するが、',,' で始まるファイルは常にジャンクと見なされる。
管理対象で はないが、GNU arch が注意して扱う必要のあるファイル。エディ タの作るバックアップファイルなどを分類することを狙っている。 ディレクトリごとにある.arch-inventory ファイル、または =tagging-method ファイルの、backup 正規表現で設定する。
管理対象では ないが、GNU arch が注意して扱う必要のあるファイル。バックアッ プファイルとは少し違った扱いをするため、別のグループとして定 義されている。主に ディレクトリごとにある .arch-inventory ファ イル、または=tagging-method ファイルの、precious 正規表現で 設定するが、'++' で始まるファイルは常にプレシャスと見なされ る。precious は「貴重な」という意味。
管理対象となるファ イル。常にバージョン管理対象ファイルと見なされる。ディレクト リごとにある .arch-inventory ファイル、または=tagging-method ファイルの source 正規表現で設定する。
管理対象に含めない ことを明示的に指定するために設定する。GNU arch はデフォルト では import や commit 時に非認識ファイルが一つでもツリー中に 存在するとエラーとする。このようなファイルを明示的に除外ファ イルに加えることでエラーを回避することができる。除外ファイル はディレクトリごとにある .arch-inventory ファイル、または =tagging-method ファイルの exclude 正規表現で設定する。
上記のどれにも当 てはまらないファイルは、非認識ファイルとして「認識」される。 非認識ファイルが存在する場合には、原則として GNU arch は import や commit でエラーを発する。あるパターンに合うファイ ルを明示的に非認識ファイルとして「認識」させるには、ディレク トリごとの .arch-inventory ファイル、または =tagging-method ファイルの unrecognized 正規表現で設定することもできる。
プレシャスはどのような意味で削除されないのか。junk はど のようなタイミングで削除されるのか、などなど。
どのファイルがどのグループに属するかは主に =tagging-method ファイルで行なう。ディレクトリごとに .arch-inventory ファイ ルを設定することもできるが、話が煩雑になるので GNU arch に慣れ るまではあまり使わないほうが良い。
インベントリチェックは、第一のチェックでソースファイルに分 類されたファイルが、正しいインベントリidを持っているかどうかを調 べる。インベントリidについてはあらためて説明するが、ここでは、ソー スファイルを区別するための「キー」だと考えてほしい。GNU arch で は、ファイル名の違いによってファイル同士を区別する場合のほかに、 この「キー」の一致不一致によって二つのファイルの起源が同一のもの かどうかを判断する場面があるので、ソースファイルはかならずインベ ントリid を持たなくてはならない。
インベントリid はインベントリidを計算するための元になる情 報を、あらかじめ保持しているさまざまな情報から計算する。保持情報 は大きく三つの場所に分類される。
ファイル名そのもの
ファイルの内部
ファイルの外部
ファイルの内部の保持情報は、特殊な文字列をファイルの先頭ま たは末尾のほうに埋め込むことで表す。具体的には arch-tag: という 文字列を書き、その後に文字列を続けることで表す。この文字列のこと を arch タグと呼ぶ。arch タグの行は、本来そのファイルが表現しよ うとする内容とは無関係だ。たとえばこのファイルが C 言語のソース コードであったとしても、そのソースコードでやろうとしている目的と は何の関係もない。arch タグはファイルの中にありながら、そのファ イル自身に関係した付加情報を表現する。このような情報のことを「メ タ情報」と呼んだりすることもある。arch タグを埋め込むファイルが プログラムのソースコードのようなものである場合、arch-tag: の行が 問題を起こさないように、それぞれの言語のコメントの中に書く必要が ある。たとえば C 言語なら:
/* arch-tag: Tez Kamihira Fri Apr 16 16:15:11 JST 2004 (foo.c) */
シェルスクリプト、Perl, Python のような言語なら:
# arch-tag: Tez Kamihira Fri Apr 16 16:15:11 JST 2004 (foo.c)
Pascal なら:
{ arch-tag: Tez Kamihira Fri Apr 16 16:15:11 JST 2004 (foo.c) }
htmlやXML なら:
<!-- arch-tag: Tez Kamihira Fri Apr 16 16:15:11 JST 2004 (foo.c) -->
のようになる。言語ごとの arch-tag: のサンプルについて は補遺にまとめた。
arch-tag: に利用する文字列はまったくの任意だが、すでにプロ ジェクトツリー中に存在している別のファイルのタグと重複してはいけ ない。これに違反すると import や commit 時に GNU arch はエラーを 出す。プロジェクトに新しくファイルを追加するときに、既存のファイ ルをもとにしようとコピーしたような場合によくおこる。この場合には 新しいファイルの arch-tag: の部分だけを重複しないような文字列に 変更してやるだけでエラーは表示されなくなる。
重複しないような文字列をいちいち考えずに作り出す方法がある と便利だ。GNU arch コミュニティーのメンバーは、おおきく二つの流 儀でこれをやることが多いようだ。一つはいまいくつかの例で示したよ うな、名前、現在の時刻をしめす文字列、それからこのファイルの現時 点での名前、これらを組み合わせた文字列だ。もう一つは UUID と呼ば れる文字列を利用する方法だ。UUIDについては補遺に詳しく書いた。C 言語で UUID を使ってタグを振ると、たとえば以下のようになるだろう:
/* arch-tag: 9d3a97ec-dc74-445f-bcf0-234ebb054702 */
ファイルの外部の保持情報は、ファイルのあるディレクトリの、. arch-ids という名前のディレクトリに保存される。ところで GNU arch では、ディレクトリにもインベントリidをつけることができる。ディレ クトリは通常のファイルと違って、内部タグを使うことができないので、 必然的に外部タグを使って表現することになる。ディレクトリの外部タ グ情報は、やはりそのディレクトリの .arch-ids ディレクトリに保存 される。
外部タグの設定は tla add-id コマンドと、tla explicit-default コマンドで行う。tla add-id コマンドはファイルご との個別の外部タグを設定するのに利用され、tla explicit-defaultコ マンドはあるディレクトリにあるファイル全体に対する既定値に関係し た情報を設定する。tla add-id で振られる個別の外部タグは、対象と なるファイルの名前を foo としたとき、.arch-ids/foo.id というファ イルに保存される。たとえば hello.c というファイルには .arch-ids/hello.c.id が、index.html というファイルには . arch-ids/index.html.id がそれぞれ保存領域になる。ファイルの中に は、実際のインベントリid の元になる文字列がある。すでに説明した とおり、インベントリidは他と区別がつく文字列であれば十分なので、 tla add-id コマンドで特に明示的な指定をしない限り、GNU arch が自 動的に重複しないような文字列を設定してくれる。具体的にはさきほど 説明した第一の方式に近い文字列が生成されるのだが、ほとんどのユー ザにとってはその具体的な形にはあまり興味がないだろう。tla add-id コマンドはまた、ディレクトリ用の外部タグ情報を作ることもできる。 これは、ディレクトリを d とすれば、つねに d/.arch-ids/=id という 名前のファイルに保存するという決まりがある。これはファイルと同じ ように d/.arch-ids/d.id という名前にしてしまうと、このディレクト リ中にある通常ファイル d のタグと区別がつかなくなってしまうから だ。
あるディレクトリにあるファイルすべてに外部タグを設定せずに 既定値を一つだけ設定できると便利だ。これには tla explicit-default コマンドを使う。デフォルト値には、強いデフォル ト値と呼ばれるものと、弱いデフォルト値と呼ばれるふたつの値がある。 tla explicit-default コマンドはこの両方を個別に設定することがで きる。強いデフォルト値は、このディレクトリにあるファイルすべてに 対して適用される。弱いデフォルト値は、このディレクトリにあるファ イルで、内部タグを持たないものに対してのみ適用される。
では、内部タグと外部タグのどちらがどのような場面で利用され るのだろうか? 以下ではこの判断の詳細について述べる。
一つのファイルに関係した複数の保持情報が存在することがある ので、インベントリidを決めるには、この中のどの情報を使うべきか、 また利用できる複数の情報があるとき、どの情報を他に優先して利用す べきかを決めなくてはならない。この優先規則のことをタグづけの方法 と言う。タグづけの方法には以下の三種類がある。
explicit
tagline
names
GNU arch システムでは「タグ」という言葉がまったく違った 二つの意味で利用される。一つはここで取り扱っているインベントリ idを決めるタグづけの方法。もう一つは GNU arch のバージョンを分 岐させるときに利用する tla tag コマンドだ。両者を区別して混乱 しないようにしてほしい。
タグづけの方法は、tla id-tagging-method コマンドによって設 定することができる。tla 1.2 ではデフォルトでは explicit の方法を 利用するようになっているので、他の二つの方法を利用する場合にはこ のコマンドで変更してやる必要がある。タグづけの方法は初期インポー ト後でも自由に変えることができるし、変更によって管理対象ファイル を失うことはないが、てを触れていないファイルが削除され、また追加 されたような記録が残ることもあるので初期インポート時までに適切な 形に設定することを推奨する。