CO(1)

名称
co - RCS ファイルからリビジョンをチェックアウトする

書式
co [options] file ...

解説
co は、各 RCS ファイルからリビジョンを取り出し、 対応したワークファイルに格納します。

RCS 拡張子にマッチするファイル名は RCS ファイルであるとみなし、 その他のファイル名はワークファイルであるとみなします。 ファイル名の対応に関しては、 ci(1) を参照してください。

RCS ファイルのリビジョンは、ロックしてもしなくともチェックアウトできます。 リビジョンをロックすることにより、 同時に複数の更新が行われることを防止します。 内容を表示したり、読むだけの処理(たとえば、コンパイル)で用いたりする場合は ロックする必要はありません。 編集し後にチェックインするつもりで RCS ファイルから取り出す場合は、 通常、ロックしなければなりません。 他のユーザによってロックされているリビジョンを ロックしてチェックアウトしようとするとエラーになります(ロックは rcs(1) によって解除することができます)。 更に、リビジョンをロックしてチェックアウトするには、 チェックアウトする人が RCS ファイルのアクセスリストに登録されているか、 そのファイルの所有者もしくはスーパユーザであるか、 アクセスリストが空である必要が有ります。 ロックしないで取り出す場合は、 アクセスリストや他人のロックに影響されることはありません。

取り出されるリビジョンを、リビジョン番号、枝番号、 チェックイン日時、作者、状態によって指定するオプションが存在します。 複数のオプションが組み合わされて指定された場合、 co はすべての条件に合致するリビジョンのうちで最新のものを取り出します。 リビジョン指定オプションが指定されなかった場合、 co は、デフォルト枝(通常は幹: rcs(1) の -b オプションの項を参照)の最新のリビジョンを取り出します。 リビジョン番号あるいは枝番号は、 以下のオプションを使って指定することができます: -f, -I, -l, -M, -p, -q, -r, -u 。 オプション -d (日時)、 -s (状態)、 -w (作者)は、単一の枝から取り出します。 この枝は 選択された 枝であり、 -f, ..., -u オプションもしくはデフォルト枝により指定されます。

リビジョンを 1 つも持たない RCS ファイルに対して co コマンドを適用すると、長さ 0 のワークファイルが作成されます。 co は、つねにキーワード置換を行います (下記参照)。

オプション

-r[rev]
    リビジョン番号 rev 以前( rev と同じものも含む)で最新のリビジョンを取り出します。 rev がリビジョンではなく枝を指定している場合、その枝上の最新 のリビジョンが取り出されます。 rev が省略された場合、デフォルト枝 ( rcs(1) の -b オプションの項を参照)の最新のリビジョンが取り出されます。 rev が $ の場合、 co はリビジョン番号をワークファイルのキーワードから 取り出します。これら以外の場合、 rev はリビジョンを示すピリオドで区切られた数字またはシンボルの列です。 rev がピリオドで始まる場合、デフォルトの枝(通常は幹)が設定されます。 rev がピリオドを後ろに付けた枝番号であるならば、 その枝の最新のリビジョンが使われます。 シンボルは、 ci(1) や rcs(1) によりリビジョン番号と結びつけることができます。

-l[rev]
    -r と同様の動作ですが、取り出したリビジョンを呼び出したユーザにてロックします。

-u[rev]
    -r と同様の動作ですが、取り出したリビジョンが呼び出したユーザによって ロックされていたならば、そのロックを解除します。 rev が省略された場合、 co を起動したユーザがロックしたリビジョンが 1 つあれば、 そのリビジョンを取り出します; そうでなければ、デフォルト枝の最新のリビジョンを取り出します。

-f[rev]
    ワークファイルの上書きを強制します； 後述の -q オプションを使用する場合、いっしょに -f オプションも 指定すると便利な場合があります。 ファイルモード の項も参照してください。

-kkv
    ワークファイルにデフォルト形式のキーワード文字列を埋め込みます。たとえば、 キーワード Revision に対しては、文字列 $Revision: $ を生成します。 ci -l や co -l でファイルがロックされる時のみ、 Header, Id, Locker キーワードにロック者名を挿入します。これがデフォルトの動作です。

-kkvl
    -kkv とほぼ同様ですが、指定されたリビジョンがロックされていた場合にはいつも、 ロック者名を挿入します。

-kk キーワード文字列中のキーワード名のみの文字列を生成し、値は省略します。 後述の キーワード置換 を参照して下さい。 たとえば、キーワード Revision に対しては、通常の $Revision: $ のかわりに、 $Revision$ を生成します。これは、異なるリビジョンの内容を比較する場合、キーワード 値の違いを無視できるので、便利です。 -kk が指定されても、キーワード $Log$ の後にはログメッセージが挿入されます。これはリビジョンを統合する変更に、 より便利であることを意図しています。

