git svn clone でfile::///なリポジトリからのcloneに失敗したらsvn://を試してみよう

git svnsvn リポジトリを clone しようとしたら↓みたいなエラーになった。日本語資料が見あたらなかったので、やった回避策のメモ。

C:\GitRepos>git svn clone --prefix svn/ file:///C:/SVNRepos/hoge
 hoge.git
Initialized empty Git repository in C:/GitReppos/hoge.git/.git/
Couldn't open a repository: Unable to open an ra_local session to URL: Unable to
 open repository 'file:///C:/SVNRepos/hoge': Expected FS format '2'; foun
d format '4' at C:\Git/libexec/git-core/git-svn line 1773

調べた分には git が抱えている svn のバージョンと svn リポジトリのバージョンとの不整合で直接触れない状態になっている模様。これはディスク上のリポジトリから file:// で引っ張ってくるとき特有の問題らしい。
こちらの手元では次の組み合わせでエラー発生。(より新しい git パッケージだと解消しているかもしれない)

  • git version 1.7.3.1.msysgit.0
  • svn, バージョン 1.6.13 (r1002816)

そこでどうするかというと、svnserve を使って svn:// 経由で svn リポジトリにアクセスするようにしてやる。*1

まず、svnserve *2 を立ち上げます。-X は接続を一度だけ受け付けるオプション。--root には svn リポジトリのルートを指定する。svn リポジトリが C:\SVNRepos\hoge なら C:\SVNRepos を指定。

C:\Subversion\bin>svnserve.exe -X --root C:\SVNRepos

これで svn:// でアクセスする準備ができたので、別のコマンドプロンプト窓を開いて git clone svn://localhost/hoge を実行。

C:\GitRepos>git svn clone --prefix svn/ svn://localhost/hoge hoge.git
Initialized empty Git repository in D:/GitRepos/hoge.git/.git/
(省略)
r1 = f0f3a7a789062cd1da6e2a3d6db82c2fa646c2b0 (refs/remotes/svn/git-svn)
(省略)
r2 = 01a20d75a4d61a5f464920508a8c4a00a6e5430c (refs/remotes/svn/git-svn)
(省略)
r3 = eeae55572bbdc71bef263bc9c7694ca87b149df3 (refs/remotes/svn/git-svn)
Checked out HEAD:
  svn://localhost/hoge r3
creating empty directory: bin/Debug

svnserve.exe の方は終了しちゃってるので閉じてヨシ。
複数のリポジトリを clone するときは svnserve を -X でなく -d で動かしっぱなしにしておけばよさそうです(未検証)。

*1:参考:Expected FS format '2' found format '3 git-svn - Stack Overflow

*2:無い場合はココsvn-win32 を使いましょう。