ソフトウェア開発において、バージョン管理が大切ということを前回の分散型バージョン管理システムの構築#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でブランチをかぶせてしまう、という手もあります。 この方法の欠点は、ローカルブランチが、いったんリモートと一致してしまい、厳密な意味でのブランチでは無くなってしまうこと。
この最後の方法の是非については、もうちょっと検証してみたいと思います。
