2008-09-16

Subversion操作メモその2

さっそくその2
今度は
リポジトリにあるディレクトリを別のディレクトリに履歴ありでコピー(または移動)する
というもの
ちょいとてこずりました

基本手順は svnadmin dump → svndumpfilter → dumpファイル編集 → svnadmin load
こいつらはすべてサーバー側で行わないとダメ。
  1. svnadmin dump でリポジトリのダンプをとる
  2. svndumpfilterで特定のディレクトリのみにしたり、特定のディレクトリのみ除外したりする
  3. 出来たdumpファイルをロードしたいリポジトリの構成にあわせ編集
  4. svnadmin loadでロード
まず1と2(面倒くさいのでパイプで処理)
  svnadmin dump /hoge/svn/rep1 | svndumpfilter include hoge > hoge.svndump
この場合/hoge/svn/rep1にあるsvnリポジトリのダンプを取る
「svndumpfilter include hoge」で、その中のhogeというディレクトリのみ対象とする
「指定以外のディレクトリ」としたい場合はexcludeオプションで
指定するパスが複数ある場合はスペースで区切る
新規リポジトリなどに新たに移行するときなどはsvndumpfilterにさらに以下のオプションを指定
  • --drop-empty-revs
    空リビジョンを出力しない
    これをしないと「単に番号が飛ばないようにするための空のリビジョンです。」的なリビジョンが出来る
  • --renumber-revs
    上記オプションだけだとリビジョン番号が飛んでしまうのでこれを指定

次に3
出来たdumpファイルのままだと、元のリポジトリのパス構成のまま新しいリポジトリにコピーされてしまうので、テキストエディタなり、perlなりで「Node-path」の部分を編集
上記dumpだと
Node-path: hoge/subdir
のように出力されているはずなので、ここを編集
ここで指定したNode-pathは、次でloadする際にparent-dirで指定するディレクトリの下に出来るディレクトリになる
ただし、Node-pathで編集したパスの最下層より一つ上までのディレクトリはあらかじめsvn mkdirで作成しておかないとダメ

次に4
  svnadmin load --parent-dir huga /hoge/svn/rep1 <  hoge.svndump
でロード。
できるはずが、ここで問題発生
対象のリポジトリにもよるのであろうが、たとえばファイルを移動(コピーしたあと削除)しているような操作を行っていたリポジトリの場合などはload中に「ファイルが見つかりません」とかいって落ちる様子。

再度dumpファイルを修正
今回の場合は
  Node-path: file1
  Node-action: add
とかなっているあとに
  Node-path: file2
  Node-action: add
  Node-copyfrom-path: file1
となっていて、その後
  Node-path: file1
  Node-action: delete
となっていたので、
最初のエントリのNode-pathをfile2にしてしまい
ほかの2エントリを削除

他には上記の例でNode-path: file2のときに同時に修正している場合
この場合は2つ目のエントリのNode-acitonをchangeにしNode-copyfrom-revとNode-copyfrom-pathという属性を削除し、deleteしているエントリを削除しました

んで、無事完了

参考にさせていただいたサイト



10/28/2008 追記
4の後のdumpファイルの修正がこんなことしなくてもよかった。
3の時点でNode-pathだけでなくNode-copyfrom-pathも新しいパスに変えてしまえばよいようです。

0 件のコメント: