svnadminで最新commitを消した後、レポジトリ操作が失敗する

Subversionでマージするときに誤ってsparse checkoutした状態でマージしてしまった。
普通のdepth infinity状態でないとファイルの欠損が起きてしまう…らしい。改善されたというような話を聞いたのだが、とにかく今回はうまくいかず、変なコミットを作ってしまった。

そんなわけで、svnadminでdump、create、load -rで最後のコミットを消したレポジトリを作成し、そこからマージをやり直そうとしたのだが、うまくいかない。

checkoutできない

まず新たにcheckoutしようとしても、空のフォルダを2、3作った状態で止まって進まない。
mod_dav_svn経由なのでWAFがブロックしているのかと思って確認してみるも空振り。
repoサーバ上でローカル限定のsvnserveを起動してcheckoutしてみるとうまくいった。
そこでそれをtarで固めて作業PCに持ってきてからrelocateした。Windows機ではsymlinkの表現形式がLinuxと異なるのでrevert -Rする。

mergeできない

改めてmergeしようとしたり、diffを取ろうとするとエラーが起きる。

  • Malformed svndiff data in representation
  • Reading one svndiff window read beyond the end of the representation

などとメッセージが出る。repoが壊れているときに出るらしいのだが、dump/loadしたばかりのrepoなので、当然verifyしてもエラーは出ない。

原因

svnserve経由だとcheckoutできたところにヒントがあったのだが、httpdをリスタートしたところ問題なくcheckout/mergeできるようになった。
mod_dav_svn (使っているのはsvn 1.11系)がrepoの巻き戻りが起こらないことを前提に何らかのキャッシュをしていたのではないかと疑っている。
新たなrepoを作るときに名前を変えていたら、URL違いでこの問題は発現しなかったのかもしれない(あるいは同じrepo UUIDなので同様なのか)。