バージョン管理システム CVS

古いものにはとんでもない脆弱性があります。 1.11.17 に早く更新してください。 Linux ディストリビューションはよく古いバージョンのものにセキュリティパッチをバックポートしたものを出しており,その場合はバージョンが古くても大丈夫です。

なるべく pserver ではなく ssh 経由の ext でお使いください。

以下は古い記述があるかもしれません。

はじめに

CVS (Concurrent Versions System) は広く使われているオープンソースのバージョン管理システムです。 一連のファイル群を複数の人が共同で作るときに便利です。

開発元 Cyclic SoftwareSourceGear Corporation に吸収され,さらに OpenAvenue に買収され,そのコミュニティ開発関連は OpenAve.Net に移動し,CVS のページは CVShome.org となり,さらに2001年1月31日にスポンサーが CollabNet, Inc. に変わったようです。

インストール

適当なミラー,たとえば Ring サーバの /pub/misc/cvs/ から最新のものをいただいてきます。 これを書いているでは cvs-1.11.7.tar.gz が最新のようです。 最近のバージョンは他のソフト(RCS,GNU diff)を必要とせず, 単独でインストールできます。

インストールは例によって単純です(Solaris と Vine Linux でやってみました)。

./configure
make
# make check # かなり時間がかかる
make install

以下はまだ改訂していません。


これで /usr/local/bin に rcs2log,cvs,cvsbug が入ります。

Solaris では ./configure --without-gssapi としなければなりませんでした。 また,Solaris では make check は GNU id (sh-utils) がないと通りませんでした。 Linux では make check は日本語環境では通りませんでした(eng と打ち込めば大丈夫)。

リモートからも使えるようにするには,まず /etc/services に次の行を追加します。

cvspserver      2401/tcp

次に,/etc/inetd.conf に次の行を追加します(実際は1行です)。

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

こうしてから,killall -HUP inetd します (最近の流儀は /etc/rc.d/init.d/inet restart でしょうか)。

ユーザ登録

CVS をローカルから,あるいはリモートから使うユーザについては, 通常のユーザ登録をしておきます。 全員が同じ group に属している方が後の設定が多少簡単のようです。

リモートからだけ使うユーザで, ログインされたくないけれどパスワード変更だけ許したい場合は, ログインシェルに /bin/passwd を指定するという手もあります。

ユーザ登録はしたくないけれどリモートから使わせたいユーザについては, /usr/local/cvsroot/CVSROOT/passwd というファイルを作り, そこに「ユーザ名:暗号化したパスワード:実効ユーザ名」を並べておきます。 この単純化されたパスワードファイルを作るには, Apache に付いている htpasswd コマンドが便利です。 最初にたとえば foo という人を登録するには

cd /usr/local/cvsroot/CVSROOT
/usr/local/apache/bin/htpasswd -c passwd foo

とします。 普通のパスワード変更と同様に,パスワードを2回聞いてきます。 /usr/local/cvsroot/CVSROOT/passwd には,たとえば

foo:5USauVJuLaI2Q

のように書き込まれますが,本当は foo というユーザはローカルには存在しないので, この passwd ファイルをたとえば次のように編集して,foo の操作を誰の権限で行うかを指定します。

foo:5USauVJuLaI2Q:okumura

この場合はローカルに実在する okumura という人の権限で /usr/local/cvsroot を操作することになります。

いったん passwd ファイルができてしまえば,次回以降は -c は付けません(付けると白紙の状態から作り直されます)。 たとえば bar というユーザを追加するには

/usr/local/apache/bin/htpasswd passwd bar

とします。

レポジトリの作成とソースツリーの登録

レポジトリ(置き場)の作成は次のように行います。 ここではリモートからではなく CVS サーバで行うことにします。

export CVSROOT=/usr/local/cvsroot
cvs init

次に,カレントディレクトリ以下を algo という CVS のソースツリーに登録してみましょう。 なお,あらかじめ自動バックアップファイルの類やバイナリファイルは外しておきます (バイナリファイルも格納できますが,効率が悪くなります)。

cvs import -m "Imported sources" algo okumura start

ここで okumura はベンダ名, start は最初のリビジョン名です。 これらは適当でかまいません。 また,-m "..." はコメント(メッセージ)です。

/usr/local/cvsroot の下の CVSROOT/history や各ディレクトリは user と group に対して書込み権が付きます。 これが嫌なら group の書込み権を外しておきましょう。 逆に,other の人でも使えるようにするには, other にも書込み権を与えます。

リモートからログイン

この節の方法ではパスワードがネットワークを平文で流れます。 これが嫌なら次節をご覧ください。

リモートの CVS サーバにログインするには次のように打ち込みます。 ここではサーバ名を hoge,ユーザ名を okumura としましょう。 まず環境変数を設定しておきます。

export CVSROOT=:pserver:okumura@hoge:/usr/local/cvsroot

まずログインします。

cvs login

すると,

Logging in to :pserver:okumura@hoge:2401/usr/local/cvsroot
CVS password: 

