たきるブログ

C#やOracleなどの情報を書いています。

【SVN】管理を維持したままリポジトリを分割する

リポジトリを1つしか作らなくて、後になってやっぱりわけておけば良かったなぁ~って思うことが多々ある。
昔はそのリポジトリの分割方法が分からなくて、新しいリポジトリに分割したいファイルを新たにコミットしてた。
でもそれだと、今までの履歴が管理されずにリビジョン1からの開始になるから、実はあんまりスマートじゃなくて、どうにか分割できないもんかな~って思ってたら、やっと望むものに辿り着いた。

リポジトリ内の状態が以下の場合を想定する。

/repos    ←リポジトリ
  /project1 ←ディレクトリ
    /dir1  ←ディレクトリ
  /project2 ←ディレクトリ

因みに試したのはWindows環境。
リポジトリの存在位置は「D:\SVN\repos」。
ここから、project1だけを抽出して、repos2リポジトリを作る。
まずは、reposリポジトリから、project1配下のダンプを出力する。

svnadmin dump D:\SVN\repos | svndumpfilter include project1 > D:\SVN\dumpfile.dump

svndumpfilterを利用しないと、reposリポジトリ内を全部ダンプしてしまうので、project1のみをダンプする。
ダンプしたいディレクトリは、半角スペースでいくつも指定できる。

svnadmin dump D:\SVN\repos | svndumpfilter include project1 project2 > D:\SVN\dumpfile.dump

他に、project2を除きたい場合はexcludeを利用する。

svnadmin dump D:\SVN\repos | svndumpfilter exclude project2 > D:\SVN\dumpfile.dump

一部のディレクトリ階層のみをダンプしたい場合はディレクトリ階層を明記する。

svnadmin dump D:\SVN\repos | svndumpfilter include project1/dir > D:\SVN\dumpfile.dump

次に、ダンプした内容を取り込みたいrepos2リポジトリを作成する。

svnadmin create D:\SVN\repos2

これは正直、TortoiseSVNがインストールされているなら、そこからリポジトリを作っていい。
最後に、作成したrepos2リポジトリに、ダンプした内容を取り込む。

svnadmin load D:\SVN\repos2 < D:\SVN\dumpfile.dump

リポジトリの状態は、svnlock svnlookコマンドで確認できる。

svnlook tree D:\SVN\repos2

svnadmin.exe、svnlook.exe、svndumpfilter.exeは全て、Subversionインストールディレクトリ\bin\配下に存在する。

2012/08/07 追記
svnadmin loadでロードする際、上位ディレクトリが存在しないと、リポジトリのロードは行えないので、ロード後に、ディレクトリ構成を変更することは出来ないっぽい。
(例えばtrunk/aaa/bbb/をロードして、trunk/配下にbbb/内を配置したいとか)
出力したダンプファイルをエディタで編集して、ディレクトリを作っているところと、ファイルを追加しようとしている位置を全部書き換えてしまえばいいみたいだけど、
果たしてそれで問題なくロードできてるかと言われると。。。