svn_load_dirs

cvsでバージョン管理されてるものを手元のsvnリポジトリで追っかけしたいときのメモ。

sf.jpがsvnに対応してくれて、tracも使えて、ついでにtracwiki記法とかプラグインpukiwikiみたいになってくれれば何の問題もないんだけどねー。

必要なもの

でびあんだとsubversion-toolsにsvn_load_dirsというのが入ってます。これがcvsの変更をうまいことsvnリポジトリに反映させてくれます。これで検索すればいろんなところに説明が書いてあるかんじ。

感覚

CVSのworking copyをrepos/vendor/currentに入れておいて、cvs upして差分が出たらそれをcurrentに自動でsvn mergeしてくれます。-tオプションをつければ一緒にtagも作ってくれます。cvssvnの大きな違いである、ファイルやディレクトリの追加・削除は、どうするのか聞いてくれるらしい。まだ試してないです。

mergeは自分でやります。これもやってくれたらいいのにな。

準備

  • cvsのworking copyを用意
% mkdir -p /path/to/example.cvs; cd example.cvs
% cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/example .
% svnadmin create example.svn
% svn mkdir file:///path/to/example.svn/{vendor,vendor/current}
  • cvsのworking copyをimport
% svn import /path/to/example.cvs file:///path/to/example.svn/vendor/current
    • これで 'ls /path/to/example.cvs' と 'svn ls file:///path/to/example.svn/vendor/current' の結果が同じになります
  • trunkにブランチする
% svn copy file:///path/to/example.svn/vendor/current file:///path/to/example.svn/trunk
    • ちなみに先にtrunk作っちゃうとtrunk/currentってなっちゃうので注意。
  • とりあえずtagうっておこう
% svn copy file:///path/to/example.svn/vendor/current file:///path/to/example.svn/vendor/`date +%Y%m%d`

これで準備は終わり。

コミットメールきたよ

本家のアップデートが出たぞ! さあmergeだ!

あらかじめ svn co file://path/to/example.svn/trunk /path/to/work してあるとします。

  • まずはcvs up
% cd /path/to/example.cvs; cvs up -Pd
  • svn_load_dirsの出番
% svn_load_dirs -t `date +%Y%m%d` file:///path/to/example.svn/vendor current example.cvs
    • 引数は順に、currentがあるリポジトリのパス、mergeすべき場所のcurrent、merge元のディレクトリ。
    • -t `date` でタグを自動でうってもらう。タグは重複していない? と確認が出る。
    • ごちゃごちゃとエラーっぽいメッセージが出ることもあるけど、そんなおかしなことにはなっていないみたい。
  • 手元のworking copyにmerge
% cd /path/to/work
% svn merge file:///path/to/example.svn/vendor/前回の日付 file:///path/to/example.svn/vendor/今日の日付 .
    • コンフリクトとかを確認してコミットだ!

感想

CVSとかCVSROOTとか、svnにそのまま突っ込んでも大丈夫なんですねえ。sf.jpもはやくsvn対応しないかなー。