Subversion+svkでらくらく分散リポジトリ

第3回 SVKとSubversion

この記事を読むのに必要な時間:およそ 4 分

SVKのコンセプト

SVKは,単独でバージョン管理の機能を提供できますが,本当に便利な使い方ができるのは,複数のSubversionや他のバージョン管理システムと連携したときです。ここでは,Subversionとの連携を例に説明します。

Subversionと連携するとき,大きく二つのレイヤーに分けられます図3⁠。通常のSubversionなどのリモートサーバのリポジトリとSVKが動作しているローカルのマシン上でのリポジトリです。Subversionのリポジトリにはhttpやhttps,svnプロトコルでアクセスします。図のSubversionのリポジトリにはtrunkとbranch-remoteの二つのディレクトリがあり,branch-remoteはtrunkをコピーして作られたものです。

図3 リポジトリの構成図

図3 リポジトリの構成図

SVKが動作するマシン上には,SVKのリポジトリがあります。SVKのリポジトリ内にSubversionのリポジトリがミラーリングされており,trunkとbranch-remoteが存在します。SVKのリポジトリの中でもSubversionのリポジトリと同様にbranch-remoteはtrunkからコピーされたという情報を保持しています。この情報は後述するマージの際に重要になります。また,ミラーリングのスピードを上げるためにも重要です。

SVKではミラーリングしているディレクトリを直接操作はしません。通常は,ローカルリポジトリにtrunkのブランチを作成します。ここでは,branch-localを作成しています。最後にローカルリポジトリから作業コピーをチェックアウトしてコードの編集を行います。ここでは,branch-localとbranch-remoteをチェックアウトしています。チェックアウトしたディレクトリがミラーリングしているディレクトリか,ローカルブランチのディレクトリかで,コミット時の動作が変わります。この二種類を区別するのは重要です。

リモートとの同期 (sync)

ミラーリングしたリポジトリは定期的にリモートとのサーバと同期する必要があります図4⁠。同期を実行しないと,チーム内の他の人の変更を見ることができません。そのため,同期は定期的に行うのが好ましいです。syncコマンドでは,ローカルリポジトリのリビジョンとリモートリポジトリのリビジョン間の差分を転送し,ローカルリポジトリにマージ,コミットします。図からもわかる通り,同期はリモートリポジトリとローカルリポジトリの間で行われます。作業コピーには影響しません。

図4 リモートリポジトリとのミラーリングの概念図

図4 リモートリポジトリとのミラーリングの概念図

作業コピーの更新(update)

更新処理は,ローカルリポジトリの内容を作業コピーに反映する作業です図5⁠。リモートリポジトリと同期を行った後に,その変更を作業コピーにも適用します。この作業も定期的に行う必要があります。作業コピーとローカルリポジトリとの差分が大きくなれば,衝突が発生する可能性が高くなります。衝突が発生すると,連載の第一回目に述べたように手動でマージする必要があります。updateコマンドとsyncコマンドは別の作業なので個別に実行する必要があります。面倒な場合は,次のコマンドを実行することでsyncとupdateを同時に行えます。

$ svk update -s

図5 作業コピーの更新の概念図

図5 作業コピーの更新の概念図

コミット (commit)

コミットの動作は,どのツリーにコミットするかによって動作が変わります図6⁠。ローカルブランチbranch-localへコミットする場合は,ローカルのリポジトリに反映されるだけです。一方,branch-remoteの作業コピー上でコミットすると,変更分はリモートリポジトリに直接コミットされます。次にリモートサーバとローカルリポジトリと同期が行われて,変更分がローカルリポジトリにコミットされます。つまり,ローカルリポジトリへのコミットはオフラインでもできますが,リモートリポジトリへのコミットはネットワークにつながった状態でしかできません。

図6 コミットの動作概念図

図6 コミットの動作概念図

スターマージ(smerge)

スターマージはSVKでもっとも複雑な処理で,SVKを特徴づける機能の一つです。通常Subversionでブランチ間のマージを行う場合,リビジョン番号を明示的に使用しなければいけません。特に,ブランチでtrunkと同期をとりながら機能追加を行うのは至難の業です。定期的にブランチとtrunkの同期を行わないと,衝突が発生する可能性があります。一方で,頻繁に同期すると,コミットログからどのリビジョン間でマージを行ったか調べる必要があり,煩雑です。SVKではマージしたリビジョンや,どのツリーとどのツリーをマージしたか,という情報を保持しています。smergeコマンドを実行すると図7⁠,SVKが以前のマージ情報やコピー情報をもとに適切にマージします。リビジョン番号を指定する必要はありません。マージが正常に終了するとリモートリポジトリにコミットされ,ローカルリポジトリとリモートリポジトリで同期がされます。

図7 スターマージの動作概念図

図7 スターマージの動作概念図


今回はSVKのインストールと基本的な仕組みを説明しました。次回は具体的な例をもとにsvkの使い方を説明します。

著者プロフィール

大谷弘喜(おおたにひろき)

アリエルネットワーク株式会社所属。P2PアプリケーションやWebアプリケーションの設計,開発。Python大好き。