エディタを使って「もの」を書くときには何度も書き足し、書き直せる。 直しているつもりが余計おかしくなったりすることもあるので、 書き直す前のものを保存しておきたいこともよくある。
このような場合には、一つのファイルを新規に作成したときから、現在、未来 に渡って希望する時点の全てのバージョンを記録できるツールを利用する。 これをリビジョン管理システム といい、大切なファイルを 作成する場合には欠かせないものである。
RCS (Revision Control System) を使うと、 プログラムのソースやテキストファイル形式の文書の任意の時点の状態を保存で き、あとから任意のリビジョンを取り出すことができる。RCSを利用してリビジョン 管理する場合の流れは以下のようになる。
(このリビジョンを保存したいと思ったときに)
登録したいファイルを チェックイン する。
そのまま編集作業を続ける
そののち、以前に登録していたリビジョンを参照したいときには、
などの操作ができる。
RCSを使うためには、管理したいファイルのあるディレクトリに
RCS
というディレクトリを作成しておく。RCS
ディレクトリは、管理したいファイルの全てのリビジョンを保存する
特別なファイルを格納するために使われる。RCS
ディレクトリ
を作成しなくてもRCSは利用できるが、管理ファイルが散乱するので
かならず
mkdir RCS
しておこう。ただし、Emacs で最初のチェックイン(下記参照)を行なう場合には自動的に作成される。
編集するファイルをRCS管理下に置くには、チェックイン という作 業を行なう。チェックインすると、現在のファイルの内容が登録される。チェッ クインした場合、元のファイルは一時的に「読み取り専用」モードになり編集禁 止状態になる。編集を続けるには、チェックアウト という作業を行な う。チェックアウトすることで、ファイルが読み書きできるようになる。 したがって、ファイルをRCS管理するときの編集の流れは、
編集 → チェックイン ↑ ↓ チェックアウト ← 保存
のようになる。ファイルをチェックインするときには、そのときまでに やった作業の簡単な説明を書くことができる。
Emacsを利用してファイルをRCS管理するととても簡単である。
C-x v v をタイプすると説明を入れるバッファが あらわれるので、メモとなる適当な言葉を入れて(省略可能) C-c C-c をタイプする
C-x v v をふたたびタイプする。
キー操作として、C-x v v だけを覚えておけばよい。 実際にやってみよう。
ここで、foo.html
をRCS管理するやり方を追ってみよう。
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>
ファイルが書けたら保存しておく。
C-x v vをタイプする。初回にチェックインすると
そのファイルがRCS管理されるようになる。チェックインされた状態では
ファイルが書き込み禁止属性になり、修正が禁止される。
書き込み禁止になると、ミニバッファに %%
記号が出る。
以後の編集は、チェックインとチェックアウトを繰り返しながら進める。
ファイルが書き込み禁止の場合は、チェックインされた状態である。 チェックアウトのために C-x v v する。これで 編集が可能になる。
新しい文章を書き加えよう。以下のように修正する。
<!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>
追加が終わったら保存する。
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 でチェックインが 完了する。
以上、チェックインとチェックアウトを繰り返していく。
過去にチェックインしたものをいつでも取り出せる。そのときには、 チェックインしたときのログメッセージが手がかりとなる。
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
直前のリビジョンとの差分を見るには 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 g | Annotate |
C-x v = | 直前のリビジョンとの差分を見る |
C-u C-x v = | 指定したリビジョンとの差分を見る |
RCSの全ての機能を利用するにはコマンドを利用する。
チェックインには、ci
コマンドを使う。
ci [オプション] ファイル
ファイルをチェックインする。よく使うオプションは以下のとおり。
-u
チェックインした後ファイルを消さない(デフォルトは消す)
-l
チェックインした後すぐにチェックアウトして編集を 継続できるようにする
-nシンボリック名
チェックインするリビジョンにシンボリック名 という名前をつける。普通のリビジョンは1.1から始まる リビジョン番号がつくが、数字だけなので何番がどういう版 なのか覚えられない。そのため、これはと思うリビジョンに 好きな名前を付けることができる。ただし英数記号の空白のない 単語に限る。その後のチェックアウト操作などでリビジョン番号 を指定するときに、数字ではなくこのシンボリック名 を指定しても同じリビジョンを指定したことになる。
ci
するとログメッセージの入力を求めてくる。
簡単なメッセージを入れたら、最後にピリオドだけの行を入れて終了する。
チェックアウトには、co
コマンドを使う。
co [オプション] ファイル
ファイルをチェックアウトする。よく使うオプションは以下のとおり。
-rリビジョン
指定したリビジョン 番号のファイルを取り出す。
-pリビジョン
指定したリビジョン のファイルを 標準出力に書き出す。中だけ見たいときに
co -p1.1 foo.html | less
などとするとディスク上の foo.html
はそのままで
リビジョン 1.1 の foo.html
を見ることができる。
古いバージョンのものを別ファイルに保存したければ、
co -p1.2 foo.html > foo-1.2.html
のようにすればよく、この例ではリビジョン1.2の
foo.html
が、
foo-1.2.html
という名前で保存される。
-D日付け
指定した日付け のリビジョンを取り出す。
-D"2003/06/05 18:00"
のように指定する。時刻指定
を省略するとUTC(協定世界時刻)の0時(日本時間午前9時)が指定された
ものとみなされる。
リビジョンの番号の部分には ci -n
で付けた
シンボリック名も(もし付けていれば)利用できる。
指定したリビジョンとの差分を見るには rcsdiff
コマンド
を使う。
とするとリビジョン の時点のものと現在のファイル の差分が表示される。
rcs
コマンドで保存してある修正履歴に手を加えたりする
操作ができる。とくに重要なオプションだけ挙げておく。
rcs オプション ファイル
有用なオプションは以下のとおり。
-l
ファイル
ファイルに修正を加えるためにロックする。
チェックアウトする前に編集を始めてしまったときには、
rcs -l ファイル
してから
保存する。
-u
ファイル
ロックを解除する。-l
でかけたロックを
外すときに使う。
-nシンボリック名:リビジョン
指定したリビジョンにシンボリック名 をつける。
-mリビジョン:メッセージ
指定したリビジョンのログメッセージを メッセージに変更する。
C-x v = でソースの変更した箇所を調べたときに出てきた 内容は GNU diff 形式 という。テキストファイルの変更点のみを 記したもので、元のファイルがどんなに大きくても、修正点が少なければ diff形式はその部分だけで済む。大きなソースを配布する場合に 新しいリビジョンの変更点のみをdiff形式で配布することにより、 とても少ない通信量で済ませることができる。
diff -ua 旧ファイル 新ファイル > file.diff
として差分を file.diff
に保存する。相手側が
旧ファイル を持っていた場合相手側では
patch < file.diff
とすると、手元にあるファイルが新しいものに書き換えられる。
yuuji@koeki-u.ac.jp