[RCS超入門] [RCS中級講座] [RCS上級講座] [RCS邪級講座]
$Id: rcstagging.html,v 1.4 2003/12/14 20:29:52 kabe Exp $
RCSは複数ファイルの扱いは苦手なんですが、 普段はめったに使うことのない名前つきタグを使えば、 ある程度までは「まとめる」ことができます。
例: Makefile, hello.1, hello.c をまとめてみます。
% ident Makefile hello.1 hello.c Makefile: $Id: Makefile,v 1.1 2002-01-22 05:17:58+09 kabe Exp $ hello.1: $Id: hello.1,v 1.3 2002-01-22 05:20:05+09 kabe Exp $ hello.c: $Id: hello.c,v 1.5 2002-01-22 05:23:39+09 kabe Exp $
版番は全部バラバラですが、これらにまとめて "RELEASE_1_0" とタグを打ちます。 タグは単なる文字列で RCSにとっては 意味はないので、 "Release-1-0" "version1_0" とかでもかまいません。 命名方針は人間が決める。 ("."は普通の版番号用なので使用不可)
% rcs -nRELEASE_1_0: Makefile hello.1 hello.c RCS file: RCS/Makefile,v done RCS file: RCS/hello.1,v done RCS file: RCS/hello.c,v done
-nRELEASE_1_0: の最後の コロン が重要です。 コロンの後には本来は版番がつきますが、それを省略しているということ。 コロンを忘れると「タグ消去」になりますが、 そもそもタグを登録してないので "warning: can't delete nonexisting symbol" と 言われます。
注意:コロン後の版番省略ということは、つまり 全ファイルについて省略値の「デフォルト枝の最新版」を 指定していることになります。 それ以外の版番についてタグを打ちたいときは、 個別のファイルについて -nRELEASE_1_0b:1.3.2 hello.c などとしていちいち明示する必要があります。 だから実質的に RCS のタグ打ちは 「最新版のスナップショットをとる」 以外の用途には使えない。
つけたタグを rlog の "symbolic names:" 欄で確認してみます。
% rlog hello.c ... symbolic names: RELEASE_1_0: 1.5 ...
この symbolic names: だけ を表示するオプションてのがなぜかない。 表示しない (rlog -N) てのはあるのだが…
この状態で何ができるかというと、版番の指定に 番号 (1.5) 以外にタグ名 (RELEASE_1_0) が使えるようになります。
% co -rRELEASE_1_0 -l hello.c RCS/hello.c,v --> hello.c revision 1.5 (locked) done
単一ファイルだとほとんどありがたみがないですが、複数ファイルで 異なる版番に同じ名前を割り当てられるので、 RELEASE_1_0版のファイルを一発で取り出すことができます。
% co -rRELEASE_1_0 Makefile hello.1 hello.c RCS/Makefile,v --> Makefile revision 1.1 done RCS/hello.1,v --> hello.1 revision 1.3 done RCS/hello.c,v --> hello.c revision 1.5 done
diffを取るときもタグが使えます。 が、生diffだと出力にファイル名がつかないので、context(-c) かunified(-u) でないと混乱します。 (ファイルの改名・消去・追加には対応できないような…)
% rcsdiff -u -rRELEASE_1_0 -rRELEASE_1_1 RCS/*,v =================================================================== RCS file: RCS/Makefile,v =================================================================== RCS file: RCS/hello.1,v =================================================================== RCS file: RCS/hello.c,v retrieving revision 1.5 retrieving revision 2.2 diff -u -r2.1 -r2.2 --- hello.c 2002-01-22 05:27:32+09 1.5 +++ hello.c 2002-01-22 05:30:51+09 2.2 ...
上の例でもなんとなくわかるかもしれませんが、 RELEASE_1_0 を構成するファイルが何か、てのまでは RCS では管理していません。 基本的には単一ファイルでの管理のままです。 ので、一網打尽取り出し・登録・diffの際には
co RCS/*,v
などとやって無理やり全部なめる
ファイル単位でではなく、全体でどんなタグが存在するのかの一覧も 一発では取れません。
ファイルが複数のディレクトリにまたがるようになると 加速度的にややこしくなってくるので、 生RCSだけでの複数ファイル管理は、せいぜい単一ディレクトリに ぶちまけてあるファイル群に対してだけとなりそうです。
実は CVS もほとんど同じ管理方式をとっているので、 ここまで使いこなせれば CVS の版管理の方針というか 変なところなどの理解も早い気がします。
「タグ」て述べてますがこれは CVS 用語ですな… RCS では "symbolic name" となっています。
$Name$ がこのために用意されています (co(1))。 が、単なる co では置換されなくて、 明示的に co -rRELEASE_1_0 としないと $Name: RELEASE_1_0 $ になってくれません。