と聞いてくるので,パスワードを入れます。 エラーが出なければ,これでリモートのサーバに対していろいろな命令ができます。 ログイン時に打ち込んだパスワードは暗号化されてローカルマシンの ~/.cvspass というファイルに書き込まれます。

ログインした状態で,たとえば algo というソースツリーの下を全部取ってくるには

cvs checkout algo

と打ち込みます(checkoutco とも略せます)。 すると,カレントディレクトリに algo というサブディレクトリができ,その中にソースツリーのコピーが入ります。 各ディレクトリに CVS というサブディレクトリができますが, この中身は変更しないようにします。

★インターネットを通じてのチェックアウトには

cvs -z 9 checkout algo

のように圧縮オプションを付けると便利です。 数字は圧縮の度合で,5 が標準,9 が最高です。

この algo の下の src というディレクトリに入って, その中にある foo.c というファイルを編集したとします。 編集したものをサーバに送る前に, 別の人が同じファイルを書き直していないかどうか調べるため,

cvs update

しておくと安心です。 メッセージが現れますが, 頭に U が付いたファイルは更新(update)されたもの, M が付いたファイルは自分が変更(modify)したもの, C が付いたファイルは同時に同じ箇所が変更されて衝突(conflict)が生じたものです。 大丈夫であれば,送りたいファイルのあるディレクトリで,たとえば

cvs commit -m "Fixed a bug" foo.c

と打ち込みます(commitci とも略せます)。 なお,ファイル名 foo.c を省略すれば, カレントディレクトリ以下のすべての変更したファイルが送られます。

オプション -m はログメッセージ用です。もし -m でメッセージを書かなかったなら,環境変数 CVSEDITOR で定められるエディタが起動します。あらかじめたとえば

export CVSEDITOR='emacs -nw'

のように軽いエディタを指定しておくといいでしょう。 CVSEDITOR がセットされていなければ,CVS は環境変数 EDITORVISUAL を見に行きます。

また,bar.cbaz.c というファイルを新たに作ったなら,まず

cvs add bar.c baz.c

と打ち込んで登録してから,

cvs commit -m "Added some new files"

のようにします。 このように明示的に add しないと commit で送られませんので, make してできたバイナリファイルは commit 時に消す必要はありません。 また,commit 時に明示的にファイル名を指定しない場合は, cvs が自動的に送るべきファイルを判断してくれます。 add の反対は rm です。

作業を終えるには

cvs release

とします。

ログアウトするには

cvs logout

と打ち込みます。これで ~/.cvspass も消えます。

リモートからログイン(ssh を使う)

リモートの CVS サーバに ssh でログインできる環境なら, export CVS_RSH=ssh しておけば上記の :pserver: の代わりに :ext: と指定するだけで ssh 経由になります。 この場合は login と logout は不要です。

あらかじめ cvs release して以前のワークスペースを消しておきましょう。

環境変数を次のように設定します。

export CVSROOT=:ext:okumura@hoge:/usr/local/cvsroot

これで改めて cvs co 何々 してください。

キーワードの置換

CVS は $Author$$Date$$Header$$Id$$Name$$Locker$$Log$$RCSfile$$Revision$$Source$$State$ のキーワードに反応して置換を行います。 これらは RCS というバージョン管理システムでキーワードとして用いられていたものです。

これらの $キーワード$$キーワード: テキスト $ という文字列を偶然に使わないように注意が必要です。 CVS を解説した HTML 文書を CVS で管理するには $Id$ と書く代わりに $Id$ と書くなどの工夫が必要です。 日本語(特に iso-2022-jp)との衝突もあるかもしれません。

たとえば最もよく使われる $Id$

$Id: foo.c,v 1.5 1999/10/19 14:57:32 okumura Exp $

といった文字列に置換されます。 Exp は experimental の意味で,無指定ではこれが付きます。

キーワードはコメントとして書いておきます:

// $Id$

あるいは次のようにバイナリにも埋め込まれるような形にします:

static char const rcsid[] = "@(#) $Id$";

@(#) を付けるのは SCCS というバージョン管理システムの what コマンドでも検索できるようにするためのトリックですが,特に必要ありません。 $キーワード: テキスト $ はバイナリファイルに埋め込まれていても RCS の ident コマンドで表示できます。

バイナリファイルの扱い

バイナリファイルは -kb オプションで add します。 他のソフトで生成した EPS ファイルや,キーワードを置換してほしくないテキストファイルなども,この扱いにします。

cvs add -kb fig1.eps
cvs commit -m "added fig1" fig1.eps

もうすでに時遅し!? 今からでもバイナリに変更できます。

cvs admin -kb fig1.eps
cvs update -A fig1.eps

テキストモードで送ったために変になっている可能性があるなら,再度 cvs commit します。

レポジトリのバックアップ

あまり人が使っていない時を見はからってアーカイブするのが単純です。:-)

cd /usr/local
tar cvzf cvsroot.tar.gz cvsroot
rcp cvsroot.tar.gz anothermachine:

リンク


奥村晴彦

Last modified: 2004-07-07 21:37:47