ksaitoの日記

日々試したことの覚え書き

RCSは、意外と便利かも

移転しました。

自動的にリダイレクトします。

/etc以下にあるような設定ファイルをRCSで管理すると以外と便利です。
バージョン管理というとCVSSubversionを思い浮かべるでしょう。間違ってもSCCSやRCSが出てくることはありません。
SCCSやRCSは、CVSが登場するまえからあったバージョン管理の仕組みです。
さすがにSCCSを使おうとは思いませんが、RCSは、用途によっては使えます。

例えば、SOHO環境では、/etc/hostsや/etc/aliasesで名前解決やメールのエイリアスを管理しているケースがあると思います。
こうしたファイルを編集するときに、Subversionを使おうとは思いません。せいぜい、下記のように日付付きのファイルコピーを作成して修正してしまいます。

$ cd /etc
$ sudo cp hosts hosts.'date -I'
$ vi hosts
 ... 編集&確認
$

これも、悪くはないのですが、気がつくと日付つきのファイルが山ほどできてしまいます。

RCSで管理するには、次のようにします。

$ cd /etc
$ sudo mkdir RCS ... (1)
$ ci -l hosts ... (2)
$ vi hosts
 ... 編集&確認
$ ci -l hosts
# cd /etc
# mkdir RCS ... (1)
# ci -l hosts ... (2)
RCS/hosts,v  <--  hosts
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> added hosts.
>> .
initial revision: 1.1
done
# vi hosts ... (3)
 ... 編集&確認
# ci -l hosts ... (4)
RCS/hosts,v  <--  hosts
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>> added linx10.
>> .
done
#

(1)と(2)は、初回のみ実行する処理でCVSSubversionのimportにあたります。
普段は、(3)と(4)をやります。
RCSの管理は、日付コピー方式とほぼ同じ手間で、日付付きファイルが増殖せずコメントが残せます。
必要になるコマンドをいくつか紹介します。

履歴を表示する

rlogコマンドでチェックインされているリビジョンとコメントを見ることができます。

# rlog hosts

RCS file: RCS/hosts,v
Working file: hosts
head: 1.2
branch:
locks: strict
        root: 1.2
access list:
symbolic names:
keyword substitution: kv
total revisions: 2;     selected revisions: 2
description:
added hosts.
----------------------------
revision 1.2    locked by: root;
date: 2007/12/08 16:44:20;  author: root;  state: Exp;  lines: +1 -0
test
----------------------------
revision 1.1
date: 2007/12/08 16:39:31;  author: root;  state: Exp;
Initial revision
=============================================================================
#

何を編集しているか確認する

自分が何を編集しているのかを確認する方法です。健忘症というわけではないのですが...
ちょっとした手違いで、なにか必要なものを消してしまうミスはあるものです。

# rcsdiff -u hosts
===================================================================
RCS file: RCS/hosts,v
retrieving revision 1.2
diff -u -r1.2 hosts
--- hosts       2007/12/08 16:44:20     1.2
+++ hosts       2007/12/08 16:53:28
@@ -1,4 +1,3 @@
-127.0.0.1      localhost

 # The following lines are desirable for IPv6 capable hosts
#

編集を破棄する

やっぱりやめたにしたいことは良くあります。

# co -l hosts
RCS/hosts,v  -->  hosts
revision 1.2 (locked)
writable hosts exists; remove it? [ny](n): y
done
# rcsdiff -u hosts
===================================================================
RCS file: RCS/hosts,v
retrieving revision 1.2
diff -u -r1.2 hosts
# grep localhost hosts
127.0.0.1       localhost
::1     ip6-localhost ip6-loopback
#

changelogファイルを作る

rcs2logコマンドを使ってchangelogファイルを作ることができます。

# rcs2log hosts
2007-12-09  root  <root@debian>

        * hosts: test

        * hosts: New file.

#

他には

RCSは、特定のバージョン間の差分を確認したり以前のバージョンを戻すといった基本的なこともできます。でも、今回より込み入った使い方が必要になるケースはないでしょう。
また、RCSは、ブランチのような高度で複雑な機能を持っています。CVSのブランチより複雑なので、使いこなすことができません。
バックアップに関しては、CVSSubversionのようにサーバ間でリポジトリを複製するような便利な方法がありません。通常のファイルシステムのバックアップを計画する必要があります。