SubversionリポジトリをGitへ移管する
はじめに
一昨年末の下書きを見つけ、せっかくなので公開。当時はこれでうまくいきました。
Subversionリポジトリからソースを回収
流れ
- SubversionユーザとGitユーザをマップするファイルを作成
- git svn init
- .git/configにSubversionリポジトリをどのような形式で回収するかを定義する
- git svn fetch
Subversionリポジトリの構成が結構複雑で、branchesの場所を色々定義したいがためにこのような手順になってます。単純な構成(trunkだけとか)であれば直でcloneでもいいと思います。
SubversionユーザとGitユーザをマップするファイルを作成
どこでもいいけど自分はホームディレクトリに作りました。マップしたいユーザが複数いる場合は改行して追加して下さい。
$ vi ~/.svnauthors $ cat ~/.svnauthors svn_user_name = git_user_name <git_user_email>
git svn init
ソース回収するディレクトリでinit。branchesは複数指定可能、今回は無いけどtagsもbranchesとして指定するのだと思われる。
$ git svn init \ > --trunk=trunk/ \ > --branches=branches/branchA/* \ > --branches=branches/branchB/* \ > --prefix=svn/ \ > svn_repo_url
これでカレントディレクトリに.gitが作られるので、それを修正していきます。
.git/configにSubversionリポジトリをどのような形式で回収するかを定義する
$ git config --add svn.authorsfile /Users/murakaming/.svnauthors $ cat ~/.git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true [svn-remote "svn"] url = svn_repo_url fetch = trunk:refs/remotes/svn/trunk branches = branches/branchA/*:refs/remotes/svn/branches/branchA/* branches = branches/branchB/*:refs/remotes/svn/branches/branchB/* [svn] authorsfile = /Users/murakaming/.svnauthors
authorsfileの定義の追加と、branchesをrefs/remotes/svn/直下に置かないようにしています。branches定義の修正はコマンドを使わずエディタで修正しました。
git svn fetch
git svn initしたディレクトリでfetch
$ git svn fetch
なお、途中でfetchが失敗しても再度同じコマンドをうつ事によって失敗したところから再開できます。私の場合はauthorsfileに不備がありましたがauthorsfile修正後に再開できました。