CI(1)

名称
ci - RCS ファイルに新たなリビジョンを追加する

書式
ci [options] file ...

解説
ci は RCS ファイルに新たなリビジョンを追加します。引数のうち、RCS ファイルの拡張子 形式にマッチするファイル名を RCS ファイルとみなします。 それ以外のファ イル名は、新たなリビジョンを含んだワークファイルとみなします。 ci はワークファイルの内容を対応した RCS ファイルに格納します。もし、 ワークファイルのみが指定されたなら、 ci はサブディレクトリ RCS、次にワークファイルがあるディレクトリの順に 対応した RCS ファイルを検索します。詳細は後述の ファイル名規則 の項を参照してください。

ci が動作するには、 ci を起動したユーザが RCS ファイルのアクセスリスト に登録されているか、アクセスリストが空であるか、ユーザが RCS ファイル の持ち主であるか、スーパーユーザである必要があります。 すでに存在する枝(branch)に新しいリビジョンを追加するには、ブランチの 先端(tip)リビジョン が、追加しようとするユーザによってロックされていなければなりません。 さもなければ、新たな枝を作成することができます。非厳格モード( rcs(1) 参照) の 場合、ファイルの持ち主に対してはこの制限はありません。他人が行っている ロックは、 rcs コマンドによって解除できます。

-f オプションが指定されていなければ、 ci は追加しようとするリビジョンと 直前のリビジョンとの比較を行います。もし、違いがなかった場合、新たな リビジョンを作成するかわりに、ワークファイルを元のリビジョンのものに復元 します。復元するときには、ci はいったんワークファイルを削除します。 ci に -l オプション または -u オプションが指定されていれば、あたかも直前のリビジョンに対して co -l または co -u を実行したかのようにして直前のリビジョンの内容を 取り出します。復元が行われる場合、 -n と -s オプションは復元されるリビジョンに対して作用します。

