CVSの使い方

このページは、私が以前に情報処理センター(現: 総合情報センター)の ニュースレターに書いた記事を研究室内向けに再構成したものです。

はじめに

CVSはファイルのバージョンを管理し、コマンドひとつで必要なファイル のコピーを行なってくれるプログラムです。CVSを利用すれば、以前のバージョ ンが記録されているので、間違った更新をしてしまった時や記憶装置の障害が あった時などにも以前のバージョンを取り戻すことができます。 また、複数のコンピュータで作業をするときのファイルのコピーにも便利です。

CVSとは Concurrent Versions System の略で、文字通 りファイルのバージョンを管理するためのシステムです。もともとは、数人で 共同でプログラムを作成する時に、更新の衝突が起こらないようにするために 開発されたものです。衝突とは、ある人が更新した部分を他の人が古いバージョ ンのものに戻してしまう、といった現象を指します。しかし一人で使っても便利 なプログラムです。

CVSはリポジトリ(repository・倉庫)と呼ばれる場所に以前のバージョ ンの情報を含めたすべてのファイルを貯蔵します。リポジトリは通常 UNIXが 稼働するコンピュータに置かれ、そのコンピュータではCVSサーバとい うプログラムが動いている必要があります。研究室のサーバ ymir (ymir.eng.kagawa-u.ac.jp)には最初から入っています。一方、作業用ディレクトリから リポジトリにファイルを登録したり、リポジトリから作業用ディレクトリにファ イルを取り出したりするプログラム(CVSクライアント)は Windowsで も UNIXでも利用可能です。

CVSクライアントのインストール

CVSサーバは個人でインストールする必要はありませんので、CVSクライアント のWindows環境でのインストール方法を説明します。(UNIXだと最近は CVSクライアントは最初から入っている場合が多いです。)

Eclipseから使用する場合

CVSのクライアント機能が最初からEclipseに入っているので、特に新しくイ ンストールする必要はありません。

Cygwinを使う場合

Javaプログラム以外のファイルは Eclipseで管理しないと思うので、その 場合はCygwinに入っている CVSのクライアントを使いましょう。Cygwinとは Windows環境に移植されたUNIXのソフトウェアを集めたパッケージです。

Cygwinはhttp://www.cygwin.com/か らダウンロードできます。「Install Cygwin now」というアイコンを クリックするとダウンロードが始まります。ダウンロードした setup.exe というプログラムを実行するとインストールが始まりま す。途中 “Choose A Download Site”というところで追加のファイルをダウ ンロードするサイトを選ぶ必要があります。適当な日本のサイトを選んでおけ ば良いでしょう。(ただし、どうも途中でフリーズするサイトがあるようなので、 そのばあいは一旦キャンセルして、他のサイトでやり直しましょう。)

インストールは基本的に「次へ」を押して行くだけです。途中、 “Select Packages”というところで「Devel」のなかの「cvs」をクリック してチェックの入っている状態にしておく必要があります。また同じところで 「Net」のなかの「openssh」もチェックしておきます(すると「openssl」なども同時にチェッ クの入った状態になるはずです)。

インストールが終了するとデスクトップやスタートメニューの中に、Cygwinと いうアイコンができています。これをダブルクリックすると、CVSやSSHのコマン ドが実行可能な環境が現れます。

Cygwinの環境では、パスの区切りは Windows流の「¥」ではなく UNIXと同じ「/」であり、アルファベットの大文字と小文字は区別さ れることに注意する必要があります。また、Cygwinの環境ではWindowsのある フォルダ(既定値ではC:¥cygwin¥)をルート(/) としてみなして、基本的にはその下にあるファイルしか見えないようになって います。しかし、実は cd /cygdrive/c とすれば、Windowsの C:¥ に移動するようになっています。これを利用すれば「マイ ドキュ メント」の下のディレクトリをCVSで管理することも可能です。

なお安全のため、CVSで管理するファイル名やディレクトリ名は英数字などキー ボードから直接打てる文字に限定しておくようにします。漢字などを使うと、 サーバ (UNIX) とクライアント (Windows)の漢字コードの違いでトラブルにな る可能性があります。

リポジトリの作成

ここでは、CVSを最初に使う時にしておかなければならない事柄を説明します。 以下の例では ymir(ymir.eng.kagawa-u.ac.jp)に、gennaiというユー ザがリポジトリを作成しようとしていると仮定します。

環境変数の設定

まず、リポジトリの場所を環境変数 で設定する必要があります。環境 変数の設定方法は使用しているシェルにより異なりますが、ここでは最近の Linuxの標準のbash系のコマンドを示します。

