分散型バージョン管理システムの構築#2 SVKの活用

 

ソフトウェア開発において、バージョン管理が大切ということを前回の分散型バージョン管理システムの構築#1で書きました。

今回は、SVNサーバと連携可能な、個々のマシンでのバージョン管理を実現する、SVKというソフトウェアを試してみます。 これを使用することにより、開発者一人ひとりの作業単位ごとのリビジョン管理が、全体を乱さずに行うことができるというメリットがあります。

SVKの導入と、簡単な使用方法について、続きはこちら・・・。

用意するもの: ・SVK ・Eclipseのインスタンスを2つ ・SVNサーバ環境

SVKは、以下のURLから、インストーラを取得して、インストールしてください。 http://svk.bestpractical.com/view/HomePage

1.本サーバの準備 今回のプロジェクトを、CollabProjectとします。 SVNサーバで以下のコマンドを実行し、このテストで使用するリポジトリを用意しておきます。 svnadmin create /usr/local/srv/svn/CollabProject

2.最初のコミット 異なるPCでの運用を想定して、Eclipseを2つ用意します。 Eclipseは、ワークスペースが異なれば、複数起動できますが、 これまで使っていたEclipse 3.3 “Europa”と、いい機会なので、Eclipse 3.5 “Galileo”を用意しました。

Europaには、Subversive(SVNKit 1.2.0)が、Galileoには、Subversive(SVNKit 1.3.0)および、Subclipse(1.6.2)をインストールしてあります。

まず、テスト用に、Europaで簡単なJavaプロジェクトを作成しました。 このプロジェクトを、普通に、SVNサーバにコミットします。 プロジェクト上で右クリックし、「チーム」「プロジェクトの共用」を選択、SVNを選択し、新しいリポジトリを作成します。 ここで、リポジトリのURLに、 http://「サーバ名」/svn/CollabProject と入れておきます。

次の画面で、下の方に表示されるURLを注意してください。 http://「サーバ名」/svn/CollabProject/trunk/CollabTestProject

このURLを、GalileoとSVKの接続で使用します。

3.SVKでミラー作成 次に、ローカルにインストールしたSVKで、サーバのミラーを作ります。 コマンドプロンプトで

svk mirror http://「サーバ名」/svn/CollabProject //mirror/CollabProject と入力します。

このコマンドは、リモートの、CollabProjectというリポジトリを、ローカルの//mirror/CollabProjectというリポジトリにミラーリングします、という手続きです。 次に、リモートとローカルを同期させます。

C:>svk sync //mirror/CollabProject Syncing http://「サーバ名」/svn/CollabProject Retrieving log information from 1 to 2

####################################### 100.0%

これで、ローカルに、リモートのファイルがコピーされます。 ミラーは、リモートのエイリアスのようなリポジトリなのですが、 これにEclipseなりTortoiseなりをつなげばよいか、というと、どうも駄目なようです。

4.ローカルブランチの作成 作成したミラーから、ローカルブランチを作ります。 実際にEclipseやTortiiseでチェックアウトするのは、このローカルブランチです。

svk copy //mirror/CollabProject //CollabProject

こうすると、SVKの管理するリポジトリの直下に、CollabProjectリポジトリができます。

デフォルトの設定でSVKをインストールした場合、ユーザのホームディレクトリ(XPでは、Documents and Settings以下、Vistaでは、Users以下)に、.svkというディレクトリが作成され、その中のlocalディレクトリを基点に管理されます。

5.Galileoからの接続 (別にGalileoである必要はないのですが・・・。) パッケージエクスプローラなりで、右クリック、「インポート」を選択します。 「SVNからプロジェクトをチェックアウト(Subclipseの場合)」を選択し、URLに、 file:///C:/Documents and Settings/ユーザ名/.svn/local/CollabProject と入れてみましょう。 2.での表示どおり、trunk以下に、CollabTestProjectフォルダがあるのが見えると思います。 これを選択してチェックアウト。 プロジェクトがインポートされます。

この段階で、EuropaとGalileoのソースコードの状態が一致しているはずです。

これで、旅立つ準備は完了です。

6.ソースコードの変更 さっそく、Galileoでソースを変更してみます。 普通にコミットできると思います。 これは、

Galileo ↓ commit ローカルブランチ(//CollabProject)

という動きです。

続けて、Europaでもソースを変更します。 こちらも、SVNサーバにコミットしてください。

Europa ↓ commit SVN trunk

普通ですね。

7.SVNとSVKの同期

では、SVKとSVNを同期してみます。

まず、SVNとミラーを一致させます。 svk sync //mirror/CollabProject

下のようなイメージです。 SVN trunk ↓ sync SVKのミラー(//mirror/CollabProject)

更新がある場合は、リビジョン番号が表示されます。 C:>svk sync //mirror/CollabProject Syncing http://192.168.0.29/svn/CollabProject Retrieving log information from 25 to 25

####################################### 100.0%

次に、ミラーとローカルブランチの同期を取ります。 まず、どんな風になるか、-Cオプションをつけて確認します(これをdry-runというらしい)。 svk smerge -C //CollabProject /mirror/CollabProject

競合があると、以下のように表示されます。 C:>svk smerge -C //CollabProject //mirror/CollabProject Auto-merging (45, 47) /CollabProject to /mirror/CollabProject (base /CollabProject:45). Checking locally against mirror source http://192.168.0.29/svn/CollabProject. C trunk/CollabTestProject/src/jp/rbx/collab/test/TestMain.java New merge ticket: 64b57225-6466-d443-bb0b-7d9be9e6ffd3:/CollabProject:47 Empty merge. 1 conflict found.

マージを行います。

SVKのミラー(//mirror/CollabProject) ↓↑ ローカルブランチ(//CollabProject = Galileo)

svk smerge //CollabProject //mirror/CollabProject

C:>svk smerge //CollabProject //mirror/CollabProject Auto-merging (45, 47) /CollabProject to /mirror/CollabProject (base /CollabProject:45). Waiting for editor... Merging back to mirror source http://192.168.0.29/svn/CollabProject. Conflict found in trunk/CollabTestProject/src/jp/rbx/collab/test/TestMain.java: e)dit, d)iff, m)erge, s)kip, t)heirs, y)ours, h)elp? [e]

競合をどのように解決するか聞かれます。

e)dit:メモ帳で競合ソースを編集 d)iff:差分をコンソールに表示 m)erge:TortoiseやWinMergeなどの差分エディタで編集 t)theirs:リモートの方を適用 y)ours:自分の方を適用

う~ん。Eclipseの差分エディタに慣れた身では、mが一番近いんだけど・・・。

ここで、WinMergeなどを使用して、競合を解決するのがベスト。

競合を解決したら、 svk synk //mirror/CollabProject で、ミラーの内容をSVNサーバに反映させて完了です。

SVNサーバには、Galileoでローカルブランチにコミットした履歴がすべて入ります。

でも、差分がたくさんあるような場合など、落ち着いて、使い慣れたEclipseで解決したいこともあるでしょう? そんな場合、全部theirsではどうでしょう? そうすると、こんどは、Galileoとローカルブランチで差分ができて、Eclipseの差分エディタで編集することができますよ。 ならばいっそ、smergeではなく、svn updateでブランチをかぶせてしまう、という手もあります。 この方法の欠点は、ローカルブランチが、いったんリモートと一致してしまい、厳密な意味でのブランチでは無くなってしまうこと。

この最後の方法の是非については、もうちょっと検証してみたいと思います。

コメントする

Filed under 05.技術情報

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>