The Hackerlab at regexps.com

以前のリビジョンの取得

up: arch Meets hello-world
next: 共有、公開アーカイブ
prev: 変更点のチェックイン

もし以前の章の例題を習ってるなら, 次のものがあるはずです:

あなたの最初のアーカイブ これはあなたのデフォルトのアーカイブでもあります:

        % tla my-default-archive
        lord@emf.net--2003-example

        % tla whereis-archive lord@emf.net--2003-example
        /usr/lord/examples/{archives}/2003-example


アーカイブの中の hello-world プロジェクト

        % tla categories 
        hello-world

        % tla branches hello-world
        hello-world--mainline

        % tla versions hello-world--mainline
        hello-world--mainline--0.1


hello-world プロジェクトの二つのリビジョン

        % tla revisions hello-world--mainline--0.1
        base-0
        patch-1

この章では、あなたのアーカイブからリビジョンを取り出す方法を習います.

最新のリビジョンのチェックアウト

残りもののプロジェクトツリーがあるかもしれません. もしそうなら、それを取り除きましょう:

        % cd ~/wd

        % ls
        hello-world

        % rm -rf hello-world


いま hello world プロジェクトの最新ソースを取得したいとしましょう。 そのために、get コマンドを使わねばなりません:

        % tla get hello-world--mainline--0.1 hello-world
        [...]


        % ls 
        hello-world

        % ls hello-world
        hw.c    main.c  {arch}


以前のリビジョンをチェックアウトする

hello-world プロジェクトの以前のバージョンをチェックアウトしたいとします.

前の例において、プロジェクトの特定のバージョンだけを求めたことに注目してください:

        % tla get hello-world--mainline--0.1 hello-world
                  ^^^^^^^^^^^  ^^^^^^^^  ^^^ ^^^^^^^^^^^
                       |           |      |       |
                       |           |      |  ターゲットディレクトリ
                       |           |      |
                       |           |      |
                       |           |   バージョン番号
                       |           |
                       |      ブランチ名
                       |
                   カテゴリ名

そのパッチレベルを明示的に指定することで, 以前のリビジョン名を取り出すことができます:

        % tla get hello-world--mainline--0.1--base-0 hello-world-0
                  ^^^^^^^^^^^  ^^^^^^^^  ^^^  ^^^^^^ ^^^^^^^^^^^^^
                       |           |      |      |        |
                       |           |      |      |  ターゲットディレクトリ
                       |           |      |      |
                       |           |      | パッチレベル名
                       |           |      |
                       |           |   バージョン番号
                       |           |
                       |      ブランチ名
                       |
                 カテゴリ名




        % ls
        hello-world     hello-world-0

        % ls hello-world-0
        hw.c    main.c  {arch}


例えば diff -r で, base-0 から patch-1 でなされた変更点を知ることができます:

        % diff -r hello-world-0 hello-world
        diff -r hello-world-0/hw.c hello-world/hw.c
        7c7
        <   (void)printf ("hello warld");
        ---
        >   (void)printf ("hello world\n");
        [...]

それはどのように動作するか -- get によるリビジョン取得

base-0 リビジョンの取得は簡単です。 以前説明したように, base-0 リビジョンは完全なソースツリーの圧縮された tar ファイルとして格納されます (それはどのように動作するか -- import は何をするかを参照). base-0 を取得するように頼まれた時、 get コマンドは, 実質的には, その tar ファイルを展開するだけです.

patch-1 リビジョンの取得は二段階あります. base-0 は, base-0patch-1 の間の差分を記述する, チェンジセットとして格納されていることを思いだしてください (それはどのように動作するか -- 新しいリビジョンの commitを参照)。 したがって, get は最初に base-0 リビジョンを取得し、 それから、patch-1 のチェンジセットを取得し、 それから、そのチェンジセットで base-0 ツリーを修正して patch-1 ツリーにします. 内部的には、get は, チェンジセットを適用するために dopatch と呼ばれる tla コマンドを使います. しかし、diff/patch という patchsets に慣れているなら, dopatch のことを"ステロイドでのパッチ"と思ってよいです.

一つだけの変更ではなく, 沢山の変更をコミットしたときを考えましょう: patch-1 リビジョンだけでなく, patch-2, patch-3 などがある場合です. 要するに, get は要求されたリビジョンを作成するために, それぞれのチェンジセットを適用します.

注意: 実は, get はここで記述されるよりは少し複雑です。 一方で, get がチェンジセットの長いリストを適用しないですむような実行最適化があります. もう一方で, commit ではなくて, tag で作られるリビジョンには, 別の規則が適用されます. 後の章でこれらの例外についてさらに習うでしょう.

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