-ko チェックインされる前の ワークファイル中のキーワード文字列をそのまま出力します。たとえば、 キーワード $Revision$ に対しては、 チェックインされる前に展開されていた文字列 $Revision: 1.1 $ が、 $Revision: $ の代わりに展開されます。 キーワード文字列の形式を取るバイト列が置換されてしまっては困るような 場合(訳注:バイナリファイル等)に便利でしょう。

-kb 元のキーワード文字列のバイナリイメージを生成します。これは、 -ko とほぼ同じですが、入出力する全てのワークファイルをバイナリモードで 扱う点が違います。これは、Posix と Unix のホスト間ではたいした違いでは ありません。が、DOS のようなシステムではバイナリファイルを扱う場合、 RCS ファイルの初期化には rcs -i -kb を使わねばならないでしょう。 また、全ての環境において、 rcsmerge(1) は通常、 -kb が働いている場合はファイルの統合を受け付けません。

-kv キーワード文字列としてキーワード値のみを生成します。たとえば、キーワード Revision に対して、通常の $Revision: $ のかわりに を生成します。 これは、キーワード文字列から $Revision: $ のようなキーワード区切りを取 り除くことが困難なプログラミング言語用のファイル等を生成するために 使用します。しかしながら、キーワード名が取り除かれてしまうと、それ以降に キーワード置換を行うことができないので、注意が必要です。 キーワードを失うことはこのように危険であるため、本オプションを -l オプションと組み合わせて使うことはできません。また、ワークファイルの 書き込み権はオフになります; 後でワークファイルを編集する場合は、 -kv オプションを指定せずにワークファイルを取り出してから行います。

-p[rev]
    ワークファイルに格納する代わりに、 対象となるリビジョンを標準出力に書き出します。 co をパイプの一部として使用する場合に便利です。

-q[rev]
    静かなモード; 診断メッセージを表示しません。

-I[rev]
    対話モード; たとえ標準入力が端末でなくても、ユーザに対して 問い合わせを行います。

-ddate
    選択された枝上の、 date 以前の登録日付を持つ、最新のリビジョンを取り出します。 日付と時刻は自由形式で指定します。タイムゾーンとして LT を指定することにより、ローカルタイムを使用することができます; 他の一般的なタイムゾーンも使用することができます。 たとえば、以下に挙げるいくつかの date 指定は、 太平洋標準時における 1990 年 1 月 11 日午後 8 時と同時刻を示します (太平洋標準時は協定世界時 (UTC) よりも 8 時間遅れです)。

        8:00 pm lt
        4:00 AM, Jan. 12, 1990	デフォルトは UTC
        1990-01-12 04:00:00+00	ISO 8601 (UTC)
        1990-01-11 20:00:00-08	ISO 8601 (ローカル時刻)
        1990/01/12 04:00:00	伝統的 RCS 形式
        Thu Jan 11 20:00:00 1990 LT	ctime(3) + LT出力
        Thu Jan 11 20:00:00 PST 1990	date(1)出力
        Fri Jan 12 04:00:00 GMT 1990
        Thu, 11 Jan 1990 20:00:00 -0800	インターネット RFC 822
        12-January-1990, 04:00 WET

    ほとんどの日付の項目にはデフォルト値があります。 デフォルトのタイムゾーンは UTC です。 これは -z オプションにて優先指定することが出来ます。 他のデフォルト値は、年、月、日、時、分、秒 の順番で決定されます。 これらの項目のうち、少なくとも 1 つが指定されなければいけません。 指定のある項目よりも先に決定される項目が省略されている場合には、 タイムゾーンにおける現在の値を使用します。 他の省略されたフィールドには最小値が採用されます。 たとえば、 -z 無しの 20, 10:30 の場合は、UTC タイムゾーンの現在の年月の 20 日 10:30:00 UTC が採用されます。 日付の指定に空白が含まれる場合には、 日付の指定をクォートでくくる必要があることに注意してください。

-M[rev]
    作成されるワークファイルの最終更新日付を、取り出されるリビジョンの日付に します。本オプションを指定すると make(1) が正しく動作しなくなるので、注意して使用する必要があります。

-sstate
    選択された枝上の、状態 state を持つ最新のリビジョンを取り出します。

-T  RCS ファイルの変更日付を変更しません。 ロックされたりロック解除されたりして RCS ファイルが変更された場合でもです。 このオプションは、コピーした RCS ファイルのワークファイルを使って make(1) をかける際に再コンパイルをさせたくない場合に便利でしょう。 このオプションは必要であるにもかかわらず再コンパイルを行なわないことに なってしまう場合があるので注意が必要です。 それは、ロックの変更が別のワークファイルのキーワード文字列の変更を行う時です。

-w[login]
    選択された枝上の、ユーザ名 login によって登録された最新のリビジョンを取り出します。 login が省略された場合は、 co を起動したユーザ名を使います。

