リビジョン管理

エディタを使って「もの」を書くときには何度も書き足し、書き直せる。 直しているつもりが余計おかしくなったりすることもあるので、 書き直す前のものを保存しておきたいこともよくある。

このような場合には、一つのファイルを新規に作成したときから、現在、未来 に渡って希望する時点の全てのバージョンを記録できるツールを利用する。 これをリビジョン管理システム といい、大切なファイルを 作成する場合には欠かせないものである。

リビジョン管理システムRCS

RCS (Revision Control System) を使うと、 プログラムのソースやテキストファイル形式の文書の任意の時点の状態を保存で き、あとから任意のリビジョンを取り出すことができる。RCSを利用してリビジョン 管理する場合の流れは以下のようになる。

そののち、以前に登録していたリビジョンを参照したいときには、

などの操作ができる。

RCSの使い方

事前準備

RCSを使うためには、管理したいファイルのあるディレクトリに RCS というディレクトリを作成しておく。RCS ディレクトリは、管理したいファイルの全てのリビジョンを保存する 特別なファイルを格納するために使われる。RCSディレクトリ を作成しなくてもRCSは利用できるが、管理ファイルが散乱するので かならず

mkdir RCS

しておこう。ただし、Emacs で最初のチェックイン(下記参照)を行なう場合には自動的に作成される。

ファイルをRCSで管理する

編集するファイルをRCS管理下に置くには、チェックイン という作 業を行なう。チェックインすると、現在のファイルの内容が登録される。チェッ クインした場合、元のファイルは一時的に「読み取り専用」モードになり編集禁 止状態になる。編集を続けるには、チェックアウト という作業を行な う。チェックアウトすることで、ファイルが読み書きできるようになる。 したがって、ファイルをRCS管理するときの編集の流れは、

      編集       →   チェックイン
       ↑                ↓
チェックアウト   ←     保存

のようになる。ファイルをチェックインするときには、そのときまでに やった作業の簡単な説明を書くことができる。

Emacsを利用してファイルをRCS管理するととても簡単である。

キー操作として、C-x v v だけを覚えておけばよい。 実際にやってみよう。

ここで、foo.html をRCS管理するやり方を追ってみよう。

  1. foo.htmlを作成する

    簡単のためファイルの内容は以下のとおりとする。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <!-- $Id$ -->
    <html lang="ja">
    <head><title>foo!</title></head>
    <body>
    <h1>fooについて</h1>
    </body>
    </html>
    

    ファイルが書けたら保存しておく。

  2. チェックインする(初回)

    C-x v vをタイプする。初回にチェックインすると そのファイルがRCS管理されるようになる。チェックインされた状態では ファイルが書き込み禁止属性になり、修正が禁止される。 書き込み禁止になると、ミニバッファに %% 記号が出る。

    Read Only Mark in modeline of Emacs

    以後の編集は、チェックインとチェックアウトを繰り返しながら進める。

  3. チェックアウトする

    ファイルが書き込み禁止の場合は、チェックインされた状態である。 チェックアウトのために C-x v v する。これで 編集が可能になる。

  4. ソースを編集する

    新しい文章を書き加えよう。以下のように修正する。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <!-- $Id$ -->
    <html lang="ja">
    <head><title>foo!</title></head>
    <body>
    <h1>fooについて</h1>
    <p>fooは「ふー」と読みます。</p>
    </body>
    </html>
    

    追加が終わったら保存する。

  5. チェックインする

    C-x v vをタイプする。下半分にログメッセージを 入力するためのバッファが現れるので、ここに簡単なメモを残す。 面倒なら何も書かなくてよいが、あとでそのリビジョンを取り出す かもしれないときは分かりやすいメモを書いておく。C-x v v をタイプしたときに出てくるが、ログメッセージを書き終わったら C-c C-c をタイプする。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <!-- $Id$ -->
    <html lang="ja">
    <head><title>foo!</title></head>
    <body>
    <h1>fooについて</h1>
    <p>fooは「ふー」と読みます。</p>
    </body>
    </html>
    
    
    
    -[あ]-E.E:%%-F1  foo.html  ALL L7  RCS:1.1   (yahtml Fill)  [1]--
    読み方を足したよ
    
    
    

    ログメッセージを書いたら C-c C-c でチェックインが 完了する。

以上、チェックインとチェックアウトを繰り返していく。

過去のファイルの取り出し

過去にチェックインしたものをいつでも取り出せる。そのときには、 チェックインしたときのログメッセージが手がかりとなる。

  1. ログメッセージの一覧を見る

    C-x v l をタイプする(最後は log のエル)。 下のウィンドウに過去にチェックインしたときのログがあらわれる。

    RCS file: foo.html,v
    Working file: foo.html
    head: 1.2
    branch:
    locks: strict
    access list:
    symbolic names:
    keyword substitution: kv
    total revisions: 2;selected revisions: 2
    description:
    ----------------------------
    revision 1.2
    date: 2006/04/20 22:53:36;  author: yuuji;  state: Exp;  lines: +2 -1
    読み方を足したよ
    ----------------------------
    revision 1.1
    date: 2006/04/20 22:35:05;  author: yuuji;  state: Exp;
    Initial revision
    
  2. 現在のソースとの違いを見る

    直前のリビジョンとの差分を見るには C-x v = を タイプする。

    もっと古いリビジョンと比べたいときは、C-x v l の ログ一覧から比較したいリビジョンの Revision 番号を調べる。 番号を覚えておいて C-u C-x v = をタイプする。

    File or dir to diff: (default visited file) ~/public_html/
    (そのまま[Return])
    Older version: (default 1.2) 1.1
    (古いリビジョン番号を入力する)
    Newer version (default: current source): 
    (そのまま[Return])
    

    現在のソースとの比較結果が下のバッファにあらわれる。

    --- foo.html2006/04/20 22:35:051.1
    +++ foo.html2006/04/20 22:53:361.2
    @@ -1,8 +1,9 @@
     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    -<!-- $Id$ -->
    +<!-- $Id$ -->
     <html lang="ja">
     <head><title>foo!</title></head>
     <body>
     <h1>fooについて</h1>
    +<p>fooは「ふー」と読みます。</p>
     </body>
     </html>
    

    行の先頭にマイナスのついているのが、元のソースから消えた行、 プラスのついているのが新しい方に現れた行を意味する。

よく使う割り当てキーの一覧を示す。

C-x v vチェックイン or チェックアウト
C-x v lログ一覧を見る
C-x v gAnnotate
C-x v =直前のリビジョンとの差分を見る
C-u C-x v =指定したリビジョンとの差分を見る

コマンドラインからの利用

RCSの全ての機能を利用するにはコマンドを利用する。

チェックイン

チェックインには、ci コマンドを使う。

ci するとログメッセージの入力を求めてくる。 簡単なメッセージを入れたら、最後にピリオドだけの行を入れて終了する。

チェックアウト

チェックアウトには、co コマンドを使う。

差分生成

指定したリビジョンとの差分を見るには rcsdiff コマンド を使う。

rcsdiff -ua -rリビジョン ファイル

とするとリビジョン の時点のものと現在のファイル の差分が表示される。

rcs履歴ファイル管理

rcsコマンドで保存してある修正履歴に手を加えたりする 操作ができる。とくに重要なオプションだけ挙げておく。

diffとpatch

C-x v = でソースの変更した箇所を調べたときに出てきた 内容は GNU diff 形式 という。テキストファイルの変更点のみを 記したもので、元のファイルがどんなに大きくても、修正点が少なければ diff形式はその部分だけで済む。大きなソースを配布する場合に 新しいリビジョンの変更点のみをdiff形式で配布することにより、 とても少ない通信量で済ませることができる。

diff -ua 旧ファイル 新ファイル > file.diff

として差分を file.diff に保存する。相手側が 旧ファイル を持っていた場合相手側では

patch < file.diff

とすると、手元にあるファイルが新しいものに書き換えられる。

yuuji@koeki-u.ac.jp