(2005/11/27 記)
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
リポジトリの設定は 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 のユーザー設定が保存されるが、これはプロジェクト自体には重要でない上にファイルを何も編集しなくてもいちいち更新されるので、これもバージョン管理から外した。
$ cd project-dir $ cvs -d $CVSROOT import -m "message" project-name vendor-tag release-tag
project-name
は project-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 add
と cvs remove
の組み合わせでやるほかない。ファイル名の変更はともかく、ディレクトリ名の変更は非常に煩雑なので、なるべく避けた方がよい。
$ cvs [-Q] diff -c [filename]
-Q
は強い quiet オプション、-c
は diff
へのオプション(コンテキスト 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
実は作業コピーを丸ごと削除するだけでもよいので、あまり使う必要はない。
(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
でよい。