【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コマンドで確認できる。

svnlock tree D:\SVN\repos2
svnlook tree D:\SVN\repos2

svnadmin.exe、svnlock.exe svnlook.exe、svndumpfilter.exeは全て、Subversionインストールディレクトリ\bin\配下に存在する。
環境変数PATHにディレクトリは通っているのに、なぜかsvnlockだけコマンド認識してくれなかったから、絶対パス指定で実行した。
ファイル名が間違っていて、svnlook.exeでした。
2012/08/07 追記
svnadmin loadでロードする際、上位ディレクトリが存在しないと、リポジトリのロードは行えないので、
ロード後に、ディレクトリ構成を変更することは出来ないっぽい。
(例えばtrunk/aaa/bbb/をロードして、trunk/配下にbbb/内を配置したいとか)
出力したダンプファイルをエディタで編集して、ディレクトリを作っているところと、
ファイルを追加しようとしている位置を全部書き換えてしまえばいいみたいだけど、
果たしてそれで問題なくロードできてるかと言われると。。。

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

  1. 無し

    >環境変数PATHにディレクトリは通っているのに、なぜかsvnlockだけコマンド認識してくれなかったから、絶対パス指定で実行した。

    該当のコマンドがsvnlookだからではないかと思われます

    Reply
    1. めとろいと Post author

      ありがとうございます。
      完全に名称の勘違いでしたねw

      Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です