リビジョンを格納するときに、 ci はログメッセージの入力を促すプロンプト を表示します。ログメッセージは、そのリビジョンの変更点の要約で、 ファイル終端 (EOF) または `.' のみからなる行によって入力を完了させます。複数の ファイルが登録される場合、 ci は前に入力したログメッセージを再利用する かどうかを聞いてきます。もし、標準入力が端末でなければ、 ci は確認を行 わず、登録されるすべてのファイルに対して同じログメッセージを使用します。 -m オプションの項を参照してください。

もし RCS ファイルが存在しなければ、 ci は新規に RCS ファイルを作成し、ワークファイルの 内容を初期リビジョン(デフォルトでは 1.1) として格納します。その場合、アクセスリストは空に設定されます。 初期リビジョンを格納するときは、ログメッセージのかわりにファイルの内容を 記述したテキストを入力します ( -t オプションの項参照)。

登録するリビジョンのリビジョン番号 (rev) は、 -f, -I, -k, -l, -M, -q, -r, -u のオプションのうちのいずれかで指定することができます。 rev はシンボル、数値、あるいは両方の混合したものです。もし rev が $ ならば、 ci はワークファイル中のキーワードからリビジョン番号を決定します。

rev がリビジョン番号の場合、それは登録する枝のなかで最も大きな値である必要が あります。さもなければ、新しい枝を作成する必要があります。

rev がリビジョン番号ではなく枝番号の場合、その枝に対する新しいリビジョンが 作成されます。新しいリビジョン番号は、その枝の先端リビジョン番号に 1 を加えたものとなります。もし rev が存在しない枝番号ならば、新たな枝が作成され、初期リビジョンとして rev.1 が作成されます。

rev が省略された場合、 ci はユーザが行った最後のロックからリビジョン番号を決定します。 もし、ユーザがブランチの先端リビジョンのロックを行って いたなら、新たなリビジョンがその枝に追加されます。新しいリビジョン番号は 先端リビジョン番号に 1 を加えたものになります。もし、ユーザが先端で はないリビジョンをロックしていたなら、新たな枝が作成されます。新たな枝 番号は、ロック対象のリビジョンの最も大きな枝番号に 1 を加えたものになり ます。デフォルトでは、新たな枝やリビジョンの番号は 1 となります。

rev が省略され、ユーザがロックを行ってはいないが、そのファイルの所有者であり、 かつロックを厳格には行わないモード (以下、非厳格モード) であるなら、デフォルトの枝 (通常は 幹(trunk): rcs(1) の -b オプションの項を参照)に新たなリビジョンが作成 されます。

例外: 幹(trunk) において、リビジョンを追加することはできますが、途中に挿 入することはできません。

オプション

-r[rev]
    リビジョンを登録します。さらに、対応したロックを解除し、ワークファイル を削除します。これはデフォルトの動作です。

    ci において -r オプションは他の RCS コマンドとは異なる意味を持ちます。 他の RCS コマンドでは -r は単にリビジョンの指定ですが、 ci ではロックの 解除とワークファイルの削除も意味します。 -u オプションの項にトリッキーな例が挙げられています。

-l[rev]
    -r と同様の動作を行ったあと、 co -l と同様の動作も行います。すなわち、登録されたリビジョンは即座にロックされ、 取り出されます。これは、リビジョンを登録してさらに編集を続けたい場合に 便利です。

-u[rev]
    -l とほぼ同様の効果がありますが、登録されたリビジョンはロックされません。 これは、登録したリビジョンの内容をすぐに参照したい (コンパイル等) 場合 に便利です。

    -l 、 -r 、 -u オプションは、最後に指定したもののみ が効力を持ちます。たとえば、 ci -u -r は ci -r と等価です。

-f[rev]
    直前のリビジョンとの違いがない場合にも、強制的に新しいリビジョンとして 登録します。

-k[rev]
    ワークファイルからキーワードを探し、リビジョン番号、作成日時、状態、 作者を検索し ( co(1) を参照)、登録されるリビジョンに割り当てます。さらに、 ci を起動したユーザ名と実際に登録された日付を含むデフォルトのログメッセージを 作成します。本オプションは、配布されたソフトウェアを登録するのに 便利です。複数のサイトに配布されたリビジョンは -k オプションを使って登録することで、元々のリビジョン番号、作成日付、状態、 作者を保存することができます。 ワークファイルのキーワードから取り出した値は、 -d 、 -m 、 -s 、 -w や、他のリ ビジョン番号を生成するようなオプションにより変更することができます。

-q[rev]
    診断メッセージを表示しません。直前のリビジョンから 変更がない場合、 -f オプションを指定していなければ、登録を行いません。

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

-d[date]
    登録日付として指定された date を用います。 date は co(1) で記述された自 由形式で指定することができます。これは、 登録日時をごまかしたい場合や、日付キーワードがワークファイルに ないにもかかわらず -k オプションを使いたい場合に便利です。 date が指定されなかった場合、ワークファイルの最終更新日付が用いられます。

-M[rev]
    作成されるワークファイルの最終更新日付を、取り出されたリビジョンの日付 にします。たとえば、 ci -d -M -u f は、 f の内容がキーワード置換により変更 された場合も最終更新日時を変更しません。本オプションを指定すると make(1) が正しく動作しなくなるので、注意して使用する必要があります。

-mmsg
    登録するすべてのファイルのログメッセージとして msg を用います。

-nname
    登録したリビジョンにシンボリック名 name をつけます。もし同じシンボリック名が別のリビジョンに割り当てられていた場合、 エラーになります。

-Nname
    -n と同様の動作を行います。ただし、同じシンボリック名が他のリビジョン に割り当てられていた場合は、再割り当てを行います。

-sstate
    登録されるリビジョンの状態を state とします。デフォルトは Exp (Experimental: 実験的) です。

-tfile
    RCS ファイル中の内容記述テキストをファイル file の内容で置き換えます。 すでに内容記述テキストがある場合はこれを削除します。ファイル名 file は - で始まってはいけません。

-t-string
    RCS ファイル中の内容記述テキストを文字列 string の内容で置き換えます。 すでに内容記述テキストがある場合は削除されます。

    -t オプションは、どちらの形式で使う場合も、最初のチェックイン時にしか意 味を持ちません。それ以外の場合は単に無視されます。

    最初のチェックイン時に -t オプションが指定されなかった場合、 ci は標準 入力から内容記述テキストを読み込みます。テキストは、ファイル終端あるいは その行に `.' しかない場合に終了します。ユーザへの問い合わせが可能な場合には、 テキストの入力を促すプロンプトが表示されます ( -I オプション参照)。

    旧バージョンとの互換性のため、後に何も続けない -t オプションは無視されます。

