前回の記事ではSVKの基本的な操作方法を説明しました。最終回の今回はSubversionのリポジトリと連携しながら、
リモートのSubversionのリポジトリとして、
C:\> cd c:\tmp\gihyo C:\tmp\gihyo> svn import http://localhost/svn/MyProject/ -m "test project" 認証領域: <http://localhost:80> trac 'Administrator' のパスワード: 認証領域: <http://localhost:80> trac ユーザ名: user1 'admin' のパスワード: ******** 追加しています trunk [中略] 追加しています tags リビジョン 1 をコミットしました。 C:\tmp\gihyo>
次にtrunkからテスト用のブランチを作成します。
C:\tmp\gihyo> svn copy http://localhost/svn/MyProject/trunk http://localhost/svn/MyProject/branches/remote
これまでの操作で図1のようなディレクトリ構造になります。

以上で準備ができました。これから、
リモートリポジトリをミラーリング
SVKで管理するときは、
svk mirror SubversionのリポジトリのURL SVKのリポジトリ名
それでは、
C:\tmp\>svk mirror http://localhost/svn/MyProject //mirror Authentication realm: <http://localhost:80> trac Password for 'admin': Mirror initialized. Run svk sync //mirror/trunk to start mirroring. C:\tmp>
ここでは、
次のコマンドを実行することで、
C:\tmp>svk mirror --list Path Source ===================================================== //mirror http://localhost/svn/MyProject C:\tmp>
ミラーしたものは、
C:\tmp>svk sync //mirror Syncing http://localhost/svn/MyProject Retrieving log information from 2 to 2 C:\tmp>
複数のリモートリポジトリを管理している場合は、
svk sync --all
ローカルブランチがあなたの作業領域
SVKではミラーリングしているパスに対して直接編集しません。代わりに、
C:\tmp>svk copy //mirror/trunk //work Waiting for editor... Committed revision 10. C:\tmp>
作業用ブランチが作成できたので、
C:\tmp>svk checkout //work MyProject Syncing //work(/work) in C:\tmp\MyProject to 10. A MyProject\README.txt [中略] A MyProject\index.html C:\tmp>
現在のリポジトリの構造は図2のようになっています。

作業領域を最新に
「svk sync」
まず、
=========== SVK Sample =========== This is modified for SVK test. This line is the remote modification for conflict test. This is SVK Sample Project.
最初に次のコマンドを実行して、
C:\tmp\MyProject>svk sync --all
次に、
C:\tmp\MyProject>svk smerge -C //mirror/trunk //work Auto-merging (7, 11) /mirror/trunk to /work (base /mirror/trunk:7). U README.txt D docs New merge ticket: 3d528234-c470-8440-b20e-186cbe60fd7c:/trunk:3 C:\tmp\MyProject>
この結果から、
C:\tmp\MyProject>svk smerge -l //mirror/trunk //work Auto-merging (7, 11) /mirror/trunk to /work (base /mirror/trunk:7). Waiting for editor... U README.txt D docs New merge ticket: 3d528234-c470-8440-b20e-186cbe60fd7c:/trunk:3 Committed revision 12. C:\tmp\MyProject>
これで、
C:\tmp\MyProject>svk update Syncing //work(/work) in C:\tmp\MyProject to 12. U README.txt D docs C:\tmp\MyProject>
衝突が起きたとき
開発中にはなるべく衝突が起きないようにすることが大事ですが、
衝突が起きるように、
=========== SVK Sample =========== This is modified for SVK test. This line is modified for conflict test. (remote) This is SVK Sample Project.
ローカルの作業コピーC:\tmp\MyProject\README.
=========== SVK Sample =========== This is modified for SVK test. This line is modified for conflict test.(local) This is SVK Sample Project.
C:\tmp\MyProject\README.
C:\tmp\MyProject>svk commit README.txt Waiting for editor... Committed revision 13. C:\tmp\MyProject>
これで衝突が起きる状態になりました。まず、
C:\tmp\MyProject>svk sync //mirror/trunk Syncing http://localhost/svn/MyProject/trunk Retrieving log information from 4 to 4 Committed revision 14 from revision 4. C:\tmp\MyProject>
同期が完了後、
C:\tmp\MyProject>svk smerge -l //mirror/trunk //work
コマンドを実行すると、
Conflict found in README.txt: e)dit, d)iff, m)erge, s)kip, t)heirs, y)ours, h)elp? [e]
「d」
--- README.txt (YOURS) +++ README.txt (MERGED) @@ -3,7 +3,13 @@ ======= This is modified for SVK test. +>>>> YOUR VERSION README.txt (/work) 119781301192861 This line is modified for conflict test.(local) +==== ORIGINAL VERSION README.txt 119781301192861 +This line is the remote modification for conflict test. +==== THEIR VERSION README.txt (/mirror/trunk) 119781301192861 +This line is modified for conflict test. (remote) +<<<< 119781301192861 Python program for RSS aggregation and filtering.
自分の変更を適用する場合は
=========== SVK Sample =========== This is modified for SVK test. >>>> YOUR VERSION README.txt (/work) 119781301192861 This line is modified for conflict test.(local) ==== ORIGINAL VERSION README.txt 119781301192861 +This line is the remote modification for conflict test. ==== THEIR VERSION README.txt (/mirror/trunk) 119781301192861 This line is modified for conflict test. (remote) <<<< 119781301192861 This is SVK Sample Project.
このファイルを編集して保存、
修正が終わると、
C:\>tmp>MyProject> svk update
マージは複雑なように見えます。ブランチへのマージではSubversionの場合、
変更をリポートリポジトリに反映
現状ではローカルリポジトリに加えた変更は、
C:\tmp\MyProject>svk smerge -C //work //mirror/trunk Auto-merging (0, 22) /work to /mirror/trunk (base /mirror/trunk:21). Checking locally against mirror source http://localhost/svn/MyProject/trunk. Empty merge. C:\tmp\MyProject>svk smerge -l //work //mirror/trunk Auto-merging (0, 22) /work to /mirror/trunk (base /mirror/trunk:21). Waiting for editor... Merging back to mirror source http://localhost/svn/MyProject/trunk. Empty merge. C:\tmp\MyProject>
図3は、

//
C:\tmp\MyProject>svk smerge -l //work //mirror/branches/remote
Tracのリポジトリブラウザでbranchの内容を確認してみてください。branchにも変更が適用されているのが分ると思います。SVKを使って定期的にtrunkからbranchにマージを行なうことで、
おわりに
2回にわたってSVKの機能について説明してきました。SVKには本連載では説明できなかった多くの機能があります。まだ一部のギークにしか認知されていない、