WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

RCS の使用方法

今回は、RCS というバージョン管理ツールについて書こう思います。RCS についてよく知っているという方は、おそらくかなりの猛者でしょう(笑)。 RCS は最初期に開発されたバージョン管理システムで、単一のファイルのバージョン管理を行う非常にシンプルなプログラムです。最近の同種のシステムのように複数のファイルで構成されたプロジェクトを効率よく管理することはできませんし、ネットワーク越しに複数のユーザーが使用することもできません。もちろん GUI なんてあるはずもありません・・・と思ったらあったΣ(‾□‾;

まぁそんなわけで(?)、 RCS は非常にシンプルなバージョン管理システムで、最近ではあまり使われなくなっています。なぜそのようなプログラムをご紹介するかというと、 Gentoo Linux の新しい設定ファイル更新ツールである dispatch-conf で採用されたからです。 dispatch-conf が保存する履歴から過去のファイルを取り出すには、どうしても RCS を使う必要があります(通常ファイルで保存するように設定すれば別ですが)。

また、久々に使ってみて思ったのですが、高機能なバージョン管理システムよりも RCS を使うほうが便利な場面は意外とあるかもしれません。 RCS は単一ファイルに対するバージョン管理が前提なので、リポジトリなどを準備する必要もなく、すぐに使い始めることができます。わざわざリポジトリを作る手間はかけたくないけど、ちょっとこのファイルの更新履歴を保存しておきたい、なんてときには最適です。おそらく dispatch-conf での採用理由もこのあたりでしょう。

RCS のインストール方法

Gentoo Linux で RCS をインストールするには、以下のように emerge を実行します。

emerge -n app-text/rcs

-n オプションを付けているので、もし既に RCS がインストールされている場合はなにもしません。これだけでインストールは完了です。

基本的な操作方法

まず最初に、あるファイルのバージョン管理を開始して更新履歴を残すための基本的な手順をご紹介します。

バージョン管理の開始

RCS でバージョン管理を始めるときは、単純に対象のファイルをチェックインするだけです。チェックインとは、現在のファイルの状態を履歴に登録する操作で、 RCS では ci というコマンドを使用します。例えば、カレントディレクトリにある "foo" というファイルのバージョン管理を始めるなら、以下のようにします。

ci foo

実行すると、ファイルの説明を入力するように促してきます。適当に入力して、最後に '.'(ピリオド)だけの行を入力すると、チェックインが完了します。

ファイルをチェックインすると、"foo,v" というファイルが作成され、元のファイル("foo")は削除されます。この "foo,v" が RCS ファイルで、この中に更新履歴が全て保存されます。この RCS ファイルが元のファイルと紛らわしいと感じる場合は、あらかじめ同じディレクトリに "RCS" というディレクトリを作っておけば、その中に RCS ファイルが作成されます。

この場合は元ファイルが削除されてしまいましたが、元ファイルを残したままチェックインすることも可能です。その方法は後述の「変更をチェックインする」を参照してください。

ファイル内容をチェックアウトする

RCS ファイルに保存されたファイル内容はいつでも取り出すことができます。この取り出す作業を「チェックアウト」と呼びます。参照用にファイルをチェックアウトするには、以下のように co コマンドを実行します。

co foo

すると、先ほどチェックインしたのと同じ内容で "foo" が作成されます。この場合は参照用にチェックアウトしているので、書き込み属性がオフになっています。書き込み可能な状態でファイルをチェックアウトするには、ファイルを「ロック」する必要があります。それには、-l オプションつきで co コマンドを実行します。

co -l foo

こうすることで書き込み可能な状態でファイルが作成され、後述の「チェックイン」で新しいリビジョンを登録できるようになります。このようにファイルをロックするのは、複数のユーザーで同じファイルを変更してしまうのを避けるためです。あるユーザーがロックしている間は別のユーザーはロックできません(強制的にロックを解除する方法もありますが)。

変更をチェックインする

チェックアウトしたファイルに対する変更をチェックインするには、前述のとおり ci コマンドを実行します。

ci foo

これで現在の "foo" の内容が最新のリビジョンとして RCS ファイルに登録されます。同時に、"foo" に対して設定されていたロックは解除され、"foo" は削除されます。チェックイン後も "foo" が残るようにしたいなら、-u オプションを指定します。

ci -u foo

こうすると、"foo" が参照用に書き込み属性をオフにした状態で残ります。もしチェックイン後もファイルの変更を続けるなら、-l オプション付きでチェックインします。

ci -l foo

この場合は "foo" に対するロックが維持され、書き込み可能な状態で "foo" が残ります。

以上が基本的な RCS の使用方法です。シンプルですね(^^;

履歴情報の利用

RCS ファイルに記録した履歴情報はさまざまな方法で活用できます。代表的な利用方法を以下でご紹介します。

RCS のリビジョンについて

RCS では、すべての更新履歴にはリビジョンと呼ばれる番号が付加されて識別されます。履歴の中の特定のバージョンを指定する際は、このリビジョン番号を使用します。 RCS でのリビジョン番号は、以下のような構成になっています。

<メジャーバージョン>.<マイナーバージョン>

メジャーバージョンとマイナーバージョンは独立した数値なので混同しないでください。リビジョン 1.9 の次のリビジョンは 1.10 です。ci コマンドでリビジョン番号を指定しなければ、最新のリビジョンからマイナーバージョンをひとつ増やしたリビジョンにチェックインします。明示的に指定しなければ、メジャーバージョンが変わることはありません。

メジャーバージョンを変更する基準はとくにありませんが、内容に大きな変更があったときや、そのバージョンを正式に公開したときなどに変更するとよいでしょう。メジャーバージョンを変更するには、ci コマンドでリビジョンを明示的に指定します。例えば、以下のようにすれば "foo" がリビジョン 2.1 にチェックインされます。

ci -r2 foo

後述しますが、ブランチを作成した場合はリビジョン番号が "1.1.1.1" などのような 4 つの数値になります。

履歴のログを表示する

変更履歴のログを表示するには、rlog コマンドを使用します。以下のようにすると、"foo" の変更履歴が表示されます。

rlog foo

チェックイン時に指定したコメントやチェックインの日付などが参照できますので、取り出したいリビジョンを特定するのに役立ちます。

差分の表示

rcsdiff コマンドを使用すると、チェックアウト中のファイルの内容と最新リビジョン、特定の 2 つのリビジョンなどの間の差分を表示できます。単にファイル名だけ指定すれば、チェックアウトされているファイルの現在の内容と RCS ファイル中の最新リビジョンとの差分を表示します。

rcsdiff foo

リビジョン番号をひとつ指定すれば、そのリビジョンとチェックアウトされているファイルとの差分を表示します。

rcsdiff -r1.1 foo

リビジョンを 2 つ指定すれば、リビジョン間での差分が確認できます。

rcsdiff -r1.1 -r1.2 foo

いつ、どの部分を変更したかが確認できるので、非常に便利です。

過去のリビジョンを取り出す

履歴を残しても、過去のリビジョンが取り出せないことには意味がありません。それには、リビジョン指定付きで co コマンドを実行します。例えばリビジョン 1.1 の "foo" を取り出すには、以下のようにします。

co -r1.1 foo

また、日付指定もできます。

co -d'2006/01/01 00:00:00 LT' foo

こうすると、指定した日付の時点での最新リビジョンを取り出せます。日付の最後の "LT" は、日付がローカルタイムであることを示しています。これを指定しないと常に GMT であるとして解釈されます。

ロールバック

もし取り出した過去の内容を最新のリビジョンにチェックインしたいなら(ロールバック)、rcs コマンドを使ってロックを取得し、チェックインします。以下は、"foo" のリビジョン 1.1 を最新リビジョンとしてチェックインする手順です。

co -r1.1 foo
rcs -l foo
ci foo

ブランチ機能の利用

ときどき、あるファイルの複数のバージョンを平行して更新していきたい場合があります。例えば、プログラムに大きな変更を加えたいのだが、同時に旧バージョンのバグフィクスの要請があるかもしれない、というようなときですね。そのような場合には、ブランチを作成して複数のバージョンを平行して更新することができます。

RCS では、ブランチは特殊なリビジョン番号として実装されています。前述のとおり、通常のリビジョン番号はメジャーバージョンとマイナーバージョンの 2 つの数値から構成されますが、ブランチのリビジョンはさらに 2 つの数値を加えた 4 つの数値で構成されます。

4 つの数値は ci コマンドに明示的に指定するのでどんな数値でも指定できてしまいますが、通常は分岐のもとのリビジョンを使います。例えば、リビジョン 1.1 からブランチを作る場合は 1.1.1.1 とします。もし同じリビジョン 1.1 からもうひとつブランチを作る場合は、1.1.2.1 とするとよいでしょう。

ブランチを作成する

ブランチを作成する方法は、作成するブランチのリビジョン番号を指定してチェックインするだけです。例えば、"foo" の リビジョン 1.1 から 1.1.1 というブランチを作成するには、以下のようにします。

co -l1.1 foo
ci -r1.1.1 foo

リビジョン番号に数値を 3 つしか指定していませんが、この場合は 1.1.1 ブランチの最新リビジョンにチェックインするという扱いになります。ですので、もし 1.1.1 ブランチが存在しなければ 1.1.1.1 にチェックインされることになります。

ブランチのチェックイン・チェックアウト

ブランチの内容をチェックイン・チェックアウトするには、明示的にリビジョンを指定します。 RCS では、-r, -l といったオプションそれぞれにリビジョン番号を指定するという点に注意してください。例えば、1.1.1 ブランチの最新リビジョンをロックして取得するには、以下のようにします。

co -l1.1.1 foo

チェックイン時にもブランチを指定する必要があります。上記でチェックアウトした "foo" になんらかの変更を施し、また 1.1.1 ブランチにチェックインするためには、以下のようにします。

ci -r1.1.1 foo

rcs コマンドでデフォルトのブランチを変更することもできます。詳細は rcsコマンドの man ページをご覧ください。

他のブランチをマージする

rcsmerge コマンドを使うと、あるブランチで施した変更を別のブランチに適用できます。例えば、1.1.1 ブランチで行った変更をトランクにマージするには、以下のようにします。

co -l foo
rcsmerge -r1.1.1.1 -r1.1.1 foo
ci foo

ブランチによる平行作業の最後には必須の作業ですね。

その他の機能

そのほかにも、 RCS にはいろいろと便利な機能があります。どれもバージョン管理システムを使ったことのある方には馴染みのあるものでしょう。

シンボル(タグ)を作成する

特定のリビジョンに名前を付けて、簡単にアクセスできるようにする機能です。他のバージョン管理システムでは「タグ」と呼ばれることが多いですが、 RCS では「シンボル」と呼ぶようです。

シンボルを作成するには、ci コマンドか rcs コマンドに -N オプションを指定します。新しくチェックインするリビジョンにシンボルを割り当てる場合は ci、既存のリビジョンにシンボルを割り当てる場合は rcs コマンドを使用するとよいでしょう。

例えば、"foo" をチェックインする際にシンボルを指定するには、以下のようにします。

ci -N'SymbolName' foo

"foo" のリビジョン 1.1 にシンボルを割り当てる場合は以下のようにします。

rcs -N'SymbolName':1.1 foo

割り当てたシンボルはリビジョン番号とまったく同様に扱えます。例えば、"foo" の SymbolName に対応するリビジョンをチェックアウトするには、以下のようにします。

co -r'SymbolName' foo

リリースしたリビジョンを記録しておきたい場合などに使うとよいでしょう。

別のファイル名でのチェックアウト・チェックイン

ここまでは、元のファイル名に ",v" を付けたのが RCS ファイル、というように固定してきました。では、"foo,v" の最新リビジョンを "foo2" という名前でチェックアウトしたい、というような場合はどうすればいいのでしょうか。

その場合は、 RCS ファイルと出力先のファイル名を同時に指定します。以下のような感じです。

co foo foo,v

もし "RCS" ディレクトリを作って RCS ファイルを格納しているなら、そのパスを指定しなければなりません。

co foo RCS/foo,v

この指定方法は co コマンドだけでなく他の RCS 関連コマンドでも使用できます。また、ファイル名をフルパスなどで指定すれば、別のディレクトリに出力させることもできます。

キーワード置換について

RCS には、「キーワード置換」という機能があります。これは、バージョン管理しているファイル中の特定のパターンの文字列を、チェックアウト時に対応する内容に置き換えるものです。

例えば、"foo" の内容が以下のようになっていたとします。

$Header$

このファイルをチェックインし、すぐにチェックアウトしてみましょう。

ci foo
co foo

すると、"foo" の内容は以下のようになっているはずです(パスやユーザー名は場合によって違います)。

$Header: /tmp/foo,v 1.1 2006/03/17 18:40:11 hokousya Exp $

このように、$〜$ という形式の特定の文字列は、対応する各種情報に置き換わります。チェックインした日付やチェックインしたユーザーなどをファイルに記録しておきたい場合に便利です。どのようなキーワードが使用できるかは、co コマンドの man ページを参照してください。

しかし、ときにはこのキーワード置換が邪魔になるときがあります。例えば、バイナリファイルを扱う場合などは意図せずに置換されるパターンがファイルに含まれている可能性もあります。そのような場合は、キーワード置換を抑制できます。

co -ko foo

こうすると、foo の内容はチェックインのときそのままになるはずです。rcs コマンドを使用すると、デフォルトのキーワード展開モードを指定できます。"foo" に対してデフォルトでキーワード展開を抑制するには、以下のようにします。

rcs -ko foo

バイナリファイルに対しては、最初のチェックインの直後にこれを実行するのがよいでしょう。

以上、駆け足で RCS コマンドの使用方法をご紹介しました。これだけ知っていればほとんどの場合には事足りると思います。他にもさまざまな機能がありますが、それらは man ページなどをご参照ください。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles