Subversionリポジトリ再構成

ゴールデンウィークの休みを利用して、さくらのサーバにソースコード管理用のSubversionリポジトリを移行した。基本は元のリポジトリのデータをdumpして、さくらサーバ上にloadするだけなんだけど、今まで単一リポジトリソースコードやデータファイル(はてなダイアリーのバックアップ、ホームページのデータなど)も突っ込んでいたので、コード用、データ用にリポジトリの分割もすることにした。これがトラブル続きで、めんどくさく、大変時間がかかった。まとめるのもおっくうなので、要点だけをメモ。

  • svnリポジトリから一部のモジュール(ディレクトリ)を切り出して、別のリポジトリに移す場合、1)svnadmin dumpでダンプしたファイルを、2)svndumpfilterを使って必要な部分のみ切り出す
$ svnadmin dump svnrep > svnrep.dump
$ svndumpfilter include --drop-empty-revs --renumber-revs misc/web_data > web.dump < svnrep.dump
$ svnadmin load data < web.dump
    • 1行目でsvnrep.dumpという名前でファイルをダンプ
    • 2行目でそのそのダンプファイルからパス名に'misc/web_data'を含むファイルへの操作のみ抽出し、web.dumpに出力
    • 3行目で切り出したダンプファイルをターゲットリポジトリにload
  • svndumpfilterで書き出したdumpファイルのloadに失敗することがある。具体的には、ファイルやディレクトリをコピーしていたり、移動していたとき。Subversionのダンプファイルには、各ファイルに対して、その内容だけでなく、行われた操作すべてが記録されている。そのため、svndumpfilterするときに、コピー/移動に十分な情報を切り出していないと、リポジトリへのloadに失敗する。具体的にはコピー/移動した場合には、その元/先の両方のファイルの情報をダンプファイルに含める必要がある。
    • 例えば、リポジトリ内のファイル'dir1/file1'が'dir2/file2'からコピーされていた場合、2行目のようにsvndumpfilterを実行しないとloadに失敗する。
$ svndumpfilter include --drop-empty-revs --renumber-revs dir1 > dir1.dump < svnrep.dump    これは失敗
$ svndumpfilter include --drop-empty-revs --renumber-revs dir1 dir2 > dir1.dump < svnrep.dump
    • これを防ぐには、上記のように必要なすべてのファイル情報がダンプファイルに入るようにinclude(あるいは exclude)にパスを指定するか、ファイルのコピー/移動を行った以降のリビジョンを指定してダンプを取る。
  • Subversionのダンプファイルはテキストファイル。どのリビジョンでどのファイルに操作したか、簡単に読める。また、'Node-path: FILE_PATH'という具合に、操作対象のファイル名(リポジトリ内フルパス)が記述されている。このFILE_PATHを書き換えることにより、load時に任意のディレクトリにロードできる。