愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

svnのrepositoryをまるっとgitに移行する、ある程度冴えたやり方

歴史的な経緯もあるし、移行する暇もないからsvn使ってるけど、可能ならsvnからgitに移行したいぜ!って心の中で思ってる人はけっこう多いんではないかと思います。

svnからgitに移行する、その際、やっぱり可能ならsvnの歴史とかsvnのbranch/tagなどを保存したまま移行したい!というのが人情だと思います。

ネットで調べると、git svn cloneでいけるんじゃね?という気がしてきますが、先に結論を言ってしまうと、残念ながらgit svn cloneではsvn -> gitのスムーズな移行はできません。というのは、git svn clone含めたgit svn系のコマンド全般は、そもそも「remoteにあるsvn repositoryをgit経由で利用する」ために用意されていて、svnのrepositoryをgitのそれに移行するためのものではないからです。

で、それならどうすんの?って話ですが、川合史朗さんがblogに書かれている方法でいけます。

http://blog.practical-scheme.net/shiro/20110226-sourceforge-git-migration

要は、git svn系のコマンドをsvn -> gitの移行に使うには、configのsvn-remoteの項目をしかるべき形に書き換えてあげないとダメです。

上記の記事では、いわゆるふつうのgit repositoryに移行することになりますが、bareなrepositoryとして移行したい場合は

mkdir repo
cd repo
git --bare init
vim config (svn-remoteを編集)
git --bare svn fetch

という形になります。


git svn fetchには、色々引数があるのですが、この場合はvimで編集したconfig fileでbranchやtagのマッピングを自分で指定しているのであまり関係ないです。

上記のコマンドでbranchを取り込むと、今までの全歴史上にあるsvnの全branchがgitのbranchとして移行されてしまいます(svn-remoteの設定でうまいこと取り除いたら別ですが)。そのbranchが、現在のsvnの最新revisionではもう削除されていてもです。これはあんまりうれしくない。また、svnの全歴史を取り込んでしまうとgit repositoryがその分大きくなってしまうので、全歴史が必ずしも要らないのであれば

git --bare svn fetch -r {revision_number}:HEAD

のように、必要な分の過去〜現在の歴史だけを移行した方がクリーンだと思います。