スポンサーリンク

CI

名称
書式
解説
オプション
ファイル名規則
使用例
ファイルモード
関連ファイル
SETUID の使用
環境変数
診断
作者
関連項目

名称

ci − RCS ファイルにリビジョンをチェックインする

書式

ci [options] file ...

解説

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

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

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

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

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

登録するリビジョン番号 ( rev ) は、 −f, −i, −I, −j, −k, −l, −M, −q, −r, −u のオプションのうちのいずれかで指定することができます。 rev はシンボ ル、数値、あるいは両者の組み合わせたものです。 rev で使用するシンボル名 は 定義済みでなければなりません; チェックイン時にシンボル名を割り当てる 方法については −n および −N を参照して下さい。もし rev$ ならば、 ci はワークファイル中のキーワードからリビジョン番号を決定します。

もし rev がピリオドから始まる場合、デフォルトの枝 (通常は幹 (trunk)) に 格納されます。もし rev が枝番号に続いてピリオドである場合、当該枝の最新 のリビジョンが使用されます。

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

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

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

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

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

オプション

−rrev

リビジョン rev をチェックインします。

−r

−r オプションをリビジョン抜きで使用した場合、 ci にとって特 別な意味が有ります。他の RCS コマンドでは −r オプションを単体で 使用するとデフォルト枝の最新のリビジョンを指定します。しか し、 ci ではロック解除、ワークファイル削除を行い、シェルのエイリアス やスクリプトによりデフォルトとされてしまった −l−u オプ ショ ンの効果を打ち消します。

−l[rev]

−r と同様の動作を行ったあと、 co −l と同様の動作も行います。す なわち、登録されたリビジョンは即座にロックされ、チェックアウ ト さ れます。これは、リビジョンをチェックインしてさらに編集を続け たい場合に便利です。

−u[rev]

−l とほぼ同様の動作をしますが、登録されたリビジョンはロックされ ま せん。これは、チェックインしたリビジョンの内容をすぐに参照し たい場合に便利です。

−l 、リビジョン無し −r, −u オプションは、最後に指定したものの み が 効力を持ちます。たとえば、 ci −u −rci −r と等価です。リビ ジョン無し −r−u に優先するからです。

−f[rev]

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

−k[rev]

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

−q[rev]

沈 黙モードです。診断メッセージを表示しません。直前のリビジョン から変更がない場合、 −f オプションを指定していなければ、登録 を 行いません。

−i[rev]

最 初のチェックイン; RCS ファイルが既に有る時にはエラー報告しま す。特定のアプリケーションのレース状態を避けます。

−j[rev]

初期化を行わず、チェックインします; RCS ファイルが無いとエ ラー 報告します。

−I[rev]

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

−d[date]

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

−M[rev]

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

−mmsg

チェックインするすべてのリビジョンのログメッセージとして msg を用います。慣習的に # で始まるログメッセージはコメントであ り、GNU Emacs の vc パッケージのようなプログラムはこれを無視し ます。また、 {clumpname} (の後に空白が続く) ログメッセージは 可 能 であればまとめられることを意味します。それはたとえ別々のファ イルに関連づけられていてもです; {clumpname} ラベルは、まとめ る 目 的でのみ使用されます。それ自身はログメッセージであるとは見な されません。

−nname

チェックインしたリビジョンにシンボリック名 name をつ け ま す。もし同じシンボリック名が別のリビジョンに割り当てられてい た場合、 ci はエラーメッセージを出力します。

−Nname

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

−sstate

チェックインされるリビジョンの状態を state とします。デフォルト は Exp (Experimental: 実験的) です。

−tfile

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

−t−string

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

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

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

旧バージョンとの互換性のため、引数のない −t オプションは無視され ます。

−T

