rcsintro(1) RCS 入門

解説

RCS (Revision Control System) は、ファイルのリビジョンを複数管理します。 RCS は格納、取り出し、ログ、識別、リビジョンの併合を自動化します。RCS は頻繁に更新されるテキスト、たとえば、プログラム、ドキュメント、 グラフィックス、論文、定型手紙等を扱うのに便利です。

基本的なユーザインタフェースはとても単純です。初心者は 2 つのコマンド、 ci(1) と co(1) を覚えるだけで使用できます。 ci はチェックイン ``check in'' を省略した名前です。これは、ファイルの内容を 「RCS ファイル」と呼ばれる記録用のファイルに格納します。 RCS ファイルは、特定ファイルの全リビジョンを含んでいます。 co はチェックアウト``check out'' を省略した名前です。 これは、RCS ファイルからリビジョンを取り出します。

  • テキストの複数のリビジョンの保存と取り出しを行います。RCS は すべての古いリビジョンを効率的な方法で保存します。 ファイルを変更しても 元のリビジョンが失なわれることはなく、いずれも取り出すことが 可能です。リビジョンは、リビジョン番号、シンボル名、日付、作者、 状態を指定して取り出せます。
  • 完全な変更の履歴を管理します。RCS は、すべての変更点を自動的に 記録します。各リビジョンの内容とともに、作者、チェックインした日時、 変更点を要約したログメッセージが記録されます。 ログによって、どのような変更が行われたのかがひと目でわかります。 ソースリストを見比べたり、一緒に作業している プログラマにたずねたりする必要はありません。
  • アクセス矛盾を解決します。複数のプログラマがあるファイルの 同じリビジョンに対して変更を加えようとした場合、 RCS は警告を発し、他者が行った変更を台無しにしてしまう のを防ぎます。
  • リビジョンの木を管理します。RCS はモジュールごとに独立した 開発ラインを管理できます。 RCS は、リビジョンの系図を表現した木を保存します。
  • リビジョンを併合し、矛盾を解決します。あるモジュールの 2 つの リビジョンを併合することができます。 併合しようとする 2 つのリビジョンが、あるコードの同じ部分に 対する変更を含んでいた場合、RCS は変更が重複していると警告します。
  • リリースと構成を管理します。リビジョンにはシンボル名を つけることができます。また、「リリース版(released)」、「安定版(stable)」、 「実験版(experimental)」といった状態をつけることもできます。 これにより、単純かつ直接的にモジュールの構成を表すことができます
  • リビジョン番号、作成日時、作者等を自動的に識別することができます。 識別情報は、消印のようにテキストの適当な場所に埋め込むことが できます。これにより、あるソフトウェアの構成に どのモジュールのどのリビジョンが使用されているかを 判断することが容易になります。
  • 必要なディスク容量を最小にします。RCS は、リビジョンのために 最小のスペース(差分のみ)しか消費しません。もし途中のリビジョンが 削除されたなら、記録されていた差分もそれに従って小さくなります。

RCS の管理下に置きたい f.c というファイルがあるとします。もし、まだ作成していなければ、 RCS ディレクトリを以下のコマンドにより作成します。

mkdir RCS

次に ci (チェックイン) コマンドを実行します。

ci f.c

これにより、 f.c の内容をリビジョン 1.1 として記録 した RCS ファイルが RCS ディレクトリ内に 作成され、 f.c は削除されます。また、 cif.c に 関する説明文の入力を促します。 説明文にはファイルの内容を要約して書きます。 以降 ci を実行するたびに、ファイルに加えた変更の要約を入力するように促します。

RCS ディレクトリにあるファイルは RCS ファイルと呼ばれ、 それ以外のファイルはワークファイルと 呼ばれます。先の例で挙げたワークファイル f.c を取り戻す には co (チェックアウト) コマンドを実行します。

co f.c

このコマンドは RCS ファイル中の最新のリビジョンを取り出してファイル f.c に書き出します。 もし、 f.c に変更を加えたければ、次のコマンドを使ってチェックアウトしロック しなければいけません。

co -l f.c

これで f.c を編集することができます。

ある程度編集したところで、どのような変更を加えたか 知りたくなるときがあります。 この場合は、以下のコマンドを実行します。

rcsdiff f.c

このコマンドは、最後にチェックインしたリビジョンと ワークファイルの違いを表示します。編集が終わったら、 以下のコマンドにより、もう一度チェックインすることができます。

ci f.c

これにより、リビジョン番号が自動的に付け直されます。

もし ci

ci error: no lock set by your name

というエラーメッセージを出力したなら、 それは、ロックせずにチェックアウトしたファイルを チェックインしようとしたからです。もちろん、 ここでロックしチェックアウトし直すのでは遅すぎます。 ここでチェックアウトすると、あなたが行った編集は 上書きされて失われてしまうからです。 かわりに、以下のコマンドを実行します。

rcs -l f.c

