svn + svk でファイルの移動とファイルの更新がからみあったときの動作が興味深いので検証してみる.
まず svn リポジトリ http://example.com/svn/hello を用意する.
$ cd test
$ mkdir svn svk
$ cd svn
$ svn co http://example.com/svn/hello
A hello/hello.c
svk でミラーし,ローカルブランチを作り,ワーキングコピーを作る.
$ cd svk
$ svk mirror //mirror/hello http://example.com/svn/hello
$ svk sync //mirror/hello
$ svk cp //mirror/hello //local/hello
A hello/hello.c
svn 側でファイル名を変更し,コミットする.
$ cd hello
$ svn mv hello.c hello_world.c
$ svn ci
svk 側でファイルの内容を変更し,コミットする.
$ cd hello
$ vi hello.c
$ svk ci
さて,svk の困ったところは,現在のローカルリポジトリの状態が,リモートリポジトリに対してどのような状態であるかを表示するのが難しいところである.
ワーキングコピーからリモートリポジトリ(実際にはその化身であるローカルミラー)までにローカルブランチという中継点があるため,ワーキン グコピーの情報を表示する svk status などでは役に立たない.ローカルブランチの特定のパスに対して svk status 相当の動作をするコマンドがほしいところである.
まあまずは sync が必要である.
$ svk sync //mirror/hello
smerge で -C オプションを使ってみよう.まずはローカル→リモート方向.
$ svk sm -Cf .
Auto-merging /local/hello to /mirror/hello
Checking locally against mirror source http://example.com/svn/hello
hello.c - skipped
Empty merge.
これでは状況はよくわからない.では次はリモート→ローカル.
$ svk sm -Ct .
Auto-merging /mirror/hello to /local/hello
A + ./hello_world.c
C ./hello.c
New merge ticket:
xxxxxxxxxxxxxxxxxxxxxxxxxxx:/hello:NNN
1 conflict found.
わからないでもないが...ここで pull してみよう.
$ svk pull
Syncing http://example.com/hello
Auto-merging /mirror/hello to /local/hello
A + hello_world.c
Conflict found in hello.c:
e)dit, d)iff, m)erge, s)kip, t)heirs, y)ours, h)elp? [e] s
C hello.c
New merge ticket: ...
Empty merge.
1 conflict found.
となりうまくいかない.では push はというと,
$ svk push
===> Auto-merging /local/hello to /mirror/hello
Empty merge.
===> Auto-merging /local/hello to /mirror/hello
hello.c - skipped
Empty merge.
となってやはりうまくいかない.
svk help をあさっていて発見した方法を以下に示す.
$ svk sm --track-rename -f .
...
Collecting renames, this might take a while.
U hello.c - hello_world.c
...
$ svk up -m
(注意) svk up -m のところで svk sm -t . としたら,checksum mismatch occurred なるエラーが出てにっちもさっちも行かなくなった.バグか?