新しいリビジョンが存在し、 RCS ファイルの修正時刻が新しいリ ビジョンの時刻よりも古ければ、 RCS ファイルの修正時刻に対して新 しいリビジョンの時刻を代入します; そうでない場合は RCS ファイル の 修正時刻は保たれます。リビジョンをロックした場合は、 ci は通 常 RCS ファイルの修正時刻を現在の時刻に設定します。なぜならロッ ク が RCS ファイルに格納され、ロックの削除は RCS ファイルの変更 を要するからです。 RCS ファイルがワークファイルよりも新しくなる 方 法として 2 通り有ります: まず、 ci −M は現在時刻以前の日付で ワークファイルを作成します; 2 番目に、直前のバージョンを回復 す る時、ワークファイルを変更しない場合にも RCS ファイルは変更され 得ます。 RCS ファイルのワークファイルにおける make(1) 依存に よ り、 上 記 2 ケースは過剰の再コンパイルという結果になり得ます。 −T オプションを使用することで、 RCS ファイルの日付をごまかし、再 コ ン パイルを禁止します。このオプションは注意して使って下さい; あるワークファイルのチェックインが、同じ RCS ファイルに関連づけ ら れている別のワークファイルに影響を及ぼすべき時でも、再コンパ イルを抑制し得ます。例えば、 RCS ファイルの時刻を 01:00、 (変 更 さ れ た) ワークファイルの時刻を 02:00、別のワークファイルのコ ピーの時刻を 03:00、現在の時刻を 04:00 と し ま す。 こ こ で、 ci −d −T と すると、 RCS ファイルの時刻は通常の 04:00 ではなく 02:00 になります; この結果、 make(1) は別のコピーが RCS ファ イ ルよりも新しいと (誤って) 認識します。

−wlogin

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

−V

RCS のリビジョン番号を表示します。

−Vn

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

−xsuffixes

RCS ファイルの拡張子を指定します。拡張子が空ではない場合、拡 張 子まで含めたすべてのパス名を RCS ファイル名であるとみなします。 拡張子が空の場合は、 RCS/path または path1/RCS/path2 形式のもの を RCS ファイル名であるとみなします。本オプションの場合、 / で 区切ることにより、複数の拡張子を指定できます。たとえば、 −x,v/ は、 ,v と空の拡張子の 2 つの拡張子を持つ RCS ファイルを指定し ます。複数の拡張子が指定された場合、指定された順に RCS ファイル を検索します。最初に見つかったサフィックスが RCS ファイルに対し て用いられます。 RCS ファイルを生成できるが、 RCS ファイルが 見 つ からないときは、これらのサフィックスを新しいファイル名に対し て用います。デフォルトの拡張子は、インストールされる環境によ り 異 なります。 UNIX のようなコンマをファイル名中に含めることの出 来る計算機では、通常 −x,v/ が、それ以外の計算機では空の拡張子が 用いられます。

−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 です) には影響しません。

ファイル名規則

RCS ファイルとワークファイルの組み合わせは 3 通りの方法で指定することが できます (使用例の項目も参照してください)。

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

2) RCS ファイルのみを指定する。ワークファイルがカレントディレクトリに作 成され、 RCS ファイル名から path1/ と拡張子 X を取り除いたファイル名にな ります。

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

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

異常により RCS ファイルのオープンに失敗すると、 ci はエラー報告します。 他に RCS ファイルのパス名の候補があってもです。たとえばディレクト リ dRCS コマンドを利用できないようにするには、 d/RCS なる名前の通常ファ イルを作成しておきます。すると、 RCS コマンドは d/RCS をディレクトリとし て オープンしようとしますが、ディレクトリではないのでオープンすることが できず失敗します。

使用例

RCS 拡張子が ,v 、カレントディレクトリには RCS ファイルを含む RCS と い う サブディレクトリがあり、 io.c,v があると仮定します。ここで、以下に示 したコマンドを実行すると、どれもカレントディレクトリに あ る io.cRCS/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 ファイルが存在するディレクトリに作成さ れ ま す。 空 で はない拡張子を用いている場合、セマフォファイル名の先頭文字に は、拡張子の先頭文字と同じ文字が用いられます; よって、拡張子 と し て、 ワー クファイルの拡張子の先頭文字と同じ文字を指定しないように注意してく ださい。空の拡張子を指定している場合、セマフォファイル名の最後の文字 が アンダスコア ( _ ) となります。

ci は、 RCS ファイルやワークファイルを変更しません。通常 ci はそれらの ファイルをアンリンクし、新しいファイルを作成します; ただし、 RCS ファ イ ル へのシンボリックリンクの鎖を壊す代わりに、目的のファイルをアンリンク します。よって、 ci は変更されるワークファイルへのハードリンク、シン ボ リッ クリンクを全て壊します; さらに、 RCS ファイルへのハードリンクは無効 となり、シンボリックリンクは保存されます。

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

ユーザは RCS ファイルを含むディレクトリの許可属性を変更することで、 RCS ファイルに対するアクセスを制限できます; そのディレクトリに書き込み権 の あ るユーザだけが、 RCS ファイルを変更する RCS コマンドを使用することが できます。たとえば、ユーザが複数のグループに属することが出来る計算機 で は、 RCS ディレクトリをあるグループのみが書き込み権を持つように設定しま す。これは、略式のプロジェクトでは十分ですが、グループに所属するユー ザ が 自由に RCS ファイルを変更することができ、 RCS ファイルすべてを削除す ることもできます。そのため、正式なプロジェクトでは、 RCS ファイルを自由 に操作きる RCS 管理者と、新たなリビジョンをチェックインすること以外の操 作はできない他のユーザとを、区別することがあります。

SETUID の使用

RCS 管理者以外のユーザがリビジョンを削除できないようにするには、以下 の ように setuid 特権を使用することができます。

その計算機で RCS にて setuid が使用できるか確認します。疑問がある ときは、信頼できる専門家に意見を聞いてください。 最 も 良 い の は、 seteuid() システムコールが Posix 1003.1a Draft 5 に記述されているよ うに動作することです。なぜなら、実ユーザが root であっても、 RCS

は実 ユーザと実効ユーザを簡単に切り替えることができるからです。その次に良 いのは、 setuid() システムコールが saved setuid (Posix 1003.1-1990の { _POSIX_SAVED_IDS } の動作) をサポートしている場合です; この場合、実 ユーザもしくは実効ユーザが root である時のみ失敗し ま す。 RCS は setuid に失敗すると、ただちに終了します。

ユーザグループの RCS 管理者として、ユーザ A を選びます。 A だけ が、 RCS ファイルに対して rcs コマンドを実行することができます。 Aroot や、特権を持ったユーザであってはいけません。相互に異なるユーザ グループには、異なる管理者を使用するべきです。

ユーザが実行するファイルのディレクトリに、パス名 B を選びます。

以下のように、通常のインストールディレクトリ D から、 cicoB にコピーし、 A へ setuid します:

mkdir  B
cp  D/c[io]  B
chmod  go−w,u+s  B/c[io]

以下のように、各ユーザのパスに B を加えます:

PATH=B:$PATH;  export  PATH  # ordinary shell
set  path=(B  $path)  # C shell

以下のように、 A だけが書き込み許可を持つ RCS ディレクトリ R を作 成します:

mkdir  R
chmod  go−w  R

特定のユーザだけに RCS ファイルの読み込みを許可したい場合、 そ の ユーザをユーザグループ G に入れて、さらに A が以下のように、 RCS ディ レクトリを保護します:

chgrp  G  R
chmod  g−w,o−rwx  R

(存在すれば) 古い RCS ファイルを R にコピーし、 A が所有である こ とを保証します。

RCS ファイルのアクセスリストは、リビジョンをチェックインおよび ロックできるユーザを制限します。デフォルトのアクセスリストは 空 で、 RCS ファイルを読むことのできる全てのユーザに、登録の権限を与えます。 チェックインを制限したい場合は、 A がそのファイルに対して rcs −a を 実行します; rcs(1) を参照してください。特に rcs −e −aA は、 A だけに アクセスを制限します。

初めてチェックインを行う前に、 Arcs −i によって 新 し い RCS ファイルを初期化します。チェックインを制限したい場合、 −a オプション を付け加えます。

setuid 特権は、 ci, co, rcsclean のみに与えます; rcs や他のコマン ドに、setuid 特権を与えてはなりません。

RCS コマンドに対して、他の setuid コマンドを実行しないでくださ い。 setuid はあなたが考えるより扱いにくいものです。

環境変数

RCSINIT

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

TMPDIR

一時ディレクトリ名を指定します。設定されていな い 場 合 は、 環 境変数 TMPTEMP とを調べ、始めに見つかった値を用いま す; どれも設定されていない場合は、計算機依存のデフォルトの ディ レクトリ (たいていは /tmp ) を使用します。

診断

各リビジョンに対して、 ciRCS ファイル名、ワークファイル名、追加する リビジョン番号、直前のリビジョン番号を表示します。全ての処理が成功し た 場合のみ、終了ステータスが 0 になります。

作者

Author: Walter F. Tichy.
Manual Page Revision: 1.6; Release Date: 1999/08/27.
Copyright © 1982, 1988, 1989 Walter F. Tichy.
Copyright © 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert.

関連項目

co(1), ident(1), make(1), rcs(1), rcsclean(1), rcsdiff(1), rcsintro(1), rcsmerge(1), rlog(1), setuid(2), rcsfile(5)
Walter F. Tichy, RCS --A System for Version Control, Software--Practice & Experience 15, 7 (July 1985), 637-654.

スポンサーリンク