-wlogin
    指定された login をリビジョンの作者として登録します。作者名をごまかした い場合や、作者キーワードがワークファイルにないにもかかわらず -k オプションを使いたい場合に便利です。

-Vn RCS システムのバージョン n のエミュレーションを行います。詳細は co(1) を参照してください。

-xsuffixes
    RCS ファイルの拡張子を指定します。拡張子が空ではない RCS ファイルを指定した 場合、 suffix まで含めたすべてのパス名を RCS ファイル名であるとみなします。 拡張子が空の場合は、 RCS/file または path/RCS/file 形式のものを RCS ファ イル名であるとみなします。本オプションの場合、 / で区切ることにより、複数の 拡張子を指定できます。たとえば、 -x,v/ は、 ,v と空の拡張子の 2 つの拡張子を持つ RCS ファイルを指定します。 複数の拡張子が指定された場合、指定された順に RCS ファイルを検索します。 デフォルトの拡張子は、インストールされる環境により異なります。UNIX のよ うな計算機では、通常 -x,v/ が、それ以外の計算機では空拡張子が用いられます。

ファイル名規則
RCS ファイルとワークファイルのペア は 3 通りの方法で指定することができます。

1) RCS ファイルとワークファイルの両方を指定する RCS ファイルのパス名は path1/workfileX 形式、ワークファイルのパス名は path2/workfile 形式を取ります。この場合の、 path1/ と path2/ はパス (異なる場合や、空である場合もある) を示し、 workfile はファイル名、X は RCS 拡張子を指します。もし X が空なら、 path1/は RCS/ であるか、最後が /RCS/ でなければなりません。

2) RCS ファイルのみを指定する ワークファイルパス名は、カレントディレクトリの、RCS ファイル名から path/ と X を取り除いた部分をファイル名に持つファイル名になります。

3) ワークファイルのみを指定する ci はまず、各 RCS 拡張子 X に対して、 path2/RCS/workfileX 形式の名前で検 索を行います。もしこれが見つからず、 X が空でなければ、 path2/workfileX を検索します。

1) または 2) の方法で RCS ファイルが指定されていない場合、 ci は、まずディレクトリ ./RCS を検索し、次にカレントディレクトリを検索します。

ある RCS ファイルパス名のオープンに失敗すると、たとえそれがいくつか ある可能性の 1 つであっても、 ci はエラーとして処理を終了します。たとえば、 ディレクトリ d で RCS コマンドを利用できないようにするには、 d/RCSなる 名前の通常ファイルを作成しておきます。すると、RCS コマンドは d/RCS をディレクトリとしてオープンしようとしますが、ディレクトリではないので オープンすることはできません。その結果、エラーになるわけです。

例
RCS 拡張子が ,v 、カレントディレクトリには RCS サブディレクトリがあり、 RCS には io.c,v があると仮定します。ここで、以下に示したコマンドを実行すると、 どれもカレ ントディレクトリにある io.c を RCS/io.c,v に登録し、 io.c を削除します。

    ci  io.c;    ci  RCS/io.c,v;   ci  io.c,v;
    ci  io.c  RCS/io.c,v;    ci  io.c  io.c,v;
    ci  RCS/io.c,v  io.c;    ci  io.c,v  io.c;

RCS 拡張子が空、カレントディレクトリには RCS サブディレクトリがあり、 RCS には io.c があると仮定します。ここで以下に示すコマンドは、どれも新しい リビジョンの登録を行います。

    ci  io.c;    ci  RCS/io.c;
    ci  io.c  RCS/io.c;
    ci  RCS/io.c  io.c;

ファイルモード
ci が作成した RCS ファイルは、ワークファイルの読込みと実行の許可属性を 受け継ぎます。すでに RCS ファイルが存在すれば、 ci はその読込みと実行 の許可属性を保持します。 ci は、つねに RCS ファイルの書き出し許可属性を不許 可にします。