リポジトリの作成はクライアントPC(自分のノートPCなど)からでもできます が、パスワードの入力などが面倒なので、以下ではymirにログイン して作成すると仮定します。以下の説明ではクライアントPCを host1と呼びま す。

host1$ ssh gennai@ymir.eng.kagawa-u.ac.jp

リポジトリを置きたいところのパスが/home/gennai/cvsrootのと きに、CVSROOT環境変数にこのパスを指定します。

ymir$ export CVSROOT=/home/gennai/cvsroot

リポジトリの初期化

CVSを使うためには何よりも前にリポジトリを初期化する必要があります。初 期化はinitというコマンドを用います。

ymir$ cvs init  

このコマンドは、特に何もメッセージも出ず終了します。実はこのとき、リポ ジトリに指定したディレクトリに CVSを管理するための CVSROOT と いうディレクトリができています。

モジュールの作成

モジュールの作成はimportというコマンドを使用します。CVSをソフトウェア の開発などに利用する時は、プロジェクト毎にモジュールをつくれば良いので すが、個人で使用するには最初に一つだけモジュールを作成して、あとはこの モジュールにすべてのディレクトリやファイルを追加して行く方が楽でしょう。

モジュールの作成はimportというコマンドを使います。まず空のディレクトリ (名前は何でも良い)を作成して、そのディレクトリに移動(cd) し、以下のコマンドを実行します。

ymir$ cvs import -m "My First Module" mymodule gennai mymodule_0_1

-mのあとはログに残すコメントです。ここでは"My First Module" としています。面倒ならば別に空文字列("")でも構 いません。

mymoduleはモジュール名です。自分の好きな名前に適宜変更して下 さい。ただし CVSサーバはUNIXなので、モジュール名は基本的に英数字のみを 使用するようにします。モジュール名と同じ名前のディレクトリがリポジトリ に生成され、カレントディレクトリにあるファイルがリポジトリに登録されま す。

つまり、カレントディレクトリが空のディレクトリではなく、ファイルを存在すれば、 そのファイルが最初にモジュールに追加されるのですが、その場合不要なファイルを いれておかないように注意する必要があります。要らないファイルがリポジト リに登録されるのが嫌なので、さっき空のディレクトリに移動したわけです。

gennai, mymodule_0_1はそれぞれベンダータグ、リリース タグです。ベンダータグ、リリースタグはCVSをソフトウェアの開発プロジェ クトに利用する時には意味がありますが、個人で使用する時には適当なものを つけておけば良いでしょう。上記の例では、それぞれ自分のアカウント名とモ ジュール名_0_1 にしていますが、この部分も適宜変更して下さい。

自分のコンピュータでの準備作業(Eclipseの場合)

プロジェクトをCVSに登録する

  1. 「プロジェクト・エクスプローラー」でCVSで管理したいプロジェクトを右ク リックし「チーム」―「プロジェクトの共用」をクリックします。
  2. ダイアログで「リポジトリー・タイプ」として「CVS」を選択し、「次へ」を クリックします。
  3. 次の「CVSリポジトリーとのプロジェクトの共用」で「新しいリポジトリー・ ロケーションを作成」を選択して、「次へ」をクリックします。
  4. 次の「リポジトリー・ロケーション情報の入力」で必要な情報を入力します。 ここまでの例の通りだとすると、次のようになります。
    項目入力
    ホストymir.eng.kagawa-u.ac.jp
    リポジトリー・パス/home/gennai/cvsroot
    ユーザーgennai
    接続タイプextssh
    「パスワード」は空欄のまま残しておき、「デフォルト・ポートを使用」の方 をチェックします。「パスワードの保管」はチェックしないでおきます。 「次へ」をクリックします。
  5. 「モジュール名の入力」で「既存のモジュールを使用」をチェックし (このときにパスワードを聞かれます)、 モジュール名(今の例だとmymodule)を選択します。 「次へ」をクリックします。
  6. 「タグの選択」はそのまま何もせず、「次へ」をクリックします。
  7. 「プロジェクト・リソースの共用」は、通常そのまま「終了」をクリックします。
  8. コメントの入力を求められるので、適当なコメントを入力して(空白のまま でも構いません)、「終了」をクリックします。(コメントが空白のときは、 続行するか確認されますが、「はい」をクリックします。)

自分のコンピュータでの準備作業(Cygwinの場合)

環境変数の設定

やはり、リポジトリの場所とCVSで補助的に使用するコマンドを環境変数 で設定する必要があります。Cygwinを起動して、以下のコマンドを実行 します。

host1$ export CVSROOT=gennai@ymir.eng.kagawa-u.ac.jp:/home/gennai/cvsroot
host1$ export CVS_RSH=ssh

