CVSを使った共同開発入門


バージョン管理の必要性

開発を進めるうえで・・・ 多人数で開発する時は・・・

RCSとCVS

RCS(Revision Control System)

バージョン管理: ロッキング方式
管理の単位:ファイル

CVS(Concurrent Versions System)

バージョン管理: コピーマージ方式
管理の単位: ディレクトリ

RCSの問題点

管理ファイルの形式は同じなので,RCSからCVSへの移行も可能.


CVSの特長


CVSの実装

CUI(Command line User Interface)

http://www.cvshome.org/

GUI(Graphical User Interface)

http://www.cvsgui.org/ (WinCVS,MacCVS)

CVSの概念

「リポジトリ」と「作業ファイル」

<リポジトリ>

ファイルの変更履歴,変更内容などが入ったもの.

<作業ファイル>

リポジトリから,ある時点の状態のファイルを取り出したもの.

「リリース」とは?

複数のファイル単位のバージョンの意味.「タグ」コマンドを使うことにより実現


作業の流れ

リポジトリ作業ファイルを取り出す
作業ファイルを変更
リポジトリに反映作業ファイル

module単位で管理

ディレクトリ構造で管理する.
module名は,特に指定しなければ,最上位ディレクトリの名前になる.

あくまでもリポジトリが本体

手元のファイルは,作業のための一時ファイルに過ぎない

CVSは神様ではない

運用の方法を考えておかないと,うまくいかない.

CVSの使い方(基本)

4つの基本コマンド

<全体管理の操作>

<差分管理の操作>


CVSの設定

リポジトリの場所の指定

リポジトリがローカルのディスクの場合

環境変数での指定
CVSROOT/usr/local/cvs

「-d」オプションでの指定
$ cvs -d /usr/local/cvs checkout

WinCVSの場合

作業の基本的手順

(最初のみ)
リポジトリへファイルの登録

  1. リポジトリから作業ファイルを取り出す(checkout)
    作業ファイルがある場合は,リポジトリと同期を取る(update)
    (事実上は,checkoutもupdateも同じ意味)
    module名のディレクトリ以下に取り出される.

  2. 作業ファイルを編集

  3. 作業ファイルの変更をリポジトリに反映(commit)
    必ず分かりやすいログを残すこと!

CVSの管理データ

各ディレクトリにある「CVS」というディレクトリ内にある.
勝手に削除しないように.


作業の状態遷移

リポジトリ田代山 崎作業内容バージョンの状態
1.1
1.11.1田代:checkout
1.11.11.1山崎:checkout
1.11.11.1山山崎:編集
1.11.1田1.1山田代:編集
1.2(1.1山)1.1田1.1山山崎:commitVersionアップ
1.2(1.1山)1.1田1.1山田代:commit失敗Conflict発生
1.2(1.1山)1.2(1.1山) + 1.1田1.1山田代:update
1.3(1.2 + 1.1田)1.2(1.1山) + 1.1田1.1山田代:commitVersionアップ


CVSの使い方(応用)

ファイルやディレクトリの追加,削除

正式なリリースとしての取り出し

exportコマンド(CVSの管理データは取り出さない)

ネットワーク経由

pserverの利用

Webを使ったリポジトリの公開

CGIスクリプト(cvsweb.cgi)

タグ

リリースの管理(複数のファイルの統合)

ブランチ

開発バージョン,安定バージョンの分岐

トリガ機能

メール配送
プログラム起動

pserverの立ち上げ方

inetd経由

TCPの2401番ポートを使用

/etc/inetd.conf

cvspserver      stream  tcp     nowait  root    /usr/bin/cvs    cvs --allow-root=/usr/local/cvs pserver

inetdはセキュリティーホールが多いので,
xinetdやtcpserverの導入を考えたほうがいい.


pserver用のアカウント

ログインシェルがないアカウント作成(例:pserver)

Apacheに付属のパスワード作成コマンド「htpasswd」を使う

$ /usr/loca/apache/bin/htpasswd passwd tashiro
New password:パスワード入力
Re-type new password:再度パスワードを入力
以下のように修正
tashiro:*************
     ↓
tashiro:*************:pserver

「pserver」という権限でpserver経由のCVSを利用.

グループ作成(pserver)

リポジトリは,pserverグループでの書き込みが可能にしておく


pserver経由での作業

