先週、会社でうちの開発チームが使っているSubversionリポジトリの移行を実施しました。
元々、Subversionとリポジトリは、部門サーバで運用していたのですが、
今年度から、社内でSubversionのホスティングを始めましたので、そちらのサーバへ移行。
Subversionのバージョンも1.3から1.4に格上げしました。
やる上で、何個か分かった事があるので、それを残しておこうと思います。
リポジトリフォーマットの変更
Subversion1.4では、作業コピーだけではなく、リポジトリのフォーマット自体も変わっています。
が、リポジトリの下位互換は保たれているので、リポジトリ自体の変換が必要になるわけではありません。
# 1.4以前のリポジトリフォーマットでも、1.4のサーバモジュールで稼動可能です。
何が変わったのかというと、メインは、
http://subversion.tigris.org/svn_1.4_releasenotes.html
こちらのリリースノートに書かれている「Binary Delta Encoding Improvements」でしょう。
これはバイナリの差分アルゴリズムが改善され、リポジトリや作業コピーのサイズが最大50%減になるとか。
当然、ディスクの使用量も通信量も減ります。
こりゃ、やるしかないな、と。
で、やってみました。
リポジトリのフォーマットを1.4対応にするには、1.4のモジュールでリポジトリを作り直す必要があります。
具体的には、
- 旧リポジトリからデータのダンプ(旧モジュールでもOK)
- svnadmin dump
- リポジトリの新規作成(1.4モジュール)
- svnadmin create
- 新しく作ったリポジトリへのロード(1.4モジュール)
- svnadmin load
以上で終了。いたって普通。
さて、1.4で作り直したら、どれくらいサイズが減ったのかというと、、、
↓1.4以前のリポジトリフォーマット。
$ du 12 ./locks 44 ./hooks 4 ./dav 16 ./conf 50292 ./db/revs 9504 ./db/revprops 4 ./db/transactions 59820 ./db 59908 .
↓1.4のリポジトリフォーマット
$ du 4 ./db/transactions 9504 ./db/revprops 45396 ./db/revs 54924 ./db 44 ./hooks 12 ./locks 8 ./dav 16 ./conf 55016 .
そんなに圧縮されていないなぁ、、、と思ったら、よく考えたら、うちのリポジトリは、ソースコードだらけでほとんどバイナリなんて無かったわけで。。。
そりゃそうか。
リポジトリのバックアップ
バックアップ方法については、前に「Subversion1.4の新機能、svnsyncを試してみた(d:id:rx7:20070322:p3)」で書いたものを利用していて、リポジトリ単位の設定で、フックスクリプトに処理を記述することで、コミットされたと同時に、別サーバのディスク内にあるリポジトリに同期させるようにしています。
# やり方に問題があるかもしれませんが、検証も兼ねて運用しています。
で、1つわかったことは、svnsyncをする際は、同期元のリポジトリは、1.4対応のフォーマットである必要があるが、同期先のリポジトリは、1.4対応のフォーマットである必要がないということ。
普通は、同期先のリポジトリも1.4対応にすると思うので、たいした問題ではないと思うのですが、
我々の場合は、同期先でTrac + Subversion1.3のモジュールが稼動していて、1.4形式のリポジトリだとTracが動いてくれないのでね。。。
# Tracからは外部リポジトリが参照できないのであります。確か。でも、移行したリポジトリも参照したい。
# まぁ、同期先のSubversionのバージョンを上げれば済む話なのですが。
# 部内で運用中かつTracとの連携があって、検証が必要なのとまとまった時間がとれなくて・・・。(言い訳)
なので、実は開発チームで公開しているTracから見えるタイムライン(コミット状況)だとかリポジトリブラウザは、リポジトリのミラーを参照してます。
もう少しエレガントに対応したいものです・・・。