cvs メモ

pserver でのアクセス

cvs は pserver というプロトコルでクライアントからの接続を受け付けることができる。 これにより、リポジトリが中央にある形でネットワーク越しに作業ディレクトリを チェックアウトできる。

pserver はポート番号として 2401 を使う。 FreeBSD の場合、デフォルトの /etc/services に記載があるので、そのまま使用することができる。 pserver を構成するには、何らかのスーパサーバを用いる。 代表例は inetd と xinetd である。

inetd の場合は、inetd.conf に以下の記述を追記して inetd を再起動する。

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

xinetd の場合は、以下のような設定ファイルを xinetd の設定ファイルのディレクトリ (通常 /etc/xinetd.d/ か) に作成して、 xinetd を再起動する。

service cvspserver
{
        socket_type         = stream
        protocol            = tcp
        wait                = no
        user                = root
        passenv             =
        server              = /usr/bin/cvs
        server_args         = -f --allow-root=/hoge pserver
}

いずれも hoge の部分がリポジトリになる。

一台で複数リポジトリの提供

ポート番号を消費する以上、 単純な定義では 1つの IP アドレスが1つの cvs リポジトリと結び付いてしまう。

IP アドレスが不足しているケースや、そもそもマシンが不足しているようなケースでは 一台のマシンで複数のリポジトリを提供することを検討する。 複数のリポジトリを扱いたい場合 (複数の CVSROOT を管理したい場合) は 単純に --allow-root をたくさん書けばよい。 inetd.conf で1行にたくさん書くのは美しくない、と感じる場合には 以下のような wrapper スクリプトを書いておくと便利だ。

#!/bin/sh
exec /usr/bin/cvs -f \
  --allow-root=/some/where \
  --allow-root=/else/where \
  pserver

この場合、inetd.conf には以下のように wrapper スクリプトを指定する。

cvspserver stream tcp nowait root /usr/local/bin/cvswrap /usr/local/bin/cvswrap

ユーザ管理

OS アカウントがあれば、ログインして使えばよいし、 pserver なしで extssh でも使える。

いちいち OS アカウントを作りたくない場合や アクセス権の管理をしたい場合には、 pserver 経由で アカウント管理をするのが簡便である。 pserver 経由でのアカウント管理には、2つの方法がある。

  • OS アカウントを作成する (だがこれはそもそもの目的に合致しないだろう)。
  • OS アカウントは代表アカウントのみとし、CVSROOT/passwd ファイルで そのユーザにマッピングして管理する。

前者の場合は話は簡単だ。 アカウントを作ればいいだけの話だ。

後者の場合は、やや手順が必要となる。

  • 代表アカウントを作成する。
    管理者用に cvsadmin、一般ユーザ用に cvsuser など、好きなように作ればよい。 プロジェクトやリポジトリの内容に即して作ってもいいだろう。 先々、OS ファイルシステムのアクセス権を利用して縛ることもできるので、 この時点である程度先を見ておくほうがよい。
  • CVSROOT を checkout する。
  • checkoutlist ファイルに passwd を追記する。
  • passwd ファイルを新規作成する。
    passwd ファイルの書式は次の通り。
    cvs上でのユーザ名:crypt されたパスワード:OS上のユーザ名
  • passwd ファイルを commit する。

passwd ファイル用に crypt されたパスワードを生成させるには、 htpasswd を使うのが便利だ。 パスワードを見たくなければ -n で対話的に、 パスワードを知られてもいいのなら -nb でバッチ的に処理することができる。

% htpasswd -n username
New password: (←パスワードを入力する)
Re-type new password: (←パスワードを入力する)
username:b1W6nlXasrf6m (←この行をコピペする)

% htpasswd -nb username password
username:b1W6nlXasrf6m (←この行をコピペする)

ブラウザアクセス

cvsweb.cgi を導入すれば、ブラウザ経由でリポジトリの中を「見る」ことができる。 色付きの diff なども見やすい。設定ポイントとして以下をメモしておく。

    "hidecvsroot" => "1",
$use_descriptions = 1; # and prepare the "descriptions" file in CVSROOT.
@mytz=("JST", "JST");  # whacko!

オプション指定の簡略化

たとえば update する時には -d したいとか、とりあえず -q したいとか、 そういう場合には $HOME/.cvsrc にオプションを書いておけば デフォルトで適用される。

cvs -q
update -d

こんな具合だ。

その他の TIPS

commit log を後から書き換えたい時、cvs admin を使うけれど、 マルチバイトで複数行を渡すのが面倒。そんな時は、ファイル渡しにする。

% vi /tmp/msg.txt
% cvs admin -m 1.7:"`cat /tmp/msg.txt`" target.txt

シェル環境によっては通らないかもしれない。 塗装といっしょで、「目立たないところで試してから」。

[$Revision: 1.3 $ $Date: 2009.04.03 00:59:35 $]
[EOF]