delete from hateblo.jp where 1=1;

タイトルに意味はありません。

リモートのsubversionからクローンする場合にエラーが多発する

対象

  • リモートのリポジトリからgitへインポートしたい
  • コミット数が多く、途中でネットワークエラーになって、最後までいけない
  • windowsである

結論

subversionへインポートしてから、gitへインポートする(案外、SVN syncすれば途中から再開するのかもしれない...)

方法

前提
  • git (tortoiseGitなど)がインストールされていること
  • HDDに十分な空きがあること
準備

svnportable をダウンロードする
任意フォルダ(例: C:\APP\)へ解凍する
コマンドプロンプトを開く
任意フォルダ(C:\WORK)へ移動し、パスを設定する

C:\> C:
C:\> cd C:\WORK
C:\WORK> set PATH=%PATH%;C:\APP\svnportable\SVN
SVNの構築

SVNリポジトリを構築する(リポジトリ名: svnrepo)

C:\WORK> svnadmin create svnrepo

作成したSVNリポジトリ(C:\WORK\svnrepo)に対してpre-revprop-changeを設定する
C:\WORK\svnrepo\hooks\pre-revprop-change.bat (似たような名前があるので注意)

exit 0

SVNリポジトリへインポートする

C:\WORK> svnsync init file:///c:/work/svnrepo http://remote-repo.test.com/svn/trunk/
Copied properties for revision 0.

C:\WORK> svnsync sync file:///c:/work/svnrepo >> sync.log
<||

コンソールが戻ってくるまで待つ。(結構時間がかかる)
途中でエラーになるような場合は、もう一度svnsync syncを実行すると、途中から再開されるはず。

SVNリポジトリサーバーを構築する。(黒い画面は閉じないで!)
このとき、firewallの警告が出るので、適度に許可する。

>||
C:\WORK> svnserve -d -r C:\WORK
gitへインポート

TortoiseGitからClone(クローン)を実行する。
このときのURLは、 svn://localhost/svnrepo 。

備考: file:///c:/work/svnrepo と指定すると、古いSVNで構築したリポジトリは読んでくれるみたいだけど、
新しいリポジトリだとエラーになってしまう。そのため、いったんサーバーを構築して、フォーマットについて関係をなくす。

git.exe svn clone "file:///c:/work/svnrepo"  "C:\work\svnrepo-git" -T trunk -b branches -t tags

Initialized empty Git repository in c:/work/svnrepo-git/.git/
Couldn't open a repository: Unable to open an ra_local session to URL:
 Unable to open repository 'file:///c:/work/svnrepo': 
 Expected FS format '2'; found format '4' at C:\app\dev\PortableGit/libexec/git-core\git-svn line 2327
SVNサーバーを終了する

黒い画面を閉じる か、Ctrl+Cで終了する

本題

gitのcloneではなぜかsvn管理ファイル情報が落ちてこない。
セキュリティ的な問題でそんなことをしているのかもしれない。

gitの管理ファイル

repo\.git\svn\.metadata

; This file is used internally by git-svn
; You should not have to edit it
[svn-remote "svn"]
	reposRoot = svn://localhost/svnrepo
	uuid = 00a224f8-c41a-c649-a018-6eaac1382256
	branches-maxRev = 333
	tags-maxRev = 333
インポートしたときのエラー情報

repo\.git\svn\refs\remotes\trunk

r1
r2
  -empty_dir: trunk/test/cache
svnのuuid等を取得する

"Repository UUID"が、.metadataに記載している情報。

C:\WORK>svn info http://remote-repo.test.com/svn/trunk/
Path: trunk
URL: http://remote-repo.test.com/svn/trunk/
Repository Root: http://remote-repo.googlecode.com/svn/
Repository UUID: aaa61f23-730a-238f-b720-e77452aaaaaa
Revision: 333
Node Kind: directory
Last Changed Author: test@test.com
Last Changed Rev: 326
Last Changed Date: 2013-10-26 05:44:09 +0900 (土, 26 10 2013)

参考文献