作業用ディレクトリの作成

作業用ディレクトリの作成にはcheckoutというコマンドを用います。

host1$ cvs checkout mymodule

するとモジュールと同じ名前のディレクトリが作成されます。これがCVSの作 業用ディレクトリです。以降はこのディレクトリの中でファイルを作成・更新 していきます。

CVSの日常的使用(Eclipseの場合)

ファイルのコミット

ファイルを新しく追加したり、ファイルを編集した結果、作業用ディレクトリ のファイルの方がリポジトリのファイルより新しくなった時、リポジトリに最 新版を送ることをコミットといいます。

「プロジェクト・エクスプローラー」でCVSで管理しているプロジェクトを右 クリックし、「チーム」―「コミット」をクリックします。

ファイルの追加や削除は Eclipseが適当にやってくれます。

コメントの入力を求められるので、適当なコメントを入力して(空白のまま でも構いません)、「終了」をクリックします。(コメントが空白のときは、 続行するか確認されますが、「はい」をクリックします。)

ファイルの更新

作業用ディレクトリにあるファイルが古く、リポジトリに最新版がある 場合、リポジトリから最新版をとってくることを更新と言います。 「プロジェクト・エクスプローラー」でCVSで管理しているプロジェクトを右 クリックし、「チーム」―「更新」をクリックします。

CVSの日常的使用(Cygwinの場合)

ファイルの追加

作業用ディレクトリに新しいファイルを作成しても自動的にはリポジトリに登 録されません。ファイルをリポジトリに登録するためには、addとい うコマンドを使います。 ディレクトリを追加する場合は、まずディレクトリ自身をaddしてから、ディ レクトリの中にあるファイルをaddする必要があります。 また、画像などバイナリファイルの場合は、CVSが誤って改行コードを変換し たりしないように、-kbというオプションをつける必要があります。

例えば、thesisというフォルダとその中の thesis.tex, memo.txt (テキストファイル)、image.png, photo.jpg(バイナリファイル)を追加する場合は次のようなコマン ドを入力します。

host1$ cvs add thesis
…
host1$ cd thesis
host1$ cvs add thesis.tex memo.txt
…
host1$ cvs add -kb image.png photo.jpg
…

addの時に-kbを忘れた時は、あとで、adminというコマンドを使いま す。

host1$ cvs admin -kb image.png photo.jpg

なお、実際に新しいファイルがリポジトリに転送されるのは、この後に cvs commitを行なう時です。

ファイルのコミット

ファイルを新しく追加したり、ファイルを編集した結果、作業用ディレクトリ のファイルの方がリポジトリのファイルより新しくなった時、リポジトリに最 新版を送ることをコミットといいます。

host1$ cvs commit

というコマンドで、更新されたファイルを自動的に検索し、リポジトリに送る ことができます。送る前にコメントの入力を促すためにエディタが起動されま すが、これが面倒な時は、

host1$ cvs commit -m "Comment Here" 
のように、-mオプションのあとにコメントを指定します。 ちなみにこのコメント中に日本語を使用することはお勧めしません。 面倒ならば下のように空でも構いません。
host1$ cvs commit -m "" 

.cvsignore.cvswrappers

C言語などでプログラムを作成する時の.obj, .exeという 拡張子のファイルや、ΤΕΧで論文を作成す る時の.dvi, .aux .logファイルなどは、それぞ れ.c.texといった拡張子を持つファイルから生成される のでCVSに追加する必要のないファイルです。 これらのファイルが存在すると「CVSに追加されていないファイルがあります よ」というメッセージがいちいち出力されるので少しうっとうしいことがあり ます。 そこで、そのディレクトリに.cvsignoreというファイルを作成して、 これらのファイルを無視するようにできます。ファイル名の指定には、下の例の ように*を使ったワイルドカードを用いることができます。

.cvsignoreファイルの例
*.dvi
*.aux
*.log
*.class
*.obj
*.exe

またバイナリファイルを作成した時はaddするときに-kbオプション を指定しなければいけませんが、よく忘れます。そこで、 .cvswrappersというファイルを作成して、特定のファイル名に対し て、オプションを指定することができます。

.cvswrappersファイルの例
*.swf  -k'b'
*.png  -k'b'
*.jpg  -k'b'
*.doc  -k'b'
*.xls  -k'b'

なぜかここではbのまわりに「'」が必要なようです。 また Cygwinの環境ではファイル名の中の大文字と小文字は区別されるので、 もし、PNGJPGという拡張子を持つファイルも存在するな ら、別に追加しなければなりません。

