Posted by & filed under server, unix.


以前,Subversionのサーバーを構築したときには,レポジトリを開発言語ごとに分けて,個々のプロジェクトはそのレポジトリ内のディレクトリで管理しようかと考えて,こんな感じのディレクトリ構成にしていた.

/project1
    /branches
    /tags
    /trunk

/project2
    /branches
    /tags
    ....

....

が,最近になって,別々にレポジトリがあったほうが良いかもとか思うようになった.そっちの方が,URIが冗長にならないし.

レポジトリ内のファイルの移動はmoveコマンドで一発なわけだけど,別レポジトリへの移動となれば,そうはいかない.

作業コピーをそのままコピーするだけでは,ログとかが引き継がれない.

ログを引き継がないとSubversionの意味がないのでいろいろがんばってみた.

Subversionで,ログや属性情報等をまとめて出力するには,svnadmin dump すればよい.

dumpの中身はテキストデータなので,テキストエディタとかで自分で編集しても良いが,今回のようなケースの為に, svndumpfilter というコマンドが用意されているのでそれを使う.

引数として include もしくは exclude をとり,与えられた dump データから,指定されたプレフィックスが含まれる(もしくは含まれない)ノードのみを抽出してくれる.

それによって,空白のリビジョンが生まれてくるが, –drop-empty-revs オプションを与えることで,自動的に削除し, –renumber-revs オプションを与えることで,リビジョン番号を再度振ってくれる.

以上の作業をパイプを使って一気に実行.

# svnadmin dump /path/to/repository | svndumpfilter include hogehoge --drop-empty-revs --renumber-revs > hogehoge.dumpfile
次のプレフィックスをもつノードを残します (空になったリビジョンは落とします):
     '/hogehoge'

* リビジョン 0 をダンプしました。
* リビジョン 1 をダンプしました。
・・・・

ここで, dump されたデータは,さっきの例でいくと,project1 や project2 にあたるフォルダが入ったデータになっている.

レポジトリを別々にするのだから, branches や tags や trunk フォルダはルートにあったほうがいい.

これらも自動的にやってくれるプログラムが用意されてたらいいのだけど,そんなものは残念ながら存在しないので,手作業で編集する.

.

データを開いて該当フォルダの作成部分や,Node-path, Node-copyfrom-path などのパスを書き換えていく.

スクリプトを書くもよし,viとかでさくっと置換してもよし.とにかく全部パスに含まれないように書き換えていく.

書き換え終わったら新しく作ったレポジトリへ load …してみたが,エラー.

パスの問題ではなく,チェックサムの部分で引っかかっているようだ.

.

チェックサムに引っかかったファイルをみてみると,バイナリファイルだった…

まあ,バイナリファイルを普通のテキストエディタで編集して保存すれば,変なことになるわなw

バージョン管理の必要のない画像ファイルを追加しているのが悪いのだけどw

かくなる上はバイナリエディタで……と思ったが面倒くさいので,このまま load → svn move コマンドで移動 → svn delete コマンドで削除することにした.

$ sudo svnadmin create hogehoge
$ sudo svnadmin load hogehoge < hogehoge.dumpfile
<<< オリジナルのリビジョン 1 に基づき、新しいトランザクションを開始しました
     * パスを追加しています : hogehoge ... 完了しました。
     * パスを追加しています : hogehoge/branches ... 完了しました。
     * パスを追加しています : hogehoge/tags ... 完了しました。
     * パスを追加しています : hogehoge/trunk ... 完了しました。
------- リビジョン 1 をコミットしました >>>

<<< オリジナルのリビジョン 2 に基づき、新しいトランザクションを開始しました
     * パスを追加しています  ....
     ....
$ svn -m "move" move file://path/to/repository/hogehoge/trunk file://path/to/repository/trunk
....
$ svn -m "delete" delete file://path/to/repository/hogehoge/ 

納得はいかないけど,とりあえず移動はうまくいったので,これでよしとする.