これは、ほかに誰もロックしていなければ、最新のリビジョンを ロックします。もし、すでに誰かがロックしてしまっていたなら、 その人と相談しなければなりません。

ロックすることにより、あなただけがファイルを更新(チェックイン) できるようになり、同時に複数の人が同じファイルを編集する際の 厄介な問題を回避することができます。たとえリビジョンが ロックされていても、そのファイルをチェックアウトして内容を見たり、 コンパイルすることは可能です。ロック機構は、ロックした人 以外が チェックイン できないようにするだけです。

もし扱う RCS ファイルが個人的なもの、すなわち そのファイルに対して新しいリビジョンをチェックインするのが あなただけである場合、厳格なロック機構は必要ないでしょう。 厳格なロック機構はオフにすることもできます。 もし厳格なロックモードがオフになっているなら、 RCS ファイルの所有者はロックしていないファイルをチェックイン することができます(それ以外の人はロックが必要です)。 厳格なロックモードのオンとオフは、 それぞれ以下のコマンドにより行います。

rcs -L f.c 及び rcs -U f.c

もしワークディレクトリに RCS ファイルをまき散らしたく ないなら、RCS という名前のディレクトリを作成し、RCS ファイルを すべてその下に移動します。RCS コマンドは RCS ファイルを探すとき、 まず、 RCS ディレクトリを検索します。この場合も、これまでに述べてきたコマンドは 引数をいっさい変更せずに実行できます(実際は RCSRCS ファイルと ワークファイルの対を指示する方法は 3 通りあります: (a) 両方を指定する、(b) ワークファイルのみを指定する、 (c) RCS ファイルのみを指定する。RCS ファイルとワークファイルは 自由なパスに置くことができますが、RCS コマンドはファイルの対を インテリジェントに探します)。

チェックインしたときにワークファイルが削除されないようにする (編集を続けたり、コンパイルしたりする場合)には以下のコマンドを使います。

ci -l f.c あるいは ci -u f.c

これらのコマンドは通常どおり f.c をチェックインします。しかし、自動的にチェックアウトも行います。 最初の例ではロックを行い、2 番目の例ではロックを行いません。 このようにすればチェックアウト操作を 1 回省けます。 最初の例は編集を続ける場合に、2 番目の例は単にファイルを 読みたかったりコンパイルしたりする場合に便利です。どちらの場合も、 ワークファイル中の識別用マーカ(後述)が更新されます。

ci にチェックインするリビジョンの番号を指定することができます。 それまでのリビジョンが 1.1、1.2、1.3... だったときに、以下の コマンドによりリリース2 を開始することができます。

ci -r2 f.c あるいは ci -r2.1 f.c

これにより、新しいリビジョンには番号 2.1 がつけられます。以降、 ci はこの ファイルの新しいリビジョンに 2.2、2.3...と番号をつけていきます。 対応した以下の co コマンド

co -r2 f.c 及び co -r2.1 f.c

は、リビジョン番号が 2.x である最新のリビジョン、リビジョン 2.1 をそれぞれ チェックアウトします。 co にリビジョン番号を指定しない場合、幹(trunk)の上の最新のリビジョン (すなわち、x.x の形式で最大のリビジョン番号を持つリビジョン)が チェックアウトされます。リビジョンの枝(branch)を用いるためには 3 つ 以上の番号が必要になります。 たとえば、1.3 から枝を作成するには、以下のコマンドを実行します。

ci -r1.3.1 f.c

これにより、リビジョン 1.3 上に番号 1 の枝を作成し、 枝上の最新リビジョンとして 1.3.1.1 を割り当てます。 枝の詳細については rcsfile(5) を参照してください。

RCS は、リビジョンの識別のために特別な文字列をソースや オブジェクトコードに埋め込むことができます。 リビジョンの識別を行うためには、以下の文字列(マーク)

$Id$

をコメントなどのテキスト部分に書きます。 RCS は、このマークを次の形式の文字列に置換します。

$Id: ファイル名 リビジョン 日付 時刻 作者 状態 $

このようなマークをモジュールのソースコードの 1 ページ目に 置くことにより、編集しているファイルのリビジョンを すぐに判断することができます。RCS はマークの更新を自動的に行います。 マークをオブジェクトコードに組み込むには、それをリテラルな 文字列中に含めます。C 言語では、以下のようにします。

static char rcsid[] = "$Id$";

ident コマンドは、オブジェクトファイルやダンプ出力からもマークを探し表示することが できます。従って ident コマンドを用いることにより、あるプログラムがどのモジュールの どのリビジョンによって作成されたかを知ることができます。

マーク $Log$ をテキストやコメント内に含めることも有用かもしれません。 このマークはチェックインのときに要求されたログを蓄えていきます。 これにより、変更の履歴を直接、ファイルに記録することができます。 RCS にはほかにもいくつかのマークがあります。詳しくは co(1) を参照してください。

作者

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