CVSを使った共同開発入門
- バージョン管理の必要性
- CVSの概念
- CVSの基本的作業
- CVSの使い方
- 基本(4つのコマンド)
- 応用(タグ,ブランチ,トリガ機能)
- CVS pserver の立ち上げ方
- SSHやSSLを使ったCVS pserver の安全運用
- Webを使ったリポジトリの公開,
- トリガ機能を使う
- メールを使ったcommitの通知
- CVSを使ったWebの管理
バージョン管理の必要性
開発を進めるうえで・・・
- どれが最新のファイル?
- 過去のバージョンを取り出したい
- リリースの状態の管理
多人数で開発する時は・・・
- 多人数での開発でのバージョン衝突を回避
- 変更のログを残したい
- 変更がされたことを知らせたい
RCSとCVS
RCS(Revision Control System)
- バージョン管理: ロッキング方式
- 管理の単位:ファイル
CVS(Concurrent Versions System)
- バージョン管理: コピーマージ方式
- 管理の単位: ディレクトリ
RCSの問題点
- 複数のファイルをまとめて管理出来ない
- 複数の開発者が同時に作業を進めにくい
一つのファイルを同時に変更できない(ロッキング)
- ファイルリリース間の差分をとりにくい
- 複数のディレクトリの管理が出来ない
管理ファイルの形式は同じなので,RCSからCVSへの移行も可能.
CVSの特長
- 複数のソースをまとめて管理(module)
- 複数の開発者が同時に作業を進めることが出来る
(一つのファイルを同時に変更できる)
- ネットワークを介しての作業が可能(pserver)
- 二つのプログラムリリース間の差分が出来る
- 複数のディレクトリを管理
- トリガ機能(メール配送,プログラム起動)
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つの基本コマンド
<全体管理の操作>
- import
リポジトリへファイルの登録
- checkout
リポジトリから作業ファイルを取り出す
<差分管理の操作>
- commit
作業ファイルの変更をリポジトリに反映
- update
作業ファイルをリポジトリと同期
CVSの設定
リポジトリの場所の指定
リポジトリがローカルのディスクの場合
- 環境変数での指定
-
- 「-d」オプションでの指定
- $ cvs -d /usr/local/cvs checkout
- WinCVSの場合
-
作業の基本的手順
(最初のみ)
リポジトリへファイルの登録
- リポジトリから作業ファイルを取り出す(checkout)
作業ファイルがある場合は,リポジトリと同期を取る(update)
(事実上は,checkoutもupdateも同じ意味)
module名のディレクトリ以下に取り出される.
- 作業ファイルを編集
- 作業ファイルの変更をリポジトリに反映(commit)
必ず分かりやすいログを残すこと!
CVSの管理データ
各ディレクトリにある「CVS」というディレクトリ内にある.
勝手に削除しないように.
作業の状態遷移
| リポジトリ | 田代 | 山
崎 | 作業内容 | バージョンの状態 |
| 1.1 | | | |
| 1.1 | 1.1 | | 田代:checkout | |
| 1.1 | 1.1 | 1.1 | 山崎:checkout | |
| 1.1 | 1.1 | 1.1山 | 山崎:編集 | |
| 1.1 | 1.1田 | 1.1山 | 田代:編集 | |
| 1.2(1.1山) | 1.1田 | 1.1山 | 山崎:commit | Versionアップ |
| 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山 | 田代:commit | Versionアップ |
CVSの使い方(応用)
ファイルやディレクトリの追加,削除
-
- add
ファイル,ディレクトリの追加
- delete
ファイル,ディレクトリの削除
正式なリリースとしての取り出し
- 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経由での作業
「ログイン」と「ログアウト」
- ログイン
- 作業ファイルの取り出し(checkout,update)
- 作業ファイルの編集
- リポジトリへの反映(commit)
- ログアウト
パスワードについて
- SSHを使う場合
- ログインアカウントのパスワード
または秘密鍵のパスフレーズ
- pserver用アカウントの場合
- pserver用アカウントで設定したパスワード
pserverの安全な利用について
SSH経由で接続
-
環境変数の設定
| CVSROOT | :pserver:tashiro@cvs.cacanet.org/usr/local/cvs |
| CVS_RSH | ssh |
- 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を使ったリポジトリ公開プログラム(閲覧とダウンロードのみ)
必要なもの
- Perl
- CGIが使えるHTTP Server(Apache)
- CGIスクリプト(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
- 「CVSROOT」モジュールを取り出す.
$ cvs checkout CVSROOT
- 「loginfo」ファイルを編集
DEFAULT mail -s %s cacanet-admin@cacanet.org
- 変更をリポジトリに反映
$ cvs commit
トリガ機能
checkout,commitなどの各コマンドを実行時に,
任意のプログラムを実行する機能.
これは,各module単位で指定する.
| checkout時 | 「-o」オプション |
| commit時 | 「-i」オプション |
| export時 | 「-e」オプション |
管理ファイルのcheckout
- 「CVSROOT」モジュールを取り出す.
$ cvs checkout CVSROOT
- 「module」ファイルを編集
test -i /usr/local/bin/wwwupdate.sh documents/test
- 変更をリポジトリに反映
$ cvs commit
CVSを使ったWebサイトの管理
- moduleの登録(CVSROOT/module)
test -i /usr/local/bin/wwwupdate.sh documents/test
- 実行するプログラムの編集
ファイル:/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
- Webのディレクトリに,moduleをcheckoutする.
$ cd <Apache ROOT>/htdocs
$ cvs checkout test
testモジュールについてcommitすれば,
Webサイトのディレクトリで自動的にupdateが実行される.
knjwrpパッチについて
日本語のSJISコードについての不具合を解決するパッチ
WinCVSやMacCVSには,パッチがあたったバイナリも配布されている.
UNIXの場合は,パッチを当ててコンパイル,インストールする.
参考文献
雑誌
- UNIX USER 2000年 9月号
- UNIX Magazine 2000年 10月号
- UNIX Magazine 2000年 12月号
本
- CVSデスクトップリファレンス:O'REILLYジャパン,Gregor N. Purdy,でびあんぐる,田和 勝
- 入門CVS:秀和システム,大月 美佳
- CVSデスクトップリファレンス:O'REILLYジャパン
- バージョン管理システム(CVS)の導入と活用:ソフトバンク,鯉江英隆,西本卓也,馬場 肇
CVS関連Webサイト
CVSプログラム
CVSの解説
SSH関連
SSL関連
Stone