バージョン管理システムRCS使用法まとめ

バージョン管理システムRCS(Revision Control System)を使おう考えたので、使用方法をまとめる。

かなり古いツールで、機能は限定されているけれど、その分シンプルで、個人的には気に入っている。

概要

  • RCSの基本的な流れ
  • 初期登録
  • チェックイン
  • チェックアウト
  • 差分の確認
  • 変更履歴の表示
  • 特定リビジョンの取出し
  • RCSマーカーの抽出

RCSの基本的な流れ

   ファイルを管理対象に登録
        ↓
   →→→→→+
  ↑     ↓
  ↑  ファイルをロック
  ↑     ↓
  ↑     編集
  ↑     ↓
  ↑ ファイルをアンロック
  ↑     ↓
   ←←←←←

初期登録

以下のコマンドを実行し、ファイルをバージョン管理の対象として登録する。

ファイルのパーミッションは、登録時の値がベースとなるため、スクリプトに実行権限を付けたい場合は、初期登録前に付加しておく。

$ mkdir ./RCS
$ ci -i -l file

mkdir ./RCSは、実行しなくてもOK。

RCSディレクトリを作成した場合、バージョン情報を管理するRCSファイル(file,v)は、その中に格納される

RCSディレクトリを作成していない場合、RCSファイルは、fileのあるディレクトリに作成されるので注意。

ci -i -l fileを実行した際、ファイルに関する説明の入力を求められる。

(きちんと注意文も表示されるが、ここで入力するのはログメッセージではない点に注意)

RCS/file,v  <--  file
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>>

エディタedと同様に、'.'だけを入力し、改行することで、入力終了になる。

>> RCSテスト用ファイル
>> .
initial revision: 1.1
done

初期登録が終了したら、fileを編集することができる。

編集が終わったら、次のチェックインの手順へ進む。


チェックイン

ファイルの編集が終わり、変更内容をRCSファイルに更新する(チェックイン)場合は、ciコマンドを使う。

$ ci -l file

RCS/file,v <-- file
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>>

ログメッセージの入力が要求されるので、変更の要約を入力する。

入力の終了は、初期登録時と同じく、'.'だけの行を入力する。

>> チェックインテスト
>> .
done

ログメッセージの入力後、ファイルはロックされ、パーミッションは644に変更される。

そのため、引続きfileの編集をおこなうことができる。

ファイルの変更をこれ以上おこなわない場合は、'-l'(-l:lock)の代わりに、'-u'(-u:unlock)オプションを付けてciコマンドを実行する。

$ ci -u file

'-u'オプションを付けた場合、ファイルはアンロックされ、パーミッションは444に変更される。


チェックアウト

RCSファイルから、fileを閲覧・編集用として取出す(チェックアウト)場合は、coコマンドを使う。

$ co file       # fileを閲覧用に取出す
$ co -l file # fileを編集用に取出す

閲覧用にチェックアウトした場合、fileのパーミッションは、444に変更される。

'-l'オプションを付けて、編集用にチェックアウトした場合、fileのパーミッションは、644に変更される。

特定のリビジョンを取出す方法は、特定リビジョンの取出し_ の項目で解説する。


差分の確認

リビジョン毎の差分を確認したい場合は、rcsdiffコマンドを使う。

rcsdiffは通常のdiffを呼出すので、diffの大半のオプションはそのまま使用できる。

オプション無しで実行する場合は、チェックアウト中のfileと、最新リビジョンの差分を表示する。

$ rcsdiff file
===================================================================
RCS file: RCS/file,v
retrieving revision 1.2
diff -r1.2 file
2a3
> hogehoge

'-r'オプションを使うと、特定のリビジョンとの差分を表示することができる。

$ rcsdiff -r1.1 file        # リビジョン1.1のfileと、チェックアウト中のfileの差分を表示する。
$ rcsdiff -r1.1 -r1.2 file # リビジョン1.1のfileと、リビジョン1.2のfileをの差分を表示する。

変更履歴の表示

変更履歴を表示したい場合は、rlogコマンドを使う。

履歴のタイムスタンプはデフォルトだとUTCで表示されてしまう。

そのため、'-zLT'(-zLT:zone LocalTime)オプションを付けて、localtimeで表示するようにしておく。

$ rlog -zLT file

毎回オプションを入力するのは面倒なので、シェルの設定ファイルでエイリアスしておくと便利。

alias rlog='rlog -zLT'

特定リビジョンの取出し

特定のリビジョンを取出したい場合は、以下の手順で作業をおこなう。

まず、ciコマンドでチェックインし、fileをアンロックしておく。

次に、'-r'オプションにリビジョン番号を付けて、coコマンドを使う。

$ ci -u file            # fileをチェックイン・アンロックする
$ co -r1.2 -l file # リビジョン1.2をチェックアウトする
RCS/file,v --> file
revision 1.2 (locked)
done

既存のfileを上書きしたくない場合は、'-p'オプションを付けて、表示内容をリダイレクトする。

$ co -r1.2 -p file > other_file

編集後、チェックインすると、ブランチが作成される。

今回の例では、リビジョン1.2をブランチ1.2.1としてチェックインする。

ブランチ1.2.1では、リビジョン番号は1.2.1.1から開始される。

$ ci -u file
RCS/file,v <-- file
new revision: 1.2.1.1; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>>

ブランチをチェックアウトする場合、リビジョン番号(もしくはブランチ)を明示する必要がある。

$ co -r1.2.1 -l file