どちらもファイルのあるディレクトリのみ有効で、ディレクトリの中に別のディ レクトリを作成した時は、別の.cvsignore, .cvswrappers を作成しなければいけないようです(つまり再帰的には適用されません)。 ただし、.cvsignore, .cvswrappersを各自のホームディレ クトリに作成しておくと、どこでCVSのコマンドを実行しても有効になります。

ファイルの更新

作業用ディレクトリにあるファイルが古く、リポジトリに最新版がある 場合、リポジトリから最新版を取ってくる必要があります。例えば、家のPCで 作業してコミットした結果を大学のPCで取出す場合などです。

host1$ cvs update  

というコマンドで、作業用ディレクトリのファイルを最新のものにすることが できます。 ただし、これだけではリポジトリに新しいディレクトリができても作業用ディ レクトリに新しいディレクトリを追加してくれません。 そこで、リポジトリに新しいディレクトリがある場合は、

host1$ cvs update -d    

のようにupdateコマンドの-dオプションを使う必要があります。

ファイルの削除

ファイルの削除はremoveというコマンドを用います。

host1$ cvs remove -f ファイル名  

なお、ファイル名の変更は直接対応するcvsコマンドがないので、 removeとaddを組み合わせるしかありません。少々面倒なので、ファイルに名 前をつけるときは少し慎重になる必要があるかもしれません。

ディレクトリを削除する時は、その中のファイルをすべてremoveしてから、そ のディレクトリの親ディレクトリに移動し、updateコマンドに-Pと いうオプションをつけて、

host1$ cvs update -P

を実行する必要があります。-Pは作業用ディレクトリから空のディ レクトリを取り除くオプションです。

2台目以降のクライアント

別のマシンで作業する場合も環境変数の設定と、作業用ディレクトリの作 成は1台目と同じです。

host2$ export CVSROOT=gennai@ymir.eng.kagawa-u.ac.jp:/home/gennai/cvsroot
host2$ export CVS_RSH=ssh
host2$ cvs checkout mymodule

それまでリポジトリに登録されているファイルがすべて取り出され、作業を行 なうことができます。

矛盾の修正

このように複数の場所で編集を行なう場合、編集を行なう前に必ずupdateをし ておきます。また編集をし終ったら必ずcommitします。 もし、編集作業後のcommitを忘れると、2つの場所にあるファイルのどちらが 最新版かわからなくなってしまいます。

例えばthesis.texというファイルをhost1で編集し、commitを忘れて いたとします。そのあとhost2で編集してcommitし、再びhost1に戻って commitしようとすると、CVSは次のようなエラーを報告し、実際にリポジトリ に登録できなくなります。

host1$ cvs commit -m ""
cvs commit: Examining .
gennai@ymir.eng.kagawa-u.ac.jp's password:
cvs server: Up-to-date check failed for `thesis.tex'
cvs [server aborted]: correct above errors first!

このような時は先にupdateを実行します。

host1$ cvs update
gennai@ymir.eng.kagawa-u.ac.jp's password:
cvs server: Updating .
RCS file: /home/gennai/cvsroot/mymodule/thesis/thesis.tex,v
retrieving revision 1.1
retrieving revision 1.2
Merging differences between 1.1 and 1.2 into thesis.tex
rcsmerge: warning: conflicts during merge
cvs server: conflicts found in thesis.tex

すると、上のようにリポジトリと作業ディレクトリにあるファイルに矛盾があ ることを報告してくれます。このとき作業ディレクトリにある thesis.texを見ると、食い違いがあった場所は次のように 「<<<<<<<」と「=======」と 「>>>>>>>」に囲まれた形で示されています。

…
<<<<<<< thesis.tex
ABCはDEFである。
=======
ZYXはWVUである。
>>>>>>> 1.2
…

このときはどちらかを選択するかマージするかして、手作業で修正 してcommitする必要があります。

おわりに

CVSの欠点として、ファイルやディレクトリの名前を変更するのが少し面倒な ことなどが挙げられます。また、複数のリポジトリを使い分ける(例えば、 こまめな更新はローカルなリポジトリに対して行なって、大きな更新だけ グローバルなリポジトリに行なう)こともできません。 これらの欠点(の一部)を解消したバージョン管理システムである、 Subversion (SVN), GNU arch, darcsなどのシステムも現れてきています。今 のところまだ枯れて(安定して)いないような印象があるので、ここでは紹介し ませんでしたが、上のような機能を魅力に感じる場合は是非使ってみて体験を 報告してください。

ここで説明した事柄でCVSの利用法の97%は説明できていると思います。しかし、 いざというときには以前のバージョンの取出し方なども、必要になります。 そういう場合は以下のリンクを参考にしてください。

参考リンク


Koji Kagawa