「ログイン」と「ログアウト」

  1. ログイン
  2. 作業ファイルの取り出し(checkout,update)
  3. 作業ファイルの編集
  4. リポジトリへの反映(commit)
  5. ログアウト

パスワードについて

SSHを使う場合
ログインアカウントのパスワード
または秘密鍵のパスフレーズ

pserver用アカウントの場合
pserver用アカウントで設定したパスワード

pserverの安全な利用について

SSH経由で接続

環境変数の設定

CVSROOT:pserver:tashiro@cvs.cacanet.org/usr/local/cvs
CVS_RSHssh

WinCVSの場合

SSL tunnelで接続(stone)

+------------------------+                    +------------------------+
|     Server Machine     |                    |     Client Machine     |
|       CVS pserver      |                    |        CVS Client      |
|            |           |                    |            |           |
|        (pserver)       |                    |        (pserver)       |
|            |           |                    |            |           |
|+---------stone--------+|                    |+---------stone--------+|
||pserver <- pserver/SSL+--(pserver over SSL)--+pserver/SSL <- pserver||
|| (#2401)  (#12401)    ||  (port = #12401)   ||(#12401)   (#2401)    ||
|+----------------------+|                    |+----------------------+|
+------------------------+                    +------------------------+

環境変数の設定

CVSROOT:pserver:tashiro@localhost/usr/local/cvs

stoneの設定(クライアント側)

バッチファイルc:\stone\stone cvs.cacanet.org:12401/ssl 2401

stoneの設定(サーバー側)

シェルスクリプト
#!/bin/sh

stone="/usr/local/bin/stone"
port="12401"
stone_log="/var/log/stone_log"

$stone -L $stone_log localhost:2401 $port/ssl &

WinCVSの設定

wstoneの設定

IMAP4などは気にしなくても良い.どこに設定してもOK.


Webを使ったリポジトリの公開

CVSWeb

CGIを使ったリポジトリ公開プログラム(閲覧とダウンロードのみ)

必要なもの

インストールと設定

ファイル:<Apache ROOT>/cgi-bin/cvsweb.cgi
$config = $ENV{'CVSWEB_CONFIG'} || '<Apache ROOT>conf/cvsweb.conf';
ファイル:<Apache ROOT>/conf/cvsweb.conf
%CVSROOT = (
            'default' => '/home/cvs/'
            );

リポジトリ公開のページ

http://cvs.cacanet.org/cgi-bin/cvsweb.cgi/

メールを使ったcommitの通知

管理ファイルのcheckout

  1. 「CVSROOT」モジュールを取り出す.
    $ cvs checkout CVSROOT
  2. 「loginfo」ファイルを編集
    DEFAULT mail -s %s cacanet-admin@cacanet.org

  3. 変更をリポジトリに反映
    $ cvs commit

トリガ機能

checkout,commitなどの各コマンドを実行時に, 任意のプログラムを実行する機能.
これは,各module単位で指定する.

checkout時-o」オプション
commit時-i」オプション
export時-e」オプション

管理ファイルのcheckout

  1. 「CVSROOT」モジュールを取り出す.
    $ cvs checkout CVSROOT
  2. 「module」ファイルを編集
    test -i /usr/local/bin/wwwupdate.sh documents/test

  3. 変更をリポジトリに反映
    $ cvs commit

CVSを使ったWebサイトの管理

  1. moduleの登録(CVSROOT/module)
    test -i /usr/local/bin/wwwupdate.sh documents/test

  2. 実行するプログラムの編集
    ファイル:/usr/local/bin/wwwupdate.sh
    #!/bin/sh
    CVSROOT=/usr/local/cvs
    export CVSROOT
    cd <Apache Root>/htdocs
    chmod -R g+w .
    cvs update -d &
    touch .changed
    

  3. Webのディレクトリに,moduleをcheckoutする.
    $ cd <Apache ROOT>/htdocs
    $ cvs checkout test
    

testモジュールについてcommitすれば,
Webサイトのディレクトリで自動的にupdateが実行される.


knjwrpパッチについて

日本語のSJISコードについての不具合を解決するパッチ

WinCVSやMacCVSには,パッチがあたったバイナリも配布されている.

UNIXの場合は,パッチを当ててコンパイル,インストールする.


参考文献

雑誌


CVS関連Webサイト

CVSプログラム

CVSの解説

SSH関連

SSL関連

Stone