Subversion1.4への移行

Subversion Stamps!


先週、会社でうちの開発チームが使っている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から見えるタイムライン(コミット状況)だとかリポジトリブラウザは、リポジトリのミラーを参照してます。


もう少しエレガントに対応したいものです・・・。