_ バージョン管理(svk)
ActivePerl or Debian(sid) から svk をお試し。
インストール
sid は apt-get で OK。
ActivePerl は BuildingSvkInYourHomeDirectory
の最後を参考に、CPAN から順にインストール。
- ActivePerl をインストール
- nmake, Mingw をインストール。Visual C++ がインストールされている場合は不要。
- <URL:http://subversion.tigris.org/> から subversion の win32 バイナリと perl モジュールを
ダウンロード&適当に展開。環境変数 APR_ICONV_PATH に展開場所の iconv ディレクトリを指定する。
- cpan ExtUtils::Fake
- 環境変数 PERL5OPT に -MConfig_m を設定
- cpan XML::Doctype
- CPAN から A/AU/AUTRIJUS/VCP-autrijus-snapshot-0.9-20050110.tar.gz をインストール。
test に失敗するので cpan shell から force install する必要がある。
- cpan Sort::Versions
- cpan SVN::Mirror
- File::chdir がテストに失敗するので force install
- cpan SVK
- Clone のインストールに C コンパイラが必要
- テストに失敗するので force install
- cpan VCP::Dest::svk
- cpan Win32API::GUID
コンパイルするモジュールをあらかじめ PPM でインストールできれば、C コンパイラは不要かも。
動作
分散バージョン管理ツールとして svk は、VCP モジュールを使った他形式レポジトリの直接ミラーが可能である点が特徴。
作者はこの使いかたに結構こだわりがあるようで、日々の使用で入力するコマンドが少なくなくなるように拡張している模様。
- svk mirror repository //depot で登録
- svk sync //depot でレポジトリの更新。
または svk sync -a で全 //depot の更新。push/pull でアップロード/ダウンロードのみ。
- svk copy //depot //local-depot でローカル更新用 depot を作成。
後は depot 間の smerge や、local-depot の checkout/add/remove/commit/update で操作。
この他、以下の点が長所としてあげられる。
- subversion (fsfs) をベースに構築されている。
- .svn を各ディレクトリに作成しない。ローカルコピーも同ディレクトリ内に保持しないため、
grep や find がしやすい。
- perl で記述されている(同時に弱点でもあるが)。
問題点
しかし、直接ミラーは以下の点で実際には使いにくい。
- 接続後、とりあえず全リビジョンと全ファイルの対応 DB を作成しようとするので、
巨大なレポジトリのデータ取得にかなり時間がかかる。
会社のソースコードレポジトリをミラーしようとしたら、コードをいじって対象を限定してもこの処理に単純計算で約
5 時間かかる。このあとに各リビジョンごとのデータ取得に入るので、トータルで数日はかかりそう。
- 各リビジョンをミラーしている最中、漢字コードがあわないとき、エラーとして処理が中断する。
- 数千個のファイルを import していると、一時ファイルの読み込みが競合するのか、失敗して処理が中断する。
処理が中断しても DB は壊れていないため、だいたいは大丈夫だと思うが、
気軽に anonymous CVS をミラーしていじる用途に使うには、少し堅牢性が足りないため使用がためらわれる。
結局 cvs export した内容や、tar ball を svk mirror していく運用がよさそうだが、
そうなると他のバージョン管理プログラムとあまり差はなくなってくる。
世界中の anonymous CVS や subversion レポジトリを対象に VCP や SVN::Mirror、VCP::Dest::svk
をデバッグしてからが勝負か。
使いかたの例
まず depot を以下のように作成する。
//mirror <- 外部のレポジトリとの連携用。
//vendor <- cvs export や tar ball を import する depot
//depot <- ここがマスターとなるローカルプロジェクト
//local <- mirror/vendor から copy したプロジェクト
//mirror, //vendor, //depot 以下に適当にプロジェクトを追加する(mirror/sync, import)
//local 以下に //local/プロジェクト名/trunk として copy する。
//local/プロジェクト名/trunk を適当なディレクトリに checkout する。
日々の作業
- svk up -sm //local/プロジェクト/trunk
- 作業ディレクトリ内で svk up -sm でも可
- add/remove/commit で操作
update の -sm オプションは --sync --smerge の省略形。
外部のレポジトリへのアップロードはここではあまり考えてないが、
sync する場合は //mirror 以下への commit や smerge を行えば自動的に反映されていくはず。