Subversionのリポジトリが壊れていることにはずいぶん以前——WindowsXPからFreeBSD8.3に移行したときに気づいた。途中のリビジョンが破損しているらしく、あるところから過去へ遡れない。たとえば「svnadmin verify」をかけてみると、次のようになる。
(中略)
* リビジョン 666 を検証しました。
* リビジョン 667 を検証しました。
* リビジョン 668 を検証しました。
svnadmin: E160006: リビジョン 669 はありません
直近からの2000リビジョン分ほどは見れるし、チェックインもできるのでそのまま、使っていたのだが、どうも気になる。ゼロからやりなおすなり、再構築するなり、しないといけないなぁ、とは思っていたのだが、ようやくやる気になった。
「svnadmin recover」をかけてみたが、案の定、リカバリーできなかった。内部データはバイナリで手作業での復旧は無理そうだ。ググってみてもそれらしいサイトにぶつからなかった。
マニュアル片手に方法を考えた。
「svnadmin dump リポジトリ -r 0:668 > dump001」で先頭部分をダンプアウト。
次に「svnadmin dump リポジトリ -r $1 –incremental > deump$1」というシェルスクリプトをつくって669〜3328まで差分ダンプを出力。ここで問題のあるリビジョンは正常にダンプされないので、正常にダンプしたデータだけを順番に「svnadmin load 新規リポジトリ」に喰わせてリポジトリを再構築した。
最終的に「svnadmin verify」で確認したが、問題はないようだった。隅々までだいじょうぶかは不明だが——案の定、あるファイルが古いようだった。このファイルをいじったときにリビジョンが問題だったのだろう。
リポジトリのサイズは868.3MBから430.4MBになっていたので、半分のデータはふっ飛んでしまったということか……。