svkを使ってみた

なにやらsvkというものが流行ってるようなので使ってみた。
svkSubversionのラッパーのような感じでリポジトリの分散管理が行えるシステム。
ローカル環境にリポジトリのミラーを作成して、元のリポジトリと同期を取ることができる。
具体的にはノートPCなんかでローカルにミラーを作成しておくと、ネットワークに繋がっていなくても開発が行えて、ネットワークに繋がったときに溜まっていたコミットをまとめて反映、というようなことができる。
また、個人的な作業ブランチの代わりに使うといったこともできる。

全体の流れ

  1. ミラーの作成
  2. 作業用ブランチの作成
  3. チェックアウトしていつものように作業
  4. 本家と同期

インストール

Version Control with SVKからダウンロードしてきてインストール。
Windowsの場合はSVKWin32というのがあるのでこちらをインストール。
インストーラに従って適当に進めていけば、コマンドプロンプトsvkコマンドが実行できるようにしてくれる。

svkの初期化

svk depotmap --init

Windowsの場合は\Documents and Settings\{ユーザ名}の下に出来るので少し気持ち悪い。
気になる人はsvk.batあたりで環境変数HOMEに適当なパスを設定してあげるといいかも。
そのせいでおかしくなっても知らないけど(ぉ

ミラーの作成

svk mirror http://example.com/svn/example //mirror/example

trunkだけとかブランチだけでもよい。

svk mirror http://example.com/svn/example/trunk //mirror/example/trunk
svn+sshの場合

Windowsの場合は環境変数SVN_SSHplinkとかを指定しておく(スラッシュ区切りのパスじゃないとだめぽい)。
まぁsvnの時と同じ。

set SVN_SSH="C:/PuTTY/plink.exe"

同期の開始

ミラーを作成しただけでは実体が取得されていないので、なにはともあれ同期を行う。

svk sync //mirror/example

リポジトリがでかい場合は時間がかかる。
skiptoオプションを利用すると特定のリビジョン以降を対象に同期が行える。

svk sync --skipto HEAD //mirror/example

作業用ブランチの作成

なんでか知らないけどミラーリポジトリには直接コミットしてはいけないらしい。
ローカルでさらにブランチを作成して、そこにコミットしていくらしい。

svk copy -p //mirror/example //local/example

pオプションは親ディレクトリであるlocalも作ってもらうため。既に存在するなら不要。

開発作業(svkを使う場合)

チェックアウト

作業ブランチからチェックアウト。
svnと同じだがリポジトリには先ほどの作業用ブランチを指定する。

svk co //local/example/trunk example

以降はsvnのときと同じ作業をsvkコマンドで行う。

などなど


ちなみにsvkでチェックアウトした場合は.svnのような管理ディレクトリは存在せず、まるでexportしたかのように管理対象のファイルのみで構成される。
どのリポジトリの作業コピーなのかを確認するにはsvk infoを実行すればよい。

開発作業(svnを使う場合)

svnコマンドやTortoiseSVNSubclipseなどを使いたい場合はちょっとコツがいる。

svnTortoiseSVNでチェックアウト

作業用ブランチからのチェックアウトは次のようにsvkの管理リポジトリ(?)を直接指定する形になる。

svn co "file:///C:/Documents and Settings/ユーザ名/.svk/local/local/example/trunk" example

実態として.svk/localの下が存在しないが気にせずに実行すべし(.svk/localがデータベースで、その中の/local/example/trunkになる)。
local/がかぶってるのは、先ほど作成した作業用ブランチのlocalの分。
もちろんtrunkだけじゃなくて全体だったりブランチなりでもよい。


あとは普通にsvnなりTortoiseSVNなりで作業が行える。

同期

オリジナルリポジトリからミラーへ。

svk sync //mirror/example

オリジナルリポジトリからミラー&作業用ブランチへ。

svk pull //local/example

作業用ブランチからミラー&オリジナルリポジトリへ。

svk push --verbatim //local/example

lumpオプションをつけると、ローカルでのコミットを1つにまとめて反映してくれる。

svk push --verbatim --lump //local/example

コメントも結合してくれる。

まとめ

svkをはじめて使う時はまず初期化。

svk depotmap --init

ミラーと作業用ブランチの作成。

svk mirror http://example.com/svn/example //mirror/example
svk sync //mirror/example
svk copy -p //mirror/example //local/example

チェックアウト(svnでの作業を選択してみる)。

svn co "file:///C:/Documents and Settings/ユーザ名/.svk/local/local/example/trunk" example

開発作業しまくり(ここはsvnコマンド)。

svn update
svn ci
...

本家の更新も取り入れたいので同期も実行。

svk pull //local/example
svn update

そろそろ本家に反映しておくか。

svk push --verbatim //local/example

とまあこんな感じになる。
pullとpush(あるいはsmerge)以外はsvnでの作業が行える。