今度は
リポジトリにあるディレクトリを別のディレクトリに履歴ありでコピー(または移動)する
というもの
ちょいとてこずりました
こいつらはすべてサーバー側で行わないとダメ。
- svnadmin dump でリポジトリのダンプをとる
- svndumpfilterで特定のディレクトリのみにしたり、特定のディレクトリのみ除外したりする
- 出来たdumpファイルをロードしたいリポジトリの構成にあわせ編集
- svnadmin loadでロード
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は、次で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 件のコメント:
コメントを投稿