[Subversion]svndumpfilterで、肥大化したレポジトリをダイエットさせる方法

Subversionのダンプ&リストアのおさらい

下記のようにダンプ&リストアすると、レポジトリを複製することができます。
svnadmin dump /path/to/myrepo > myrepo.dump
svnadmin create /path/to/myrepo_new
svnadmin load /path/to/myrepo_new < myrepo.dump
複製された新レポジトリは、旧レポジトリとまったく同じ内容です。(あたり前ですね)
ここで、loadする前にsvndumpfilterをかましてやると、ダイエットすることができます。

何を捨てるかを決める

レポジトリ内をよく吟味して、何を捨てるかを決めます。
例として、下記パス以下のデータを全て捨てたいとします。
/trunk/large/files/
/document/古い資料/

svndumpfilter はパイプとして機能する

svndumpfilterは、Linuxのgrepコマンドに似た働きをします。
一番わかりやすい使い方は、ダンプファイルにフィルタをかまして新ダンプファイルをつくることです。
svndumpfilter exclude /trunk/large/files/ /document/古い資料/  < myrepo.dump > myrepo_new.dump
(svn cpなどの影響で履歴に親子関係がある場合、エラーで失敗することがあります。この場合は依存先も芋づる的にexcludeしてあげましょう)

ダイエットされたダンプファイルができますので、これをリストアします。
svnadmin load /path/to/myrepo_new < myrepo_new.dump

確認&入れ替え

新レポジトリにsvnクライアントで接続して、svn logでログなどを見て、問題ないか確認します。
問題なければ、新旧のレポジトリをリネームしましょう。
mv /path/to/myrepo /path/to/myrepo_old
mv /path/to/myrepo_new /path/to/myrepo
フックスクリプト(post-commit等)などがあればコピーするのを忘れずに。
cp /path/to/myrepo_old/hooks/* /path/to/myrepo/hooks/

追記

除外したいファイルが大量にある場合は、ダンプで一時ファイルをつかわない方がよいです。
その場合は下記記事をご覧ください。

[Subversion]巨大なリポジトリから多数の不要ファイルを恒久的に削除する方法

参考

[Subversion]レポジトリ内で容量をくってるリビジョンを突き止める方法
カテゴリ: