The Hackerlab at regexps.com

ソースのインベントリ Id

up: arch Meets hello-world
next: 最初のリビジョンのインポート
prev: プロジェクトツリーのインベントリ (inventory)

注意: 険しい学習曲線: 前章と同じく、あなたが他のリビジョン管理システムを使用していたとしても、ここに紹介された概念およびコマンドはあなたには馴染みのないものでしょう。 しかしながら、一旦 "それを手に入れた"なら、全く自然なことと思えるようになります。 とりわけ, ここは, アーカイブにプロジェクトツリーを格納し始めることができるようになる前の, 最後の微妙なところです.

ソースのようなもの 対 本当のソース

前章で説明したことは, 命名規約からするとどのファイルがソースに見えるかを知る方法です:

        % tla inventory --names --source
        hw.c
        main.c

ここで新しく導入することは, 名前からはソースのようなものと, 本当のソースファイルとの, 区別です.

プロジェクトツリーをアーカイブに保存する時、arch は本当のソースファイルを格納し, 残りを無視します. どのファイルが本当のソースかを尋ねるには, inventory--names オプションを落とします:

        % tla inventory --source
        [出力無し]

もうちょっと面白くするには, arch 自身の"システムファイルとディレクトリ"を一覧に加えます:

        % tla inventory --source --all --both
        {arch}
        {arch}/.arch-project-tree
        {arch}/=tagging-method
        {arch}/hello-world
        [....]

しかし、ここで注意すべきことは, hw.cmain.c は一覧に無いことです. arch は, それらが名前だけのソースであると考えます。 次節は、それを修正するための手段を与えます. そしてそれ以降の節で実際に何が起こるかを説明します。

add コマンド

ファイルが本当のソースで, プロジェクトでアーカイブすべきことを, arch に伝えるのに使うのは, tla add コマンドです:

        % tla add hw.c
        % tla add main.c

これでましな解答を得られます:

        % tla inventory --source
        hw.c
        main.c

関連したコマンドは tla delete です:

        % tla delete hw.c

これは, ファイル hw.c 自身は削除しません:

        % ls
        hw.c            hw.c.~1~        main.c          {arch}

しかし公式なソースの一覧からは取り除かれます:

        % tla inventory --source
        main.c

例題のために, hw.c を一覧に戻す必要があります:

        % tla add hw.c

        % tla inventory --source
        hw.c
        main.c

ファイルに tla add したとき起きることを掘り下げて見てみましょう:

すべてのファイルの二つの名前

arch の世界では、プロジェクトツリーにあるすべてのファイル(とディレクトリ)は二つの名前を 持ちます: ファイルパス (file path) インベントリ id (inventory id) です.

ファイルパスは, ファイルのプロジェクトツリーのルートからの相対パスです。 それが記述することは, ソースツリー内のどこにファイルが置かれているかです.

インベントリ id は(たいてい)任意の文字列で, ツリー内のファイルに一意なものです. インベントリ id はファイルが改名されたときでも一定のままです. だから, ファイルパスがどこにファイルが置かれたかを述べる一方で, インベントリ id はそのパスに格納されたものがどのファイルかを示します.

tla add の目的はファイルにインベントリ id を割り当てることです。

例題で, id を調べることができます:

        % tla inventory --source --ids
        hw.c    x_very_long_string
        main.c  x_another_very_long_string
        ^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^
         |                |
         |           インベントリ id 
     ファイルパス

通常、ファイルが動かされたとき, ファイルパスは変化します, しかしインベントリ id は同じままであるべきです. tla moveコマンドはこれを手伝います. 次を仮定すると:

        % mv hw.c hello.c

続いて次のようにすべきです:

        % tla move hw.c hello.c

そのあとで:

        % tla inventory --source --ids
        hello.c   x_very_long_string
        main.c    x_another_very_long_string

注意して欲しいことは, hello.chw.c が持ってたのと同じインベントリ id を持ってることです.

後で改名の話題に戻るので, さしあたり, 話を元に戻します:

        % mv hello.c hw.c
        % tla move hello.c hw.c

ちょっと脇道 -- ディレクトリの追加

tla addコマンドはディレクトリにも適用します. 新しいサブディレクトリをツリーに作ると, それを tla add すべきです:

        % mkdir docs

        % tla inventory --names --source --both
        docs
        hw.c
        hello.c

しかし

        % tla inventory --source --both
        hw.c
        hello.c

次のようにしない限りは

        % tla add docs

そうすると

        % tla inventory --source --both
        docs
        hw.c
        hello.c

しかしながら、例題のため, docs は不要です. こうできます:

        % rm -rf docs

物理的に消去するディレクトリに tla deleteは必要ないです.

どのように動作するか -- tla add

tla addがすることはたいへん単純です。 hw.cmain.cを追加したとき, 新しいディレクトリが作成されたことに注意してください:

        % ls -a
        .               .arch-ids       hw.c.~1~        {arch}
        ..              hw.c            main.c

