2012-11-21T23:14:48+09:00

Subversion のレポジトリの一部を git レポジトリに移行する。

追記(2015-08-20) : ここに書いてあることを参考にせず、こちらを見てください。

表題の件、大変苦労したので記録しておく。

単純に、Subversion のレポジトリ全部を git に移行するには、多くのサイトで解説されているように git-svn を使えばいい。例えば、こんな感じ。

git svn clone -s -A authors.txt file:///path/to/svnrepos gitrepos

ちなみに、authors.txt は、Subversion のコミッター名と git の author の対応が書かれている。ちなみに、僕の場合は、こんな感じ。

tkurita = Tetsuro Kurita <xxxx@mac.com>
(no author) = Tetsuro Kurita <xxxx@mac.com>

さて、自分は、一つの Subversion レポジトリで複数のプロジェクトを管理している。一つのレポジトリに複数のプロジェクトを突っ込んじゃうのは、どうかと思ったけど、集中型VCS では、なぜかそうすることが推奨されているようだ。

レポジトリ内の directory のレイアウトは、Subversion のドキュメントで推奨されているように、次のようになっている。

git の様な分散型では、レポジトリをできるだけ細かい単位で持つのが推奨されるようだ。だから、project1 だけを取り出して git レポジトリとしたい。

試しに、次のようにレポジトリの URL にサブパスを付け加えて、git-svn を実行してみる。

git svn clone -s -A authors.txt file:///path/to/svnrepos/project1 project1

これは、project1 なんてパスは無いぜ、という趣旨のエラーが起きる。git-svn では、レポジトリの一部を取り出すことはできないのか?

仕方が無いので、project1 だけを含む Subversion レポジトリを作って、それを git-svn で git レポジトリに移行するという手順を踏んだ。

  1. Subversion レポジトリをファイルにダンプする。

    svnadmin dump /path/to/svnrepos > svnrep.dump

  2. svndumpfilter で project1 以外を削除したダンプファイルを作る。

    svndumpfilter include --drop-empty-revs --renumber-revs project1 > project1.dump < svnrep.dump

  3. Subversion レポジトリを新たに作って、そこに前項で作ったダンプファイルを読み込む。

    svnadmin create project1-repos
    svnadmin load project1-repos < project1.dump

  4. project1 だけを含んだ Subversion レポジトリから git-svn で git レポジトリを作る。

    git svn clone -s -A ./authors.txt -T project1 file:///path/to/project1-repos project1

これでうまくいった。