CVS を使うためのメモ

(2005/11/27 記)

(2006/11/19: 10.4 対応について追記)

 Mac OS X で CVS を使うためのメモです。全部ターミナルから手打ちでやることを想定しています。

使うリポジトリを選択する

$ CVSROOT=~/cvsroot; export CVSROOT # ローカルマシン上のリポジトリ $ CVS_RSH=ssh; export CVS_RSH; CVSROOT=:ext:nagata@some.server:cvsroot; ¥ export CVSROOT # リモートマシン上のリポジトリ

ssh でリモートにアクセスする時は、パスワード認証でなく公開鍵認証にしておかないと、毎回パスワードを入力することになって面倒。

$ cvs -d repository-specification とすれば、環境変数 CVSROOT に関わらずリポジトリを指定することができる。以下、cvs コマンドを cvs -d $CVSROOT と書くことにする。

リポジトリ格納用ディレクトリの新規作成

$ mkdir ~/cvsroot; cvs -d ~/cvsroot init

cvsignore, cvswrapper の Mac OS X 用設定

リポジトリの設定は CVSROOT というディレクトリ中に格納されているが、これ自体が CVS プロジェクトの形になっているので、チェックアウト→修正→変更のコミット、という手順を踏むのが行儀よいやり方。

$ cd ~/Development # ホームディレクトリ以外で作業すること $ cvs -d ~/cvsroot checkout CVSROOT $ cd CVSROOT $ cat - >cvsignore .DS_Store ._* *.app *.build *.pbxindex *.pbxuser *~.nib build *.mode1 ^D $ cvs add cvsignore # 新規ファイルを登録 $ cp /Developer/Tools/cvswrappers ./ # cvswrappers のひな形をそのままコピー $ cvs commit -m "cvsignore and cvswrappers are modified for Mac OS X development" $ cd .. $ cvs -d ~/cvsroot release -d CVSROOT # 作業終了、作業用コピーを破棄

HFS+ 特有の問題だが、ホームディレクトリ上で上の作業をやると、リポジトリディレクトリの cvsroot と作業用コピー CVSROOT が同一視される(HFS+ はデフォルトでは大小文字を区別しないため)のでおかしな動作をする。上のように別のディレクトリに移るか、checkout -d CVSROOT2 CVSROOT などとディレクトリ名を指定するようにする。

Xcode プロジェクトの場合、build ディレクトリ中にビルドの中間ファイルが保存される。これはバージョン管理の対象にしない方がよいので cvsignore に含めた。また、*.xcode 中の <username>.mode1 ファイルに Xcode のユーザー設定が保存されるが、これはプロジェクト自体には重要でない上にファイルを何も編集しなくてもいちいち更新されるので、これもバージョン管理から外した。

プロジェクトを新規に CVS 管理下に置く

$ cd project-dir $ cvs -d $CVSROOT import -m "message" project-name vendor-tag release-tag

project-nameproject-dir と同じ名前でよい(違っていてもよい)。vendor-tag, release-tag はそれぞれ自分の名前、'start' とでもしておく。-m オプションを指定しないと、環境変数 EDITOR で指定したエディタが立ち上がる(指定していなければ vi)。

なお、この操作で自動的にディレクトリ project-name が CVS の作業コピーになるわけではないので、チェックアウトの手続きで改めて作業コピーを取り出す必要がある。次項参照のこと。

作業コピーを新たに作る(チェックアウト)

$ cd parent-dir; cvs -d $CVSROOT checkout project-name

parent-dir の中に project-name というディレクトリが作られ、それが作業コピーとなる。

作業コピーをリポジトリの最新状態に同期させる(アップデート)

$ cvs [-q] update [filename]

-q (quiet) は、あまり必要のない情報を表示しないようにするためのオプション。このコマンドを使うと、アップデートが行われるだけでなく、最後にコミットしたあと編集したファイル、新しく作ったファイル、cvs add したファイル、cvs remove したファイルが表示される。(それぞれ行頭に 'M', '?', 'A', 'R' がつく)

作業コピーに加えた変更をリポジトリに登録する(コミット)

$ cvs commit -m "message" [filename]

新しいファイル・ディレクトリを追加する

$ cvs add filename

ファイルは cvs commit するまでリポジトリには入らない。ディレクトリは cvs add した時点でリポジトリに追加される。

ファイルを削除する

$ rm filename $ cvs remove filename

まず作業コピーの中のファイルを削除し、その後 cvs remove を実行する。追加の時と同様、cvs commit して初めてリポジトリ内のファイルが削除される。

ディレクトリを削除する

