意外と知られていないようですが (気のせい?) Emacs で RCS (や SCCS) を使うことができます (もちろん M-! ci foo [RET] とかじゃなくてね)。 Emacs で RCS を使うと非常に便利です。 なにせ RCS 関連のたくさんのコマンドを覚えずに済みます。 ところが、私の探し方が悪かったのか、日本語で解説が書かれている web page が見あたりませんでした。 ってなわけで、書いてみました。
読む際には以下の点について注意して下さい :
ちなみに私は ci, co, rcsdiff くらいは知ってますが、細かい option とか、lock 云々は良く分かりません f(^_^; (自分が勉強するつもりじゃなきゃこんな文章書きませんって :-) まぁその程度の知識で良いってことです。ハイ。
なお、この文章は、Emacs の Info の Version Control を参照しつつ書いています。 必要に応じて (あるいはこの文章がアヤしいと思ったら :-) そちらも参照して下さい。
RCS を使うってことは、
とりあえず、これだけで最低限の RCS に関する作業はできるでしょう。
なお通常、ファイルはチェックアウト時に lock され、他の人が編集できない状態になります (つまりファイルを編集できるのは 1 人だけ)。 チェックイン時には lock がはずされ、他の人が (lock をして) そのファイルを編集できる状態になります。
古い revision との比較をするためには主に以下のコマンドを使います。
このとき directory を指定すると、その directory 以下で登録されているすべてのファイルの差分を取ります
スナップショットって何か御存知ですか? まず、それを説明しましょう。なぜかって? それは私がこれを書くまで良く知らなかったからです :-)
ここでのスナップショットというのは、あるディレクトリー以下の登録された ファイル群の、あるバージョンのことです。 自分で言うのもなんですが、さっぱり分かりませんね。 では、Emacs Manual での原文を見てみましょう。
A snapshot is a named set of file versions (one for each registered file) that you can treat as a unit.やっぱり良く分かりません。 え? 分かりました? そういう人は次に進んで下さい。 分からない人の為に、具体的に説明しましょう。
いま、foo というアプリケーションを作成しているとします。 この foo は foo.c, bar.c, foo.h の 3 つのファイルから構成 (というか make されるというか) されるものとします。 これらのファイルが、あるディレクトリーに、
drwxr-xr-x 2 p-katoh user 512 Feb 15 19:14 RCS
-r--r--r-- 1 p-katoh user 2513 Feb 15 19:14 bar.c (Rev. 1.1)
-r--r--r-- 1 p-katoh user 10196 Feb 15 19:09 foo.c (Rev. 1.3)
-r--r--r-- 1 p-katoh user 875 Feb 15 18:11 foo.h (Rev. 1.2)
のように存在しているとします (最後に書いてあるのはそれぞれの revision)。
さて、これらを (例えば beta release として) 配布したいとしましょう。 それぞれ revision が異なるので、管理が面倒くさそうですね。 そんなときにスナップショットを作ります。 この「状態」 (bar.c の revison が 1.1 で, foo.c が 1.3 で...) に名前を付けます。 例えば snapshot1 (安易だなぁ) としましょう。 これが「アプリケーション foo」の「snapshot1」という名前の スナップショットということになります。
当然、この後もこれらのファイルに変更が加えられるでしょう。 そしてまた、ある程度まとまったら次のスナップショットを作ります。 もちろん「snapshot2」という名前のスナップショットですね :-)
こうやっていけば、一群のファイルの revision を統一することなく管理できます。 便利便利。 しかも、「snapshot1 と snapshot2 の差分を取る」なんてこともできます (C-x v = (vc-diff) で revision を入力するときに snapshot の名前を入力するだけです)。 さぁ、スナップショットを活用しましょう。
スナップショットを作る為のコマンドは次の通りです :
(*1) 通常の使い方をしていれば、チェックインした時点で lock がはずされます (たぶん)。
よく、(特に GNU の) アーカイヴを持ってきて展開すると ChangeLog ってのがありますね。 これって一々自分で作ってると思いますか? 実は私はそう思っていました f(^_^; もちろんそうやってつくっている人もいるでしょうけど、 Emacs には ChangeLog を作るための機構が (VC とは別に) あるのです。 それについての詳細はここでは説明しませんので、info の File: emacs, Node: Change Log などを参照して下さい。
VC を使っているときには、以下のコマンドであっという間に Change Log ができあがります。
なお、Change Log は
Wed Apr 1 08:57:59 1992 Nathaniel Bowditch <nat@apn.org>
* vc.texinfo: Fix expansion typos.
* vc.el, vc-hooks.el: Don't call expand-file-name.
のようにエントリーを 1 行おきに表示します。
これを、
Wed Apr 1 08:57:59 1992 Nathaniel Bowditch <nat@apn.org>
* vc.texinfo: Fix expansion typos.
* vc.el, vc-hooks.el: Don't call expand-file-name.
のようにしたい場合には、
チェックインのときの log を入力する際に、
{expand} Fix expansion typos.
のように書きます (他のファイルについても同様に書きます)。
(`{expand}' の意味するところは私は知りません。誰か教えて下さい。)
またチェックインのときに入力した log が # ではじまっている場合は Change Log には書かれません。
ここまできたら、いろいろカスタマイズしたいですよね。 それは当然の欲求です。 というわけで関係する変数 (の一部) です。
大雑把に、変更すると便利そうな変数から、特に変更の必要のなさそうな順番に 並べてあります (当然私の主観による判断です)。
(setq diff-switches "-u")などととしておくと良いでしょう。 名前から分かるように VC 固有の変数ではないことに注意しましょう。
'((SCCS "%W%") (RCS "$Id$"))
となってます。
(("\\.c$" .
"\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
#endif /* lint */\n"))
のように書きます。
これは「ファイル名が .c で終わっているときに M-x vc-insert-headers
とすると、
#ifndef lint
static char vcid[] = "$Id$";
#endif /* lint */
が挿入される (RCS の場合)」ことを意味します。
この例でも分かるように、`%s' は
vc-header-alist
で指定されたヘッダーで置き換えられます。
Running ci on /home/p-katoh/foo.txt...のように表示されます。
Running ci...OK
(setq vc-default-back-end 'SCCS)のようにします。
また、変数ではありませんが、コメントに日本語を使いたい場合は、
(define-program-coding-system nil "ci" (cons *euc-japan* *euc-japan*)) (define-program-coding-system nil "rcs" (cons *euc-japan* *euc-japan*))のようにすると良いようです (mule 2.3 の場合。それ以外は分かりません)。
ここまでで出てこなかったコマンドについてまとめて紹介しましょう。
思いのほか長くなってしまいましたが (こんなに詳しく書くつもりは全然無かったのですが...)、いかがですか? RCS のコマンド群を覚えなくても revision control ができるなんてとっても嬉しいですね。 え、その分 Emacs のコマンドを覚えなきゃならない? そんなことありません。 最低でも C-x v v だけ知っていれば十分です。 あとは必要になったときに使っていけば、自然に覚えていくもんです。 なんでもかんでも Emacs 上でやる。 これが基本です (ちょっと嘘かも)。
さて随所に書きましたが、私自身 RCS に詳しいわけではないので、この文書にも 随分誤りがあるのではないかと思われます。 特にスナップショットに関しては、少々自信がありません。 間違っているところを発見されましたら、ぜひ p-katoh@shiratori.riec.tohoku.ac.jp までメールして下さい。
Emacs 上で使うために pcl-cvs というのがあります。 (新しめの) CVS のアーカイヴに含まれています。 そのうち、pcl-cvs についても書く予定です (がいつになるか...)