-jjoinlist
    joinlist で指定されたリビジョンを結合した新しいリビジョンを作成します。 本オプションは、旧バージョンとの互換性のために残されています。 通常、リビジョンの結合には rcsmerge(1) を用います。

    joinlist は rev2:rev3 形式のリビジョンの対をコロンで区切って並べたリストです。 ここで、 rev2 と rev3 は(シンボリックまたは数字の)リビジョン番号です。 以下の説明で、 rev1 は以下のリビジョンを示します: (1) joinlist に列挙さ れた対のうち、最初のものは、上記の -f, ..., -w オプションによって選択されたリビジョンです。 (2) それ以外の対に対しては、直前の対から作成されたリビジョン (すなわち、1 つの対によって作成されたリビジョンは次の結合 のための入力となります)。

    それぞれの対に対して、 co は rev1 と rev3 を rev2 と比較しながら結合します。つまり、 rev2 を rev1 と同一にするための変更を、 rev3 のコピーに対して適用します。 rev2 を同一の祖先とする 2 つの枝の末端のリビジョン rev1 と rev3 を結合するのによく用いられます。もし、3 つのリビジョンが同一の 枝上にあり、リビジョン番号が rev1<rev2<rev3 ならば、結合の結果は、 rev3 の内容のうち、 rev1 から rev2 への変更を無効にしたものになります。 もし、 rev2 から rev1 への変更が rev2 から rev3 への変更と重複している なら、 co は merge(1) に示したような報告を行います。

    最初に指定する対では rev2 を省略することができます。この場合は、 rev1 と rev3 の共通の祖先 リビジョンを rev2 として使用します。もし、いずれかの引数 がリビジョンではなく枝を示しているなら、その枝上の最新のリビジョンが用 いられます。同時に -l オプションや -u オプションを指定すると、 rev1 がロックまたはロック解除されます。

-V  RCS's のバージョン番号を表示します。

-Vn バージョン n の RCS システムの動作をエミュレートします。 n は 3, 4, 5 のいずれかです。これは、古い RCS を使っているユーザと RCS ファイルを交 換するときに便利です。使用している RCS がどのバージョンかを調べるには、 rcs -V を実行します; これは最近のバージョンの RCS では動作します。 これが動作しない場合は適当な RCS ファイルに対して rlog を起動します; 最初の数行に文字列 branch: がなければ、それはバージョン 3 です; また、日付に現れる年が 2 桁の数字ならば、それはバージョン 4 です; どちらでもなければ、バージョン 5 です。 RCS バージョン 3 をエミュレートして作成された RCS ファイルからはデフォルト 枝の情報が失われます。 バージョン 4 またはそれ以前のバージョンをエミュレートして作成された リビジョンは、最大 13 時間ずれた日付を持つことになります。 バージョン 4 またはそれ以前のバージョンをエミュレートして取り出された ファイルには yy/mm/dd 形式の日付がキーワード中に展開されます。また、 $Log$ キーワードでは空白の入り方が異なります。

-xsuffixes
    RCS ファイルの拡張子として suffixes を使用します。詳細は ci(1) を参照して下さい。

-zzone
    キーワード置換での日付の出力書式の指定を行い、また、 -ddate オプションでの date のデフォルトのタイムゾーンの指定を行います。 zone は、省略する事も、UTC からの数値差で指定する事も、特別な文字列 LT を使ってローカル時間で指定する事もできます。 デフォルトでは zone は空であり、 この場合は伝統的な RCS フォーマット、 すなわちタイムゾーン無しの UTC であり日付をスラッシュで区切ります; そうでない場合は時刻はタイムゾーン付の ISO 8601 フォーマットです。 例えば、ローカルタイムが 1990 年 1 月 11 日 太平洋標準時間 (UTC の 8 時間西)午後 8 時の場合、時間の出力は次のようになります:

        オプション時刻の出力
        -z	1990/01/12 04:00:00	(デフォルト)
        -zLT	1990-01-11 20:00:00-08
        -z+05:30	1990-01-12 09:30:00+05:30

    -z オプションは RCS ファイルに格納されている日付(常に UTC です)には影響しません。

キーワード置換
テキスト中に存在する $keyword$ または $keyword:...$ 形式の文字列は、 $keyword:value$ 形式の文字列に置換されます。 keyword と value の対については後述します。キーワードはリテラルな文字列として、あるいは リビジョンを特定するためのコメントとして埋められることがあります。

まず、ユーザは $keyword$ なる形式の文字列を入力します。 チェックアウト時に、 co はこの文字列を $keyword:value$ に置換します。 $keyword:value$ 形式の文字列を含むものがチェックインされた場合、 value の部分は次にチェックアウトされたときに新たな値に置換されます。 このように、チェックアウトを行うごとにキーワードの値は 更新されていきます。この自動更新は -k オプションにより変更することができます。