ディレクトリの削除はちょっとトリックが必要。まず、そのディレクトリ中のファイルをすべて削除して、cvs remove, cvs commit する。

$ cd dirname; rm file1 file2 file3 $ cvs remove file1 file2 file3 $ cvs commit -m "files in dirname are removed" file1 file2 file3

その後、1つ上のディレクトリで cvs update -P とする。

$ cd ..; cvs update -P

ファイル・ディレクトリの名称変更は、cvs addcvs remove の組み合わせでやるほかない。ファイル名の変更はともかく、ディレクトリ名の変更は非常に煩雑なので、なるべく避けた方がよい。

作業コピーとリポジトリの相違点を表示する

$ cvs [-Q] diff -c [filename]

-Q は強い quiet オプション、-cdiff へのオプション(コンテキスト diff)。

タグをつける

開発が一段落した時点(たとえば、リリースした時点)でタグをつけておくと、後でその状態に戻りたくなったときに便利。

$ cvs -q tag "Release-2005_11_26"

あるタグの時点に戻る時は、普段の作業コピーとは別のコピーを別名でチェックアウトするとよい。

$ cd parent-dir; cvs -d $CVSROOT checkout -r "Release-2005_11_26" -d other-dir project-name

変更履歴の表示

cvs log で可能だが、ファイルごとの表示なのでプロジェクト全体を見ることが難しい。cvs2cl を使うと、ChangeLog 形式に変換することができる。

$ cvs2cl.pl # 作業コピーのディレクトリで実行。ファイル "ChangeLog" に結果が保存される $ cvs2cl.pl -t # タグ情報を表示

作業コピーを破棄する

$ cd parent-dir; cvs -d $CVSROOT release project-name

実は作業コピーを丸ごと削除するだけでもよいので、あまり使う必要はない。

10.4 対応について

(2006/11/19 追記)

 Xcode 2 のドキュメントに記載されているが、10.4 では2つのバージョンの CVS が含まれている。/usr/bin/cvs はバージョン 1.11.18、/usr/bin/ocvs はバージョン 1.10 で、前者は cvswrapper に対応していない。上の手順では cvswrapper を使っているため、この手順で作ったレポジトリを継続して使うためには ocvs を使う必要がある。

 一方、cvswrapper はしばしばトラブルの原因になるため、使わないことを勧めている人も多い。上の手順で作ったレポジトリを cvswrapper を使わないように移行するため、次のようにしてみた。(正しい手順かどうかは保証しない)

1. レポジトリ設定ディレクトリの CVSROOT から cvswrapper を削除する。

$ cd ~/Development # ホームディレクトリ以外で作業すること $ ocvs -d ~/cvsroot checkout CVSROOT $ cd CVSROOT $ rm cvswrappers $ ocvs remove cvswrappers $ ocvs commit -m "cvswrappers is removed" $ cd .. $ ocvs -d ~/cvsroot release -d CVSROOT $ cd ~/cvsroot/CVSROOT $ rm cvswrappers # 単にこれだけでもよかったのかも?

2. レポジトリから nib ファイル、バイナリファイルを含むディレクトリを強制削除する。

$ cd ~/cvsroot/project-name $ rm -rf English.lproj $ rm -rf Icons

3. プロジェクトディレクトリに戻り、上のディレクトリの中の CVS ディレクトリを削除する。

$ cd ~/Development/project-dir $ cd English.lproj $ rm -rf CVS */CVS */*/CVS # */*/... はディレクトリの階層に応じて $ cd ../Icons $ rm -rf CVS */CVS */*/CVS # 同上 $ cd ..

4. これらのディレクトリを登録し直す。nib ファイルはディレクトリとして、中身のファイルも個別に登録。バイナリファイルは -kb オプションをつけて登録。

$ cvs add English.lproj $ cd English.lproj $ cvs add *.nib $ cvs add *.nib/*.nib # info.nib, classes.nib, objects.nib $ cd ../Icons $ cvs add Icons $ cvs add -kb *.icns *.tiff *.png $ cd .. $ cvs commit -m "update to avoid using cvswrappers"

 バイナリファイルは cvs remove して cvs add し直すだけでよかったかも知れない。nib ファイルについては、「かつて存在したファイルと同名のディレクトリ」をリポジトリに加えようとすると cvs が文句を言うので、強制削除する必要がある。

5. 10.2/10.3 を cvs サーバとして使っている場合は、Darwin のソースから cvs をとってきてコンパイルすれば 10.4 と同じバージョンを利用できる。10.4.8 (Darwin 8.8) の PPC 用ソースは 10.2 上でコンパイルできた。configure; make; sudo make install でよい。