.arch-ids ディレクトリが新しくできました:

        % ls .arch-ids
        hw.c.id         main.c.id

        % cat .arch-ids/hw.c.id
        very long string

*.id ファイルは、ファイル id を決める生データが格納される場所です。 コマンド tla delete は、それらのファイルを削除します。 コマンド tla move はそれらを改名します.

ディレクトリ用の id はちょっと違う方法で格納されます。 例えば、docs サブディレクトリを作って tla add で id を与えたとき, それはファイル docs/.arch-ids/=id を作りました.

整然さを維持する

次のコマンド

        % tla tree-lint

は整然さを維持するのに有用です。

tree-lint は、対応する id が存在しないファイルを示します. 命名規約を満たすけど, 明示的な id を持たないファイルを示します.

命名規約に適合していないファイルについても警告します.

インベントリ Id -- いろいろやり方はあります

本章では、基本的なコマンド add, move, delete について習いました.

これらの道具を使ってインベントリ id を管理することがデフォルトの 振舞いとして選ばれました, というのも, 少なくとも皮相的には, これは 多くのユーザが慣れている CVS のようなシステムのコマンドに似てるからです.

インベントリー id を管理する他の方法があります. 時としてこっちの方がより便利です. 後の章でこれら他の技法を議論します。(xref: !!! を参照) (訳注: 原文ママ).

なぜそのようになっているのか -- インベントリ Id の目的

後の章で見るように, arch は、ソースツリーとそれが含むファイルへの変更をうまく管理し, ツリーとファイルの履歴をあなたにうまく説明します.

例として、アリスとボブの二人が hello_worldプロジェクトで作業しているとしましょう. アリスは, 彼女のツリーで, hw.cに変更を施します. ボブは, 彼のツリーで, hw.chello.cへ改名します。

ある時点で、アリスとボブが "同期する"ことが必要です. ボブは, アリスが施してきた変更点に追いつくべきです. アリスは, ボブが為したのと同じファイルの改名に追いつくべきです.

arch は同期のためのいろいろなからくりを用意してます. これは archができることの最も重要なことのひとつです. しかし, それらのほとんどは チェンジセット (changesets)を求めて適用することに要約されます.

アリスは、arch に彼女の作業を記述するチェンジセットを作るように依頼できます. そのチェンジセットは, 彼女が hw.cに施した変更を記述します. ボブはチェンジセットを作ることができ, そのチェンジセットは彼が為したファイルの改名を記述します.

アリスがボブのチェンジセットを彼女のツリーに適用すれば、 hw.cの彼女のコピーは hello.cと改名されるべきです。 しかし、より微妙な場合があります: ボブがアリスのチェンジセットを彼のツリーに適用したら何が起こるでしょう。

アリスは、./hw.cと命名されたファイルを変更しました。 しかし、ボブのツリーでは, これらの同じ変更は ./hello.cと名付けられたファイルに対して行なわれるべきです。 幸いにも、両方のファイルは同じインベントリ id を持っています:


        file path               inventory id
        ---------               -------------

                 アリスのツリー:
        ./hw.c                  x_very_long_string
                                                  \ 
                                                    - 同一の長い文字列
                 ボブのツリー:                    /
        ./hello.c               x_very_long_string


アリスのチェンジセットでは、アリスが修正した変更点は, id が x_very_long_string であるファイルに為されたものとして記述されます.

したがって、そのチェンジセットをボブのツリーに適用するとき、 archはその変更を同じ id のファイルに施すことを知ってます. つまり, その変更を彼の ./hello.cに適用することを知ってます.

この例は, インベントリ id の目的を説明します: インベントリ id は arch がツリーに為される変更を, ファイルの, 物理的な位置の代わりに, 論理的な同一性で記述することを可能にします. インベントリ id がどう役割を果たすかのより複雑な例は沢山あります. しかし, ここで見たのは, 少くともその基本的な点です.

なぜそのようになっているのか -- なぜ tla move はファイルを動かさないのか

なぜ tla delete コマンドはソースカテゴリから除かれたファイルを消去しなかったり, tla move はファイルを改名しないのでしょうか?

これらのコマンドは, arch のことを知らない他の道具がファイルをいじったときでも, ツリーの中で id を調節できるように動作します. 例えば、"ディレクトリエディタ"を使ってソースファイルを改名すると, tla moveはディレクトリエディタモードによる変更に追いつくのに 使えます.

時々、archユーザはコマンドの追加を要求します: tla mv, tla mkdir, tla rmdir, そして tla rmといった, id と対応するソースファイルの 両方を変更するようなものをです. これは素晴しい考えで, 困難ではありません: だから, 何かすることを探してる人にとって, これは現実的なプログラムのプロジェクトとして良い考えです. もしそれをやってるなら gnu-arch-usersメーリングリストで 知らせてください, そうすればあなたの変更を配布物に含めることを検討できます.

後記: ある利用者が, 最近 tla mvコマンドに貢献しました. このコマンドは インベントリ id を考慮した mv(1)の代替物を目的とします.

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