最近、cvs による開放型の開発がよく行なわれています。これは、anonymous cvs により誰でも自由に開発中のコードを入手できるというものです。しかし、今のところ anonymous cvs の使いかたは anonymous ftp の使いかたほどには知られていないようです。そこで、ここでは cvs の使いかたを anonymous cvs に特化して紹介します。
cvs login通常、anonymous cvs は pserver というサーバで実現されています。これにアクセスするためには、まず、cvs login をします。
cvs -d :pserver:loginname@serverhost login
上記を実行すると password を聞かれるので適切なものを答えます。
anonymous ftp と違い、 password は正しいものを入力する必要があります。そして残念なことに loginname, password に関しては慣習が確立されておらず個々のサーバによって違います。したがって、これを知る一般的な方法はありません。Web や ML で入手しましょう。ただし、(もちろん保証されているわけではありませんが) loginname や password には anonymous や guest が使われることが多いようです。また、password は空のこともあります。なお、cvs-1.10.8 から任意の文字列を password として受け付ける機能が追加されたので、この機能を使っているサーバにアクセスする場合には適当な文字列を入力して構いません。
cvs login に成功すると(クライアント側の) ~/.cvspass に password が記録されます。したがって、この操作は ~/.cvspass を消さない限り有効です。 (cvs login と対になる cvs logout というものもあって、これは ~/.cvspass から password を削除するものですが、まず使う機会はないでしょう。)
cvs co -ccvs login に成功すればリポジトリにアクセスする権限が手に入ったことになるわけですが、一般にリポジトリには複数のモジュールが存在し、アクセスするにはモジュールを指定しなければならないため、実際にアクセスするにはモジュール名を知らなければなりません。
ちゃんと管理されたサーバなら次のようにしてモジュール名のリストを得ることができます。
cvs -d :pserver:loginname@serverhost co -c
これは CVSROOT というモジュール内の modules というファイルを標準出力に出力するコマンドです。 (CVSROOT というのは管理用のモジュールで、これ自体は普通 anonymous では co できません。)
ただし、ちゃんと管理されたサーバはそれほど多くはないようです。また、次のようにしてもモジュール名(を含む情報)を入手できます。
cvs -d :pserver:loginname@serverhost history -ea
これでもわからない場合は、追補編を読むか、 Web や ML でモジュール名を入手します。
cvs coモジュール名がわかれば次は co します。
cvs -d :pserver:loginname@serverhost co modulename
これによって modulename の幹が入手できます。
cvs status -vしかし、実際の開発は必ずしも幹で行なわれているとは限らず、枝で行なわれている可能性があります。そこで、どのような枝があるかを調べます。
cd modulename cvs status -v filename
これによって filename として指定した適当なファイル(ChangeLog とか)についている tag を調べることができます。branch tag が見つかれば枝が存在することになります。
cvs history複数の枝が存在した場合、どこで活発な開発が行なわれているか知る必要があります。それには次のようにします。
cvs history -eaD'1 week ago'
これによって、最近(1週間以内)の記録が見えるので、その中から commit (行頭が M)のものを見て、(数値の)バージョンを調べます。これと branch tag のバージョンを比べると開発の舞台となっている枝を知ることができます。
cvs update -Pdr実際に開発が行なわれている枝が判明したら次はその枝を入手します。再度 co してもいいのですが、(その枝でなくても)すでに co したディレクトリがある場合には次のようにして入手できます。
cvs update -Pdr branchtag
このようにすることによってカレントディレクトリの内容が branchtag の内容に更新されます。
cvs update開発が進み、リポジトリの内容が更新されたとします。その更新に co したディレクトリを追随させるには次のようにします。
cvs update
ここで、手元でソースを変更していた場合、cvs update によって手元の変更と開発元での更新がマージされます。このとき、一つのファイルの同じ場所を双方が変更していると機械的なマージが不可能なことがあります。これをコンフリクトと呼びますが、コンフリクトが起きた場合にはコンフリクトが起きたという印と双方の変更がソース中に含まれるようになるので、手作業で修正する必要があります。
cvs diffソースを変更した場合、パッチを生成するには次のようにします。
cvs diff -u
もし、パッチを開発元に送ることが有用であると思うなら、「効果的にバグを報告するには」を読んでから、ちゃんと説明をつけて送りましょう。なお、読めばわかると思いますが、開発元にとって本当に重要なのは(実行結果を含む)説明であり、パッチではないので、パッチだけを送ることはやめましょう。繰り返し適切な説明つきパッチを送っていると、そのうち開発元は面倒になってきますから、そうなると committer になるよう誘われるかもしれません。