svkを使ってSubversionの分散リポジトリを実現する

Subversion

Windows環境でSubversionTortoiseSVNsvkを使い、Subversionの分散リポジトリを構築してみました。環境構築時の各バージョンはSubversion 1.5.4,TortoiseSVN 1.5.5,svk-2.2.0です。

作業では「subtech – MisuzillaSubtechImpl – Windows(TortoiseSVN付き) で svk を使う」と「svk – 気の向くままに・・・ – livedoor Wiki(ウィキ)」を参考にさせて貰いました。

SVKのインストール

Windows用インストーラをダウンロードして、SVKのインストールを行います。「HomePage – SVK Wiki」から辿るか、「SVKWin32 – SVK Wiki」から取ってきてください。

インストール途中で「Change the environment for all users?」(全てのusersで使用するか?)と言う質問が出るので、良いように回答します。インストールが終わると、自動的にインストールフォルダにパスが通されます。

環境設定

インストール後に1回だけ「svk depotmap –init」コマンドを実行し、ローカルリポジトリの場所指定を行います。

  1. コマンドプロンプトを開き、「svk depotmap –init」を実行
  2. 途中でメモ帳が開き、レポジトリの場所を決めるコンフィグファイルを編集しろと言ってくるので適宜編集。
  3. そのまま閉じた場合は「Repository C:\Documents and Settings\username\.svk\local does not exist, create? (y/n)」というメッセージが表示されるのでyを入力。

初期設定後に別の場所にSVKリポジトリを作りたくなったら、TortoiseSVNで任意の場所にリポジトリを作ったあと、"svk depot –relocate hoge"コマンドで「hoge」リポジトリに変更できます。

“svk help depot"で depotmap 関係のヘルプが表示されますので参照あれ。

環境設定、その2

使用するリポジトリを、ミラー元からローカル環境にミラーリングします。

使用するコマンドは"svk mirror", “svk sync", “svk cp"の3種類で、それぞれのコマンドの使い方は以下の通りです。

svk mirror <ミラー元> <ローカルのミラー先>
svk sync <ローカルのミラー先>
svk cp <ローカルのミラー先> <ローカルの実使用場所>

上記のコマンドを使い、ミラー元のリポジトリ「SVNserver/hoge」を、ローカルの「//mirror/hoge」にミラーリングし、更にそのレポジトリを「//hoge 」にコピーします。

リポジトリのコピー例は以下の通りです。

svk mirror svn://SVNserver/hoge //mirror/hoge
svk sync //mirror/hoge
svk cp //mirror/hoge //hoge

“svk sync"時、"–skipto HEAD"オプションを使うと最新バージョンのみミラーリングするようです。ミラー元のリビジョンが莫大な場合は、適宜skipした方が良いのかも知れません。

ミラーリングしたリポジトリを、更にコピーして使う理由は良く分かっていません。おまじないかな?

TortoiseSVNでチェックアウトする

ここまででローカルにSVKのリポジトリができました。あとはTortoiseSVNを使ってローカルbranchをチェックアウトしましょう。

ローカルリポジトリの場所が初期設定のママで、且つ上記の例にしたがってミラーリングすると、チェックアウトすべきリポジトリは下記の場所にあるはずです。

“file:///C:/Documents and Settings/username/.svk/local/hoge"

上記フォルダをチェックアウトすれば、まるでミラー元のリポジトリをチェックアウトしたかのように動作するはずです

日々の運用

日々の運用イメージはこんな感じです。

  1. チェックアウトしたフォルダで作業を行い、変更や追加などを行う。
  2. 必要に応じてTortoiseSVNで、ローカルリポジトリにコミット。
  3. 必要に応じてローカルをミラー元に反映させる。コマンドは以下の通り。

    svk push –verbatim <ローカルの実使用場所>
    svk push –verbatim //hoge

'verbatim’オプションを使うと、ローカルにコミットした時のコメントを使って、ミラー元にコミットしてくれる。

push用バッチファイルを作っておくと良いかも。

他人の作業をローカルに反映させる

ミラー元から他人の作業内容を取得し、ローカルリポジトリに反映します。

  1. ローカルと同期させる。これもpull用バッチファイルを作っておくと良いかも。

    文法:
    svk sync <ローカルのミラー先>
    svk pull <ローカルの実使用場所>
    例:
    svk sync //mirror/hoge
    svk pull //hoge

  2. TortoiseSVNで「更新」を実行

ここまでで重要なことは"svk push"と"svk sync"実行時以外、日常的作業ではミラー元に接続せずにローカルで作業が行えることです。

疑問点

まだ使い慣れていないので、良く分かっていないところもあります。

  • コンフリクト時の正しい解決方法が良く分からず。
    • 複数コミットを一括でpushした途中でconflictが発生している?
    • editでそれっぽく直したあと、acceptすれば良さそう?
    • 最終的にはミラー元とローカルで同じファイルになった?
  • TortoiseSVNの「再配置」でリポジトリのミラー先とリモートを切替えられない。