cygwin で CVS, サーバ(pserver)の設定に関するメモ(2003/01/10) 
 

CVSについて

CVS (Concurrent Version System) の略ですが、ようはテキストファイル(プログラムファイルだろうが、文章、etc)の履歴管理を行うシステムの事を指します。これを使用することによるメリットは、物事を進めるためには必ず途中^2で修正が発生するが、いつ何時どこをどーいう風に変更したのか? ある程度まで遡って元に戻したいとかを簡単に実現することができる事なのです。

バージョン管理システム(CVS)の導入と活用」の受け売りではありませんが、そんなバックアップだったら自分で毎日とっているよ!(怒)。ってフツーは言うんでしょうが、果たして毎日バックアップするコマメな人っています? 無理ですよね? そーいうのを肩代わりしてくれるんです。

  参考 : CVS How To

  参考 : CVSを活用しよう!

  参考 : CVS-man

  参考 : CVS

CVSのレポジトリと、チェックアウト、コミット

本なりネットで調べれば分かる事なので、ここでは詳しくは説明を省きますが、CVSで管理するにはレポジトリ、チェックアウト、コミット、という3つのキーワードが非常に重要です。CVSを使用するために最低でもこのキーワードは、しっかり理解しておきましょう。

cygwin の必須パッケージ

cygwin で cvs & サーバを行うためには、以下のパッケージが必要です。前もってインストールしておいてくださいね。

- NET Category : inetutils
- Devel Category : cvs, rcs

CVSの設定(はじめだけ♪)

CVSによる CVSROOT を c:\cygwin\cvsroot に設定するとした場合、以下の手順を実行します。

1.好みの問題ですが、CVSROOT を誰でもが参照できる場所として作成します。

$ mkdir /cygdrive/c/cygwin/cvsroot
$ mount -b c:/cygwin/cvsroot /cvsroot
     → mount -b /cygdrive/c/cygwin/cvsroot /cvsroot でも可能

2.CVSROOT の環境設定を行います。.bashrc に記述しておくと毎回設定しないので楽です。

export CVSROOT=/cvsroot

3.CVS の初期化を行います。※1回だけです

$ cvs init

CVSのレポジトリ登録

CVS 管理化でソースを管理する場合、管理する単位(プロジェクト)にレポジトリを登録します。レポジトリ登録は、1回行えば良いです。

1. レポジトリ登録するディレクトリに移動します。ここでは、hoge ディレクトリとして話を進めます。hoge ディレクトリには、hoge.java ファイルがあるとします。

$ cd ~/hoge
$ ls
./ ../ hoge.java

2.レポジトリ名「hoge-cvs」として登録を行います。

$ cvs import -m "" hoge-cvs avendor start
N hoge-cvs/hoge.java

No conflicts created by this import

3.レポジトリ名「hoge-cvs」が、正しくレポジトリ登録されたか確認します。

$ cd $CVSROOT
$ ls
./ ../ CVSROOT/ hoge-cvs/

4.レポジトリ登録が正しく行われれば、チェックアウトでファイルを取り出せるため、レポジトリ登録したもとの hoge ディレクトリは削除しても問題ありません。

CVSのチェックアウト、コミット

通常 CVS 管理化されたソースを修正する場合、チェックアウトという動作を行い修正作業を行います。修正作業が全て終わったら、CVS に管理を戻すためコミットという動作を行うことにより、ソースの一元管理を行う事ができます。

1. 適当な作業ディレクトリに移動し、レポジトリ「hoge-cvs」をチェックアウトします。ここでは、/tmp/test1 というディレクトリにチェックアウトする方法を例にとって説明します。

$ cd /tmp
$ cvs checkout -d test1 hoge-cvs
cvs checkout: Updating test1
U test1/hoge.java

2.チェックアウトされた、レポジトリ名「hoge-cvs」の内容を確認します。

$ ls test1
./ ../ CVS/ hoge.java

3.hoge.java の内容を修正しコミットを実行します。

$ vi hoge.java
$ cvs commit -m ""
cvs commit: Examining .
Checking in hoge.java;
/cvsroot/hoge-cvs/hoge.java,v <-- hoge.java
new revision: 1.x; previous revision: 1.x
done

※ ソース上にバージョン情報の文字列を設定しておくと便利です。赤字の部分がコミット後に展開されます。

$ vi hoge.java
  /* $Id:$ */
$ cvs commit -m ""
$ vi hoge.java
    /* $Id: hoge.java,v 1.15 2003/01/15 03:43:17 hoge Exp $Checking in hoge.java */

CVSサーバ(pserver)の設定

CVSサーバを設定することによるメリットは、クライアントの環境(OS)に依存しないということです。例えていうならば、CVS管理を行うのは Linixマシンで、そのソースを修正するのは Windowsマシンと言うような使い方もできるからです。

