[ Webmasters コラム 目次 ]
Webmasters コラム (2000/3/8)

CVS のすすめ

はじめに

Webmasters によって編集されている、ここ「日本の Linux 情報」は CVS (Concurrent Versions System) によって管理されています。 私が Webmasters に参加した時にはまだ CVS を使ったことがありませんでしたので、 まさに「日本の Linux 情報」を編集するために勉強したようなものでした。 しかし、そのおかげで CVS の便利さを知り、 今では様々な場面で CVS を活用しています。

「 CVS に興味はあるけど…」、「ちょっと面倒そうだな…」 なんて思って、まだ CVS を使っていない人が、 「ちょっとやってみるかな」 という第一歩になればと、このコラムを書きました。

ですから、ここでは概要と簡単な使い方のみを紹介しています。 CVS のより詳細な内容が知りたくなった場合には 他の CVS のドキュメントを参照してみてください。

CVS とは

CVS とはネットワークに対応したバージョン管理システムで、 ネットワークを介して複数人で目的とするコンテンツのバージョンを 管理することが出来ます。

例えば、「日本の Linux 情報」の Web ページも複数の Webmasters によって CVS を用いて編集されていますし、 Gnome 、 Apache や Samba などのオープンソースソフトウェアのソースファイルも CVS を用いて複数の開発者により編集されています。

1 つのコンテンツが複数人によって別々に編集された場合なども、 編集が衝突したことを CVS が教えてくれますし、 簡単な衝突ならば吸収してくれる場合もあります。

また、コンテンツのバージョンを CVS が一元的に管理してくれるため、 任意のバージョンをいつでも取り出せますし、 コンテンツの以前の状態を参照することもできます。

これら、衝突回避とバージョン管理の 2 点が CVS を使う利点なのです。

CVS の仕組み

CVS 管理対象のコンテンツは CVS リポジトリによって管理されています。 CVS リポジトリはローカルマシンにあっても ネットワーク越しの他のマシンにあっても同様にアクセスすることができます。 ここでは、コンテンツそのものと変更点や変更日時などの情報が CVS リポジトリに保存され管理されている、 と思って頂ければよいです。

CVS を用いた編集作業の一般的な手順は、

  1. CVS リポジトリよりコンテンツを手元の作業ディレクトリに取り寄せる
  2. 手元のコンテンツを編集する。
  3. CVS リポジトリへ編集を反映する

となります。

コンテンツを手元に取り寄せるのがミソです。 もし、 1 つのコンテンツを複数人で編集する場合には、 他の人に上書きされないように他者による書き込みをロックするなどの 排他処理をほどこさねばならず、 誰かが編集している間は他の人は編集することができません。 しかし、 CVS では各人が手元にコピーを作り編集するので、 そのようなロックは必要なく、 誰かのために自分の編集作業を止められることがありません。 1 つのコンテンツに別々の編集がなされた場合には、 各人がその編集を CVS リポジトリに反映する時にマージ作業を行なうからです。

CVS で扱うコンテンツはファイルです。 コンテンツとするファイルはテキストでも画像などのバイナリでもよいです。 ただし、テキストファイルの場合には、 各バージョン間での差分などを見ることができますが、 バイナリファイルの場合には、差分は管理されないので バージョン単位にファイル丸ごとの扱いになるところが違うので注意が必要です。

また、 CVS リポジトリにはアクセス制限をかけることができます。 CVS リポジトリにアクセスするユーザごとに制限を設定できますので、 取り寄せることはできるけれども反映はできない、 といった CVS リポジトリにすることもできます。 (オープンソースソフトウェアで配布用に公開しているものなどがそうですね)

使ってみる

さっそく、 CVS を使ってみましょう。 もし、 CVS がまだインストールされていない場合には、 RingServer プロジェクト などから最新の CVS を入手しインストールしてください (2000 年 2 月現在では cvs-1.10.tar.gz が最新です) 。

   % configure; make; su; make install
  

でできるはずです。 RedHat 系や Debian 系のディストリビューションではパッケージが 用意されていると思いますので探してみてください。

CVS リポジトリの作成

GNOME など既に存在するよその CVS リポジトリを利用することもできますが、 ここではローカルマシン上に CVS リポジトリを作ります。 準備として、まずは CVS リポジトリを自分のマシンに作成しましょう。

ここでは、/home/yoshi/work/test/ を作業ディレクトリとし、 CVS リポジトリは/home/yoshi/cvs に作ることにします。 上記 2 つはお好きなディレクトリで構いません。 その場合は、そのディレクトリ名に置き換えて読み進めてください。

まず、 CVS リポジトリの場所を環境変数で指定します。

   $ export CVSROOT=/home/yoshi/cvs       [bourne shell 系の場合]
   % setenv CVSROOT /home/yoshi/cvs       [csh 系の場合]
  

そして、 CVS リポジトリを作成します。

   % cvs init
  

これで CVS が使用する各種管理ファイルが/home/yoshi/cvs/配下に作成されます。 作成された各ファイルについては、通常は気にしなくてよいでしょう。

CVS リポジトリにコンテンツを登録する

練習用に適当な画像ファイルとテキストファイルをいくつか用意してください。 ここでは例として、 image.jpg, text1.txt, text2.txt の 3 つを使います。

用意した練習用の 3 つのファイルを/home/yoshi/work/test/に置き、 そこへ移動します。

   % cd /home/yoshi/work/test
   % ls
   image.jpg    text1.txt    text2.txt
  

これらを CVS リポジトリに登録します。 カレントディレクトリにあるものを CVS リポジトリに登録するには、 import コマンドを使います。

   % cvs import -m 'これからはCVSで管理します' test yoshi start
  

としてください。 これでコンテンツ (3 つのファイル) が、 CVS リポジトリに登録されます。 ここで、それぞれの引数 (パラメータ) の意味は次のとおりです。

cvs import:
登録するための CVS コマンドです。
-m 'これからはCVSで管理します':
コメントです。
test:
モジュール名です。 CVS リポジトリの中でのディレクトリ名と思ってください。
yoshi:
ベンダ名。省略できませんので任意の文字列を指定してください。
start:
リリースタグ。省略できませんので任意の文字列を指定してください。

これで用意した 3 つのファイルが、 CVS リポジトリに格納されました。

ここでつけたコメントは cvs log コマンドなどで参照されます。 なるべく具体的なコメントをつけるようにしましょう。 -m 引数を省略して実行すると、エディタが立ち上がり、 そこで残したいメッセージをエディタで入力することになります。

なお、 CVS が起動するエディタを指定することもできます。 CVSEDITOR という環境変数に好きなエディタのコマンド名を設定して おくとよいでしょう。

では、一旦これらを消してしまいましょう。

   % rm -rf /home/yoshi/work/test
  

コンテンツを CVS リポジトリから取り出す

では、コンテンツを取り出してみましょう (CVS の仕組みで述べた一般的手順の 1 番) 。 CVS リポジトリからコンテンツを取り出すにはファイル名を指定しますが、 モジュール名を指定した場合には、そのモジュールに含まれるファイルが 全て取り出されます。 先程、 test というモジュール名で登録したのでそれを指定します。

カレントディレクトリの下に新たにモジュール名のディレクトリが 作成されますので、 CVS コマンドを実行する際のディレクトリは、 それを考慮して、あらかじめ移動しておいてください。

   % cd /home/yoshi/work
   % cvs checkout test
   cvs checkout: Updating test
   U test/image.jpg
   U test/text1.txt
   U test/text2.txt
  

これで、カレントディレクトリの下に test というディレクトリが新たに作成され、 その中にコンテンツが置かれます。 checkout というのが取り出すための CVS コマンドです。 引数としてファイル名を指定することができます。

また、 CVS は基本的にファイル名を引数にとりますが、 ファイル名が与えられなかった場合、 CVS は . を与えられたものとして動作します。 上記の場合は、カレントディレクトリ (再帰的にサブディレクトリを含みます) が 指定されたものとして動作します。

ですから、

   % cvs checkout test/image.jpg
  

と 1 ファイルだけを取り出すことももちろんできるのです。

参考までに、 CVS で Web ページを管理していて その CVS リポジトリからコンテンツを Web サーバへ反映するには 一体どうしているのかというと、 Web サーバのコンテンツを置くディレクトリに cron などを用いて定期的に cvs checkout をする、 という方法により実現しています。

手元のコピーと CVS リポジトリを同期させる

今新たに作成された test というディレクトリは CVS の一時作業ディレクトリですので、 用が済んだら消してしまっても構いません。 しかし、その場合、再び編集をするには同じように checkout して、 全てのコンテンツを再び取り出さなくてはなりません。

ですから、一般的には作業ディレクトリは削除しません。 2 度目以降にコンテンツを編集する時には、再び作業ディレクトリに移動し、

   % cvs update
  

とするだけでよいのです。 CVS リポジトリとその作業ディレクトリとを比較し、 変更のあったファイルのみが取り出されます。

この場合、引数は必要ありません。なぜなら、 作業ディレクトリには CVS リポジトリがどこにあるのかなどの情報が 保存されているからです。 この例では/home/yoshi/work/test/CVS というディレクトリに保存されています。 このディレクトリは消さないようにしましょう。

試しに作業ディレクトリからファイルを 1 つ消してみて 再度取り出してみましょう。

   % cd /home/yoshi/work/test
   % rm text1.txt
   % cvs update
   cvs update: Updating .
   cvs update: warning: text1.txt was lost
   U text1.txt
  