キーワードの種類とその値:

$Author$
    リビジョンを登録したユーザのログイン名。

$Date$
    リビジョンが登録された日時。 -zzone を指定した場合、数値によるタイムゾーンオフセットが追加されます; 指定しない場合は、日時は UTC です。

$Header$
    標準的なヘッダ。RCS ファイルのフルパス名、リビジョン番号、日時、作者、 状態、ロック者(ロックされている場合)が含まれます。 -zzone を指定した場合、数値によるタイムゾーンオフセットが追加されます; 指定しない場合は、日時は UTC です。

$Id$
    $Header$ とほぼ同様です。RCS ファイル名はパスをつけずに埋め込まれます。

$Locker$
    リビジョンをロックしたユーザのログイン名(ロックされていない場合は空です)。

$Log$
    チェックイン時に与えたログメッセージ。その前に、RCS ファイル名、リビジョン 番号、作者、日時が埋め込まれます。 -zzone を指定した場合、数値によるタイムゾーンオフセットが追加されます; 指定しない場合は、日時は UTC です。 すでに埋め込まれているログメッセージは変更 されません。 新たなログメッセージのみが $Log:...$ のあとに追加されます。 ソースファイルの完全なログを記録するときに便利です。

    挿入される行の前には $Log$ の行の前のプレフィックス文字列が付きます。例えば、 $Log$ の行が “// $Log: tan.cc $” である場合、ログの各行の前の RCS プレフィックスは “// ” となります。 これはコメントが行末まで及ぶ言語にて便利です。 別の言語に対しては、複数行コメント内部にて “ * ” プレフィックスを使用するのが慣例です。 例えば、C プログラムの最初のログのコメントは慣例的に以下の形式です:

        /*
        * $Log$
        */

    古いバージョンの RCS とのバックワードコンパチビリティのため、 ログのプレフィックスが /* または (* でありオプションの空白で囲まれている場合、挿入されるログの行は / や ( の代わりに空白が用いられます; しかしこの使用方法は古くさく、この動作に依存してはなりません。

$Name$
    存在する場合、リビジョンをチェックアウトするために使用したシンボリック名。 例えば co -rJoe は $Name: Joe $ を生成します。 単に co を指定した場合は、 $Name: $ となります。

$RCSfile$
    パス名を含まない RCS ファイル名。

$Revision$
    リビジョン番号。

$Source$
    RCS ファイルのフルパス名。

$State$
    リビジョンに rcs(1) か ci(1) の -s オプションにより割り付けられた状態。

キーワード文字列の体裁を整えるために、 以下の文字をキーワード中に用いるには、 エスケープシーケンスを使用します。

    文字	エスケープシーケンス
    tab	\t
    newline	\n
    space	\040
    $	\044
    \	\\

ファイルモード
ワークファイルは、RCS ファイルの読み込みと実行の許可属性を受け継ぎます。 さらに、ユーザに対する書き込み権が設定されます。 -kv オプションが設定されている場合と、厳格ロックモード( rcs(1) 参照)にてロックせずに取り出した場合は、書き込み権が設定されません。

すでに、ワークファイルと同名の書き込み可能なファイルが存在していると、 co は取り出しを中断し、もし可能ならば削除するかどうかを問い合わせます。 もし、すでに存在するファイルが書き込み禁止であったり、 -f オプションが 指定されていた場合には、問い合わせを行わずに削除します。

関連ファイル
co は ci とほぼ同じくらいのファイルにアクセスします。ただし、 $ が指定されていなければワークファイルを読むことはありません。

環境変数

RCSINIT
    本変数に空白で区切ったオプションを設定することで、 コマンドライン引数に先立って処理されます。 詳しくは ci(1) を参照してください。

診断
RCS パス名、ワークファイルパス名、 取り出されるリビジョンの番号を診断出力します。 全ての処理が成功した場合のみ、終了ステータス 0 を返します。

作者
Author: Walter F. Tichy.
Manual Page Revision: ; Release Date: .
Copyright © 1982, 1988, 1989 Walter F. Tichy.
Copyright © 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert.

関連項目
rcsintro(1), ci(1), ctime(3), date(1), ident(1), make(1), rcs(1), rcsclean(1), rcsdiff(1), rcsmerge(1), rlog(1), rcsfile(5)
Walter F. Tichy, RCS--A System for Version Control, Software--Practice & Experience 15, 7 (July 1985), 637-654.

制限事項
RCS ファイル、ワークファイルのリンクは保存されません。

キーワードを $keyword:$ 以外の形式に書換える以外に、一部のキーワードの みを展開させる方法がありません。nroff や troff ではキーワード中にヌル文字 \& を埋め込むことにより展開を防ぐことができます。