ファイル
いくつかの一時ファイルが、ワークファイルの存在するディレクトリまたは テンポラリディレクトリ (環境変数の項の TMPDIR 参照) に作成されます。 セマフォファイル等のファイルが RCS ファイルが存在するディレクトリに 作成されます。空ではない RCS 拡張子を用いている場合、セマフォファイル名の 先頭 1 文字には、RCS 拡張子の 1 文字目と同じ文字が用いられます。 RCS 拡張子として、ファイル名の先頭として利用できない文字を指定しないよ うに注意してください。空の RCS 拡張子を指定している場合、 セマフォファイル名の最後の 1 文字が _ となります。この場合、ワークファイル名の最後の 1 文字が _ で終わってはいけません。

ci は、 RCS ファイルやワークファイルを変更しません。通常 ci はそれらのファイルを削除し、新しいものを作成します。ただし、 対象となる RCS ファイルがシンボリックリンクの場合は、 シンボリックリンク自体ではなく、そのリンク先のファイルを削除します。 他のシンボリックリンクによる参照に同じ結果を 反映するためです。ワークファイルがシンボリックリンクやハードリンクであった 場合には、この処置が適用されないため、他の同じ実体を指していた シンボリックリンクの内容との食い違いが生じます。また、RCS ファイルに対する ハードリンクは意味がありません。

実効ユーザは、 RCS ファイルを含むディレクトリの検索および書き込み権を 持っていなければなりません。通常、実ユーザは、 RCS ファイルと ワークファイルの読込み許可と、それらを含むディレクトリの検索および 書き込み権を持っていなければなりません。古い計算機のなかには実ユーザと 実効ユーザの間を容易に行き来することができないものもあります。 これらの計算機では、実効ユーザの権限のみが利用されます。 ci や co の実行ファイルに setuid が設定されていなければ、 実ユーザと実効ユーザは同一です。次節で説明するように、 もし実効ユーザが全 RCS ファイルとそれを含むディレクトリを所有し、 実効ユーザのみが RCS ディレクトリに書き込めるように設定できるなら、 RCS ファイルのセキュリティを強化することが可能です。

RCS ファイルを変更するには RCS ファイルを含むディレクトリの書き込み権 が必要なので、ユーザは RCS ファイルを含むディレクトリの許可属性を変更 することで、RCS ファイルに対するアクセスを制限できます。たとえば、ユーザ のグループを設定できる計算機では、RCS ディレクトリをあるグループのみが 書き込み権を持つように設定します。これは、略式のプロジェクトでは効果が あります。しかし、このやりかたでは、グループに所属するユーザが自由に RCS ファイルを変更することができ、ときには RCS ファイルすべてを削除してしまうか もしれません。そのため、正式なプロジェクトでは、RCS ファイルを自由に 操作きる RCS 管理者を置いて、プロジェクトの他のメンバは新たなリビジョン を登録すること以外の操作をできないようにすることがあります。

環境変数

RCSINIT
    本変数に空白で区切ったオプションを設定することで、コマンドライン引数に 先立って処理されます。 空白はバックスラッシュによってエスケープすることができます。 RCSINIT はほとんどの RCS コマンドで参照されます。特に -q 、 -V 、 -x オプションを指定しておくと便利です。

TMPDIR
    一時ファイルを作成するディレクトリ名を指定します。設定されていない場合は、 環境変数 TMP 、 TEMP を調べます。どれも設定されていない場合は、計算機毎に 決められたデフォルトのディレクトリ (ほとんどの場合 /tmp ) を使用します。

診断
ci は RCS ファイル名、ワークファイル名、追加するリビジョン番号、直前の リビジョン番号を表示します。処理が成功した場合は終了ステータス 0 を返します。

作者
Author: Walter F. Tichy.
Revision Number: ; Release Date: .
Copyright © 1982, 1988, 1989 by Walter F. Tichy.
Copyright © 1990, 1991 by Paul Eggert.

関連項目
co(1), ident(1), make(1), rcs(1), rcsclean(1), rcsdiff(1), rcsintro(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.