Version Control (バージョンコントロール)

Emacs には、バージョンコントロールをするアプリケーションである RCS や CVS, SCCS などのインターフェースが附属しています。今時は CVS を使うことが一般的だと思いますが、以下は一応 RCS を想定してます。単純な使い方にはそんなに変わりはないと思いますが。

バージョンコントロールとは

単純に言うと、ファイルにどんな変更を施したかを記録するとか、複数の人が編集しているときに、同時に同じファイルを変更したりしないようにするためのものです。

「私はプログラムなんか書かないしー」とか「このマシンを使うのは私だけだしなー」とかいう人もシステムの設定ファイル変更を管理しておくと、いざという時に元に戻すのが簡単だし、たとえ普通の文章も、変更記録を取るとそれだけでやる気がおきたりすることもあります。:-)

RCS の使い方

まずはバージョンコントロールアプリケーションの使い方を、RCS を例に取って説明します。といってもほんの触りだけです。 RCS は GNU が配布しているもので、Linux や FreeBSD の主要な配布パッケージには大抵含まれているでしょう。より多くの人が関わるプロジェクトでは、同じく GNU の CVS がより便利らしいですが、ここでは深入りしません。(因みに CVS は RCS のコマンドを利用するらしいので、CVS を使うなら両方インストールする必要があるはず、と思ってたのですが、最近では中に取り込んでしまっているみたいです。)

さて、例えば hello.el というファイルを作成していて、これを RCS の管理下に置きたいとしましょう。(これを「登録する」と言います。) それには、

lucy$ ci hello.el

として "チェックイン" するだけです。すると、変更ログを書けとか言われるので適当に書きます。 行頭で . を押して改行を押せば、目出たくチェックイ ンできます。これ以降、このファイルを編集したい場合は

lucy$ co -l hello.el

として、チェックアウトします。-l はロック (lock) するためのオプションで、これで他人が同時に変更するのを防げます。前回のバージョンとの変更個 所を見たい場合は rcsdiff というコマンドを使います。

変更履歴を保存しているファイルは、元のファイル名に ,v を付けたものになっています。 これはそのままだと同じディレクトリに置かれますが、RCS という名前のサブディレクトリがあればそこに置かれるので、一箇所にまとめて置きたい場合には作成しておくと良いでしょう。

vc.el の使い方(その1)

上で説明で、具体的に RCS が何をするものかというイメージは掴めたと思いますので、これを Emacs からやってみましょう。例えば

(defun hello ()
  "Say hello."
  (message "hello world!"))

というファイルを書いたとしましょう。これを RCS の管理下に登録するには、C-x v i とします。 すると Note: file is write protected とか言ってきて、無事に登録できるはずです。

これ以降は、単に C-x C-q とタイプするだけで、チェックインしたり、チェックアウトしたりできます。このキーはもともとは Read-only かそうでないかを切り替えるキーですが、バージョンコントロール下に置かれている場合は、上の動作に置き換わるわけですね。

上の状態で C-x C-q としてチェックアウトしてから、上の関数をインタラクティブにしてみましょう。 2行目と3行目の間に、(interactive) を挿入します。 もう一度 C-x C-q とすると、*VC-log* というバッファが自動的に開きます。ここには自由に変更ログを書けます。 今回は「関数をインタラクティブにする。」とでも書きましょう。 書き終えたら C-c C-c とします。実際にはこの時点でチェックインされます。後は、これの繰り返しです。

変更ログに日本語を使うと文字化けするかもしれません。例えば mule-2.2@19.28 の場合なら .emacs

(set-default-process-coding-system *euc-japan* *euc-japan*)
(set-default-file-coding-system *euc-japan*unix)

と書いておくことで、文字化けしなくなるはずです。

vc.el の使い方(その2)

(その1) の説明だけで基本的には使えるはずですが、バージョンコントロールには他にもいろい ろと機能があります。割当てられているキーは C-x C-q の他は C-x v がプレフィクスキーになっています。いくつか挙げると、

C-x v h RCS のヘッダを挿入する。以後自動的にアップデートしてくれる。
C-x v u Undo です。前回チェックインした時の状態に戻す。
C-x v c チェックインのキャンセルです。最後のチェックインでの変更を取り消し。
C-x v a そのディレクトリの ChangeLog をアップデートする。
C-x v l 変更ログを表示する。
C-x v = バージョンの比較を行う。
C-x v ~ バージョン番号を入力すると、そのバージョンを見せてくれる。

なお、C-x v h で挿入されるヘッダですが、これはデフォルトでは

;    $Id: vc.html,v 1.4 2006/01/15 13:34:42 matsu Exp $

みたいな感じになっています。(その後 check in すると、適切に展開してくれる。) これを例えば Emacs Lisp なら

(defcounst filename-version "$Id")

みたいにカスタマイズしたい場合は、むしろ後で説明する autoinsert.el を使う方が良いでしょう。 こちらも標準でついています。

ちょっと私も調べきれてないのだけど、rcs -sStab とか、rcs -sRel みたい なことを Emacs から行うにはどうしたらいいのでしょうね。

これより詳しいことは Info の Emacs の VC の項を御覧下さい。


[Mule のページに戻る]