分散バージョン管理システム svk

git,Monotoneだとかの分散バージョン管理システムというものがよくわからないのでスルーしていたsvkですが、僕みたいにどこぞのオープンソースプロジェクトのfork版を作っている人間には便利そうであることがこのへんから伝わってきたので、使ってみることにしました。

svnに無いsvkの特徴で自分が気になったものはこんなところですかね。

  • コミット権限の無いリポジトリをローカルにミラーして好きにいじりまわせる*1
  • .svnディレクトリが必要無いのでワーキングコピーがすっきり
  • リポジトリパスの指定が楽になる
    • svn cp svn+ssh://atty.skr.jp/home/atty/svn/zplayer/trunk svn+ssh://atty.skr.jp/home/atty/svn/zplayer/tags/zplayer-0.2.0
    • svk cp //zplayer/trunk //zplayer/tags/zplayer-0.2.0
  • CVSリポジトリもミラー元として扱える?

とりあえず実際に動かしてみることにしました。

$ svk mirror svn://svn.mplayerhq.hu/mplayer/trunk //mirror/mplayer
$ svk mirror svn://svn.mplayerhq.hu/ffmpeg/trunk //mirror/ffmpeg
$ svk sync --skipto HEAD //mirror/mplayer
$ svk sync --skipto HEAD //mirror/ffmpeg

まずはmplayerffmpegリポジトリをローカルにミラーする設定を行ない、実際に同期を取ります。mplayer/tagsとかmplayer/branchsは必要無いのでtrunkだけミラーしています。mplayerのほうはr16000近くまでいっていて全部ミラーすると大変なことになりそうなので、とりあえず現時点でのHEADから履歴を開始するようにします。

$ svk cp -p -m '' //mirror/mplayer //mplayer
$ svk cp -p -m '' //mirror/ffmpeg/libavcodec //mplayer/libavcodec
$ svk cp -p -m '' //mirror/ffmpeg/libavformat //mplayer/libavformat
$ svk cp -p -m '' //mirror/ffmpeg/libavutil //mplayer/libavutil

//mirror/hogehogeは大元のリポジトリそのもののミラーなのでいじってはいけません。svnでやるように適当なパスにコピーしてブランチを作成します。

$ svk co //mplayer mplayer-bvdd

svnと同じくワーキングコピーをチェックアウトしてセットアップは終了です。簡単ですね。あとは自分のブランチに対して変更を加えていきつつ、svk pullコマンドで上流の変更をマージしていけばいいようです。

$ svk pull                                  ~/zaurus/mplayer-bvdd/
Syncing svn://svn.mplayerhq.hu/mplayer/trunk
Retrieving log information from 19136 to 19136
Committed revision 207 from revision 19136.
Auto-merging (200, 207) /mirror/mplayer to /mplayer (base /mirror/mplayer:200).
U   mp3lib/Makefile
New merge ticket: b3059339-0415-0410-9bf9-f77b7e298cf2:/trunk:19136
Committed revision 208.
Syncing //mplayer(/mplayer) in /home/atty/zaurus/mplayer-bvdd to 208.
U   mp3lib/Makefile

試しにpullしてみたら勝手にマージしてくれました。svnのみでVendor Branchやsvn_load_dirs.plを使って作業するより格段に楽です。

*1:これが分散バージョン管理システムの特徴なのかな?