ブランチを新たにトランクとしたい場合、ciとrcsコマンドを使う。

今回の例では、トランクのリビジョン番号は1.5であるので、ブランチを1.6として登録する。

$ rlog -h file | grep head
head: 1.5

作業は、ブランチのアンロック、トランクのロック、最新リビジョンのチェックイン、の順番でおこなう。

$ ci -u -r1.2.1 file        # まず、ブランチ1.2.1のfileをアンロックしておく
$ rcs -l -b file # 次に、トランクをロックしておく
RCS file: RCS/file,v
1.5 locked
done
$ ci -u file # 最後に、fileを最新リビジョンとしてチェックインする
RCS/file,v <-- file
new revision: 1.6; previous revision: 1.5
enter log message, terminated with single '.' or end of file:
>>
...

ブランチと並行してトランクを編集していた場合は、rcsmergeコマンドを使う。

rcsmergeの使い方は、マニュアル"man rcsmerge"を参照する。

(RCSでは、ブランチとトランクを同時進行でいじらない方が良いと思う。複雑なブランチを作るのに向いていないので。)


RCSマーカーの抽出

RCSでは、ファイル内に'$'で囲まれた特殊なキーワードが存在する場合、それを特定の情報に展開する機能を持つ。

特殊キーワードは、主に"$Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $"が使用される。(他の特殊キーワードは、man identを参照)

特殊キーワードは、チェックイン時に自動的に展開される。

$ cat test.txt        # 特殊キーワード展開前
// $Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $
hogehoge
...

$ ci -u test.txt
...

$ cat test.c # 特殊キーワード展開後
// $Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $
hogehoge
...

デフォルトでは、時刻はUTCとして展開されてしまう点に注意。

ci実行時に'-zLT'オプションを付けておけば、localtimeとして展開する。

こちらもrlogと同様に、シェルの設定ファイルでエイリアスしておくと便利。

alias ci='ci -zLT'

展開した特殊キーワードのみを抽出したい場合は、identコマンドを使う。

identは、オブジェクトファイルやコンパイル後のバイナリにも使用することもできる。

(C言語の場合、文字列"rcsid"を使えば可能)

$ cat test.c
#include <stdio.h>
static const char rcsid[] = "$Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $";

int main(int argc, char const* argv[])
...

$ ident test.out
test.out:
$Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $


特定の言語使用時の注意点

PerlPrologなどでは、チェックイン時に、ソース内の変数変数が特殊キーワードとして誤認識され、展開されてしまうことがある。

また、LaTeXでは、逆に特殊キーワードがマクロとして処理されてしまうことがある。

以下、誤認識される恐れのあるキーワード一覧。

  • $Author$
  • $Date$
  • $Header$
  • $Id$
  • $Locker$
  • $Log$
  • $Name$
  • $RCSfile$
  • $Revision$
  • $Source$
  • $State$

LaTeXの場合は、スタイルファイル: rcs.styを使えば、簡単に解決可能。 (rcs.styはTeX Liveに含まれている)

以下、rcs.styの使用例。

プリアンブル部分でrcs.styを読込み、本文中でRCSマクロを使う。

\documentclass{jsarticle}
\usepackage{amsmath, amssymb}

\usepackage{rcs} % rcs.styを読込む

% ----- ここまでプリアンブル -----

\begin{document}
% --------- ここから本文 ---------
\RCS $Id: rcs_tutorial.rst,v 1.6 2014/05/25 07:51:00 gin Exp gin $ % "\RCS $keyword$"の形式で使う
\section{ほげ}
ほげほげ

\section{ぴよ}
ぴよぴよ

\end{document}


参考にしたもの

ドキュメント
  • man rcsintro
  • man rcs
  • man ci
  • man co
  • man rcsdiff
  • man rlog
  • man ident
  • man rcsfile

RCSのマニュアルは、けっこう充実している。

rcsintroは、基本的な使用法が簡潔にまとめられているので、一度は目を通しておくと良いと思う。


Webサイト
  • Ultimate Beginner's Guide to RCSRCS 超入門、〈http://vega.sra-tohoku.co.jp/~kabe/vsd/rcs/rcs.html

    RCSを使うための、必要最低限の操作法を紹介している。
    また、上記サイトは、中・上級向けのRCS管理テクニックも紹介している。
  • Nobwak's Lair:リビジョン管理rcsのすすめ(xxx.conf.20130829とかはもう止めよう)、〈http://april.fool.jp/blogs/?p=2195

    RCSを使うための、基本的な操作法を紹介している。
    このページの内容は、本記事と大体同じ。
  • www.naney.org:RCS FAQ(Japanese Page)、〈http://www.naney.org/comp/rcs/faq/

    RCSに関するよくある質問をまとめている。
    RCSを使っていて困ったことがある場合、殆どのケースはこのページを見れば解決できると思う。
    また、LaTeXにおける特殊キーワードの対策法は、こちらのサイトを参考にした。

雑感

  • 最低でも ci -uと co -lを知っていれば、なんとかなると思う

  • RCSは、シングルユーザかつ単一のファイルを扱う場合でないと使いづらい

=> 時代錯誤な仕様だけれど、シンプルで分かりやすいので、ちょっとしたファイルの管理用と割切って使うなら、逆に便利だと思う

  • RCSは、複雑なブランチを作ろうとすると、けっこう面倒

=> 複雑なブランチを作りたい場合は、素直に他のVCSを使ったほうが良いかもしれない