CVS リポジトリと比較するとファイルが 1 つ足りないので、

   U text1.txt
  

と、ファイルが 1 つ取り出されました。

コンテンツを編集する

取り出したコンテンツを編集してみましょう (CVS の仕組みで述べた一般的手順の 2 番) 。 vi や emacs などのエディタを使って編集します。 後述する commit をするまでは CVS リポジトリには反映されませんから、 気軽に好きなように編集できます。

   % vi test1.txt
  

ここでは text1.txt に何か 1 行書き加えるなどしてから保存しておいてください。

CVS リポジトリとの差分を見る

手元のコピーと CVS リポジトリとの差分を見ることできます。 手元のコピーに編集をしていて、どのくらいの編集を入れたのか、 CVS リポジトリに格納されているものと比べてどんな違いがあるのか、 を見ることができます。

   % cvs diff text1.txt
   Index: text1.txt
   ===================================================================
   RCS file: /home/yoshi/work/test/text1.txt,v
   retrieving revision 1.1.1.1
   diff -u -r1.1.1.1 text1.txt
   --- text1.txt   2000/02/29 16:15:58     1.1.1.1
   +++ text1.txt   2000/02/29 16:18:14
   @@ -1,2 +1,2 @@
   -最初のファイルです。
   + 最初の修正です。
  

「最初のファイルです。」という行が「最初の修正です。」 と書き換えられていることが分かります。

ディレクトリやファイルを追加する

新たにディレクトリやファイルを増やすことももちろんできます。 例えば、新たにサブディレクトリを作り、そこにテキストと画像を 置きたいとします。その場合は次のようにしてください。

  1. ディレクトリを作ります
       % cd /home/yoshi/work/test
       % mkdir newdir
        
  2. ディレクトリを作ったことを CVS に伝えます
       % cvs add newdir
        
  3. ファイルを作ります
       % cd newdir
       % (例えば、 vi text3.txt などでファイルを作成する)
       % (例えば、 cp ~/image2.jpg . などでファイルをコピーする)
        
  4. ファイルが増えたことを CVS に伝えます
       % cvs add text3.txt
       % cvs add -kb image2.jpg
        

ここで -kb とは"バイナリファイルである"ことを示す引数です。 CVS は基本的にテキストのバージョンを差分で管理しますので、 バイナリファイルの時には明示してあげる必要があるのです。

こうすることで、ディレクトリとファイルを増やすことができます。 また、 add する時に-kb 引数をつけ忘れたとしても、

   % cvs admin -kb image2.jpg
  

として、あとから変更することもできます。

なお、 CVS コマンド全般に言えることですが、 ファイル名の指定にはワイルドカードを使うことができますので、

   % cvs add ./* 
  

といった指定も可能です。

編集を反映する

一連の編集が済んだら手元の作業ディレクトリにあるコンテンツに加えた変更を CVS リポジトリへ反映しなくてはなりません (CVS の仕組みで述べた一般的手順の 3 番) 。 コンテンツへの変更はこのコマンドを発行するまでは CVS リポジトリに反映されません。 反映するための CVS コマンドは commit です。

   % cd /home/yoshi/work/test/newdir
   % cvs commit -m 'ちょっと編集したコンテンツです' text1.txt
   % cvs commit -m '新たに追加したコンテンツです' text3.txt image2.jpg 
  

とすることで、 「ちょっと編集したコンテンツです」というコメントで text1.txt を、 「新たに追加したコンテンツです」というコメントで text3.txt と image2.jpg を CVS リポジトリに反映 (commit) することができます。

cvs add は追加と削除を CVS リポジトリに通知するだけですので、 それらを反映するには必ず cvs commit も行ってください。

編集の履歴を見る

コンテンツに加えられた編集の履歴を見ることができます。

   % cd /home/yoshi/work/test
   % cvs log text1.txt
  

これで text1.txt に加えられた変更の履歴を見ることができます。 誰が編集したのかや commit 時のコメントなどを見ることができます。

これで基本的なコマンドを一通り使ってみたことになります。

参考 URL

おわりに

ポイントをかいつまんで説明してみましたが、 CVS とはどんなものかは掴んで頂けたでしょうか? また、使ってみることはできたでしょうか?

Web ページを編集/管理する、プログラムのソースファイルを編集/管理する、 などなど、グループ/個人を問わず、コンテンツを管理する様々な場面で CVS は有効と思われます。 このコラムを足掛かりに CVS に興味を持って頂ければ幸いです。

(荒井美憲 yoshi@ylug.org)

[ ホーム | マップ | ニュース | 検索 | ドキュメント | リンク | プロジェクト ]
このサイトに関するご意見・ご要望は Webmasters までお願い致します.