[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を取るときもタグが使えます。 が、生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の際には

ファイル単位でではなく、全体でどんなタグが存在するのかの一覧も 一発では取れません。

ファイルが複数のディレクトリにまたがるようになると 加速度的にややこしくなってくるので、 生RCSだけでの複数ファイル管理は、せいぜい単一ディレクトリに ぶちまけてあるファイル群に対してだけとなりそうです。

実は CVS もほとんど同じ管理方式をとっているので、 ここまで使いこなせれば CVS の版管理の方針というか 変なところなどの理解も早い気がします。
「タグ」て述べてますがこれは CVS 用語ですな… RCS では "symbolic name" となっています。

タグ名をファイル中に残す

$Name$ がこのために用意されています (co(1))。 が、単なる co では置換されなくて、 明示的に co -rRELEASE_1_0 としないと $Name: RELEASE_1_0 $ になってくれません。


かべ@sra−tohoku.co.jp