このスタイルの一般的な運用方法としては、多人数でプログラム開発を行う際に使用され。分散されたマシン(クラアント)で修正&実行しコミットするという方法がとられます。この場合、CVSサーバにしなくとも nfs共有しても同じことですが、Javaの統合環境には CVSクライアント機能が標準で付いているものも多く CVSサーバにした方が便利に使用することができるようです。

1. まずは pserver用にパスワードを設定します。パスワードファイル(passwd)は、username:passwd で、パスワードは暗号化した書式で作成します。

2. ユーザ名 hoge、パスワード hogehoge を設定する場合は、以下の様に設定します。これいいっす。

$ echo -n "hoge:" >> $CVSROOT/CVSROOT/passwd
$ crypt se hogehoge >> $CVSROOT/CVSROOT/passwd
 ※ seにあたるソルト文字列は、本来であれば乱数を生成して作るべきところですが、適当な2文字を使って設定してみました。

3. 高林哲さんのサイトの cvsadduser を使うと便利です。本サイトもある。

4. %WINDOWS%/system32/drivers/etc/services に以下の行を追加します。
 ※ %WINDOWS% はWindowsをインストールしたディレクトリです。

cvspserver 2401/tcp
cvspserver 2401/udp

5. /etc/inetd.confに以下の1行を追加します。

$ cd /etc
$ vi inetd.conf
     cvspserver stream tcp nowait root /bin/cvs cvs --allow-root=/cvsroot pserver

6. inetd を Windows NT/2000/XPのサービスとして動作させるために以下のコマンドを実行します。

$ /usr/sbin/inetd --install-as-service

7. dos窓で、inetd を起動します。※環境変数、path に cygwin の実行パスが設定されていないとエラーとなります。

C:\> net start inetd

CVSサーバ(pserver)からのチェックアウト、コミット

基本的な使用方法は同じです。TCP/IP で接続するので、ログインアカウント名、ホスト名の情報が若干付与されるだけです。チェックアウト、コミットする場合の手順として「ログイン → チェックアウト/コミット → ログアウト」の赤字が必要となります♪

CVSサーバにログイン

$ cvs -d :pserver:hoge@localhost:/cvsroot login
(Logging in to hoge@localhost)
CVS password:

CVSサーバからチェックアウト

$ cvs -d :pserver:murata@localhost:/cvsroot checkout -d kkk hoge-cvs
cvs server: Updating kkk
U kkk/hoge.java
cvs checkout: reading from localhost: Connection reset by peer

CVSサーバにコミット

$ cvs -d :pserver:hoge@localhost:/cvsroot commit

CVSサーバからログアウト

$ cvs -d :pserver:hoge@localhost:/cvsroot logout

タグによるリソース管理

1. 該当作業ディレクトリで、以下のコマンドを実行する。
 ※ タグ名には、.(ドット)や空白(いずれも半角)は使用できない。

$ cvs tag release_1_0

2. リリースタグによる、チェックアウト

$ cvs checkout -r release_1_0 -d test3 hoge-cvs

CVS 更新状況の確認

CVSweb を使用することにより、Web上で履歴情報を参照することができます。

Q&A

Q1. commitコマンドを実行したらStickyタグがついているというメッセージが出てコミットできませんでした。

$ cvs commit -m "Sixth commit."
cvs commit: Examining .
cvs commit: sticky tag `1.3' for file `b1.c' is not a branch
cvs [commit aborted]: correct above errors first!

A1. update -Aで解除できます。

$ cvs update -A
cvs update: Updating . 

*1. 備考

File: hoge.java Status: Up-to-date

Working revision: 1.4 Thu Jan 9 06:06:30 2003
Repository revision: 1.4 /cvsroot/hoge-cvs/hoge.java,v
Sticky Tag: release_1_0 (revision: 1.4)
Sticky Date: (none)
Sticky Options: (none)

Existing Tags:
release_1_0 (revision: 1.4)
start (revision: 1.1.1.1)
avendor (branch: 1.1.1)

この状態で、ソースを修正し。「cvs commit」をおこなうと

cvs commit: Examining .
cvs commit: sticky tag `release_1_0' for file `hoge.java' is not a branch
cvs [commit aborted]: correct above errors first!

ってなります。

対処方は、Stickyタグを消すのですが、・・・
そーすると。Stickyタグが消され、最新のブランチと同期が取れた版になります。

File: hoge.java Status: Locally Modified

Working revision: 1.13 Result of merge
Repository revision: 1.13 /cvsroot/hoge-cvs/hoge.java,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)

Existing Tags:
release_1_0 (revision: 1.4)
start (revision: 1.1.1.1)
avendor (branch: 1.1.1)