SVNサーバお引越し
オンプレSVNサーバがEOSLとかで新サーバに引っ越しする必要が発生しました。
で、この際にgitに変えちゃわない?
とも思ったのですが、以下の理由でソースとドキュメントごった煮のSVNリポジトリから
ドキュメント類だけを履歴含めて新SVNに引っ越しすることにしました。
- gitにバイナリファイル上げるのはちょっと。。。勢がいる。
- gitはCloneの単位が基本プロジェクト。ドキュメントはこのフォルダから下取得とかやりがちでsvnはこれができる。
やり方
ざっくり言うと旧リポジトリからダンプ→必要なディレクトリだけフィルタ→新リポジトリにロード
まずはダンプ。こんな感じ
# リポジトリ全量ダンプ
svnadmin dump [リポジトリルート] > xxxx.dump
# リビジョン指定も可能
svnadmin dump -r 0:100 [リポジトリルート] > xxxx.dump
# ファイルサイズを気にして分割する場合とかはこんな感じ
svnadmin dump -r 0:100 [リポジトリルート] > xxxx_0-100.dump
svnadmin dump -r 101:200 --incremental [リポジトリルート] > xxxx_101-200.dump
svnadmin dump -r 201:HEAD --incremental [リポジトリルート] > xxxx_201-HEAD.dump
で、そこにパイプ経由でフィルタをかけられる。
# ディレクトリ指定で狙い撃つinclude これだと[リポジトリルート]/hoge/fuga配下のみdumpに含まれる
svnadmin dump [リポジトリルート] | svndumpfilter include hoge/fuga > xxxx.dump
# ディレクトリを除外するexclude これだと[リポジトリルート]/hoge/fuga以外がdumpに含まれる
svnadmin dump [リポジトリルート] | svndumpfilter exclude hoge/fuga > xxxx.dump
# フィルタをかけた場合、除外されたディレクトリに対するリビジョンが消える。
# デフォルトでは便宜上のリビジョンです。みたいなゴミリビジョンに置き換わってしまうので
# このゴミリビジョンを削除するオプション(--drop-empty-revs)、と再度採番するオプション(--renumber-revs)がある
svnadmin dump [リポジトリルート] | svndumpfilter --drop-empty-revs --renumber-revs exclude hoge/fuga > xxxx.dump
で、できたファイルを新SVNサーバにロードする
svnadmin load [新リポジトリルート] < xxxx.dump
# リビジョン単位で分けて複数分割した場合は積み重ねていく感じ
svnadmin load [新リポジトリルート] < xxxx_0-100.dump
svnadmin load [新リポジトリルート] < xxxx_101-200.dump
svnadmin load [新リポジトリルート] < xxxx_201-HEAD.dump
注意事項
リビジョンで複数に割ってー。とかやった場合、フィルタされたリビジョンとかに依存したコミットがあると
load時に参照先無しで失敗してしまう。
またリビジョン分けつつ--drop-empty-revs --renumber-revsこのへんのオプションを使うと
リビジョン番号がファイル分割した前後で辿れなくなってしまいやっぱり失敗する。
結構ナイーブ。フィルタと分割は必要最低限の組み合わせで使わないと引っ越しに大変苦労するはめになる。
今回のケースだと最終的にどうしたか。
svnadmin dump [旧リポジトリルート] | svndumpfilter --drop-empty-revs --renumber-revs exclude [ドキュメント以外のディレクトリ] [ドキュメント以外のディレクトリ2] [ドキュメント以外のディレクトリ3]・・・ > document.dump
svnadmin load [新リポジトリルート] < document.dump