svk
svk
公式サイトSubversionを分散リポジトリのバージョン管理システムのような感じで扱うことができます。
外出先などでノートパソコン上でがしがし編集し、その内容をイントラネット内のSubversionサーバに反映させたりする場合に便利です。もちろん、svkなしでも編集することはできますが、commitできない(=比較的こまめにcommitする傾向のある人には結構きつい制限かも)・過去のリビジョンとの内容の比較ができない、という点に困っている人にお勧め?
svk1.0.xは、ローカルミラーリポジトリにおける移動やファイル名変更の情報をサーバ側に反映できていませんでしたが、2.0.0でそれらもサポートしたので、かなり使いやすくなりました(パッケージ名やクラス名の変更も気兼ねなくできます)。
インストール
- http://svk.bestpractical.com/view/SVKWin32 (正確には、そのリンク先の http://kevinhlight.googlepages.com/svkwin32 )から、Windows用のインストーラをダウンロードすることができます(2007/01/20現在でVer2.00が最新)。
- ダウンロードしたら、普通にそのexeを実行。インストール先はデフォルトのまま(C:\Program Files\svk)とします。
- 全ユーザーの環境に反映するか?(Change the environment for all users?)というダイアログに対して「はい」。
- インストール作業そのものはこれだけです(非常に簡単)。ついでに、自動的にC:\Program Files\svk\binにパスが通されているようで、コマンドプロンプトからsvkで実行することができます。
ミラーリポジトリの作成
とりあえず、Subversionのリポジトリが複数存在する場合でも、ミラーリポジトリは1つのみ作成することとします(サーバー側はApache2.0.54+Subversion1.4.0(svk1.06の時は1.2.3)で構築されています)。
- svk depotmap --initを実行します。Repository C:\Documents and Settings\username\.svk\local does not exist, create? (y/n)というメッセージが表示されるのでyを入力します(実はここで実行していなくても、mirror作成時に聞いてきますが)。
- svk mirror http://svnserver/svn/TestRepository //mirror/TestRepositoryを実行すると、Committed revision 1.というような感じで処理が完了するはずです。
- リポジトリにおいてパスワード制限がかかっている場合は、当然のことながらパスワードの入力を要求されます。
- これで、とりあえずミラーリポジトリの準備は完了です。
- depotmapコマンドで、別のフォルダにリモートリポジトリを作成することもできるみたいです・・・が、試していません。
- サーバ上のリポジトリのRootから指定していますが、trunkなどのさらに下位の階層から指定することもできるのかもしれません(未確認)。
local mirror・local branchの準備
- svk sync //mirror/TestRepositoryで、データを取得することができ、その結果、local mirrorにデータが格納される。
- なお、リモートリポジトリのサイズにもよるが、それなりに時間がかかります。svk sync //mirror/TestRepository '--skipto HEAD'とすると、最新リビジョンのデータのみを取得するため、処理時間を短縮できますが、ローカル内で過去のリビジョンとの比較ができなくなってしまうので、一長一短です(巨大なリポジトリの場合はそうするしかないこともありそうですが)。
- svk2.0.0でミラーを作成する際、--skipto HEADを行うとエラーが出て作成に失敗してしまいました。深くは追求していませんが・・・(リビジョン数が1000程度だったので、すべてコピーしても何とかなる量だったので)。
- なお、リモートリポジトリのサイズにもよるが、それなりに時間がかかります。svk sync //mirror/TestRepository '--skipto HEAD'とすると、最新リビジョンのデータのみを取得するため、処理時間を短縮できますが、ローカル内で過去のリビジョンとの比較ができなくなってしまうので、一長一短です(巨大なリポジトリの場合はそうするしかないこともありそうですが)。
- svk cp //mirror/TestRepository //TestRepositoryで、local branchを作成します。
- 'local mirrorには直接commitせず、local branchに対してcommitを行い、svk push/pullを使用して同期を行うこと'だそうです。
リポジトリの同期
バッチファイルにしておくと便利かもしれません。svkを実行する際にlocal mirrorやlocal branchのパスをきちんと指定しておくと、svkそのものを実行するフォルダはどこでも(例えばC:\でも、C:\Tempでも)問題ないような感じです。
Remote(Server)→local mirror
- svk sync //mirror/TestRepositoryという感じで、local mirrorを指定してsyncコマンドを実行すればOKです。
- このタイミングでlocal mirror→Remote(Server)の同期もとられているのかもしれませんが、そのような状態を作り出すことができなかったので未確認です。
local mirror→local branch
- svk pull //TestRepositoryという感じで、local branchを指定してpullコマンドを実行すればOKです。
- svk smerge //mirror/TestRepository //TestRepository(local mirror→local branchの順に指定してsmergeコマンドを実行)でも可能?? 詳しくは調べていません。
- svk2.0.0にして以降、svk pullだとコミットメッセージに2バイト文字が含まれていた場合にエラーが発生してしまうので、svk smergeを使用しています。なお、その際はlocal branchに取り込んでいないリビジョンすべてを1つのリビジョンとしてコミットするようにしています。
local branch→Remote(Server)
- svk push --verbatim //TestRepositoryで、local mirror&Remote(Server)に対して一気にcommitを行ってくれます。
- 各リビジョンのコメントは、基本的にlocal branchにcommitした際に入力したコメントがそのままセットされます。ただし、'verbatim'オプションを指定しない場合は、revision@MachineName:UserName | yyyy-MM-dd HH:mm:ss +0900というような感じのメッセージが自動的に付加されます。
- 'lump'オプションをつけることにより、local branch(local mirrorも?)においては複数のrevisionとなっているものを、Remote(Server)に対しては1回のcommitとして処理してくれるとのことです。
- この場合、コメントがどのように処理されるのかは調べていません。
- ローカルのリビジョンと1:1とするか、複数:1とするかは運用次第と言ったところでしょうか。
- svk smerge //Tools //mirror/TestRepositoryでもlocal branch→local mirror→Remote(Server)の同期を行うことができるっぽいですが、local mirror→local branchの時と同様、詳しくは調べていません。
- なお、この場合も、ローカルでは複数のリビジョンであるものがRemote(Server)に対しては1回のcommitとなるようです。
- この場合、smergeを行う際にコメントを入力し、それがRemote(Server)にも登録されるようです。コマンドラインにおいてコメントを入力しなかった場合は、Notepadが起動して入力できるようになっています。
- svk2.0.0にして以降、verbatimオプションなしでコミットした場合に文字コードのエラーが発生してしまいます。どうも、自動で付加するタイムスタンプメッセージの部分の処理に失敗しているようなので、verbatimオプションを指定することで回避しています。なお、通常のコミットメッセージに含まれている2バイト文字は問題なく処理できています。
TortoiseSVNでのチェックアウト
- Windows上で作業するなら、やはりTortoiseSVNを使うのが楽でしょう。
- file:///C:/Documents and Settings/username/.svk/local/TestRepositoryという感じで、local branchにアクセスすることができます。
- local mirrorを指定しないように注意してください。
- もちろん、Subclipseなどでも問題なくアクセスできます。
複数のリモートリポジトリを扱う。
- svk mirror http://svnserver2/svn/TestRepository2 //mirror/TestRepository2
- svk sync http://svnserver2/svn/TestRepository2 --skipto HEAD
- svk cp //mirror/TestRepository2 //TestRepository2
- TortoiseSVNでfile:///C:/Documents and Settings/username/.svk/local/TestRepository2をチェックアウト。
- svk sync //mirror/TestRepository2
- svk pull //TestRepository2
- svk push --verbatim //TestRepository2
ってな感じでリモートのリポジトリ本体の存在場所を特に意識することなく処理することができます。
謎な現象
複数(5個)のリモートリポジトリのミラーをローカルに作成してあれこれしていたところ・・・そのうちの1つにおいて、Can't find merge baseというような感じのメッセージが表示されてpushもpullもできなくなるという現象が(正確なメッセージは覚えていませんが)発生。
で、ミラーリポジトリを作り直してあれこれ試してみると、push/pullできなくなっていたリポジトリも単独(そのリポジトリのみをミラーしている場合)なら問題なく処理できているので、別に設定の仕方を間違えていたわけではない模様。
その後、2個目以降のリポジトリのミラーを作成して、1つ作るごとに全てのミラー(正確にはそのローカルブランチ)にpush/pullを行っていくと、途中から処理できなくなってしまうことが判明。
ただ、ミラーを作成している個数とは関係がないような感じです(ミラーを作成する順番をあれこれ入れ替えて試したわけではないのですが)。
ん〜〜〜何が原因なんでしょう??
仕方がないので、とりあえずよく使うと思われるリポジトリ(3つ)のみに制限してミラーを行うことにしましたが。
補足
2007/01/20
- svk1.0x→svk2.0への移行は、特に何も考えずに行えました。svkのプログラムの差し替えのみでローカルミラーの再構築等は行っておりません。
- もっとも、Subversion1.2ベースのものがSubversion1.4ベースになっているので、ローカルミラーの再構築を行うとファイルサイズがコンパクトになるかもしれません(Subversion1.4で差分抽出アルゴリズムが変わったようで、それ以前のVersionに比べるとリポジトリサイズがコンパクトになる場合が多いです。特に、同じファイルに対して頻繁に変更を加える場合に顕著です)。
- svk2.0以降、ローカルブランチにおけるリネーム/移動といった情報もリモートリポジトリに反映させることができるようになりました。
- このページを最初に書いたときはサーバ側のSubversionは1.2.3でしたが、現在はSubversion1.4.0で問題なく動作しています(Apacheは2.0.54のままですが)。
2007年03月10日(土) 22:08:52 Modified by syo1976