Subversionで開発中のUnityプロジェクトをGitHub管理に移行するにあたり、git-svnを使っての移行でハマったので、今後のためにも書き残しておこうと思います。
#参考にさせていただいたサイト
git-svnとgit-lfsについての情報がなかなか見当たらなかったので、下記のページにはとても助けられました。多謝。
###Qiita内
- SVN から Git(GitHub) へ移行した話と手順まとめ
- Git LFSの導入方法
- itHubに多数のファイル群をpushする際、RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32 が発生しエラー終了
- 【Git LFS】OpenCV for Unityをpushしようとして怒られた人が見るページ
###Qiita外
- Gitでpull or pushしようとしたらfatal: The remote end hung up unexpectedlyってエラーが出た話【エラーで学ぶ英語】
- GitHub リポジトリに大量のファイルを一括登録する方法
#発生した問題
以下ハマりポイント。
- いくつかのファイルが100MBオーバー → LFS使おう!
- バイナリファイルが比較的多め → LFS使おう!
- 全体としては2.5GBほどのプロジェクト
- 手順通りに「git svn clone」でコミットしようとすると、転送量が大きすぎるために接続エラー(error: RPC failed)が発生。
#解決までの手順
今回の作業環境はMacですが、理屈としてはWindowsでも通用するかと。
###1. とりあえずリポジトリ作る
GIT側のリポジトリは空っぽのものを作ります。そうしないと競合起こすので。
mkdir HOGEHOGE
cd HOGEHOGE
git svn init --prefix=svn/ SVN_REPO_URL
git svn fetch
#"git clone --prefix=svn SVN_REPO_URL" でもOKです。
#fetchした後にローカルリポジトリを操作すると、その後のデータが展開されないという挙動だったので、エラーが出ない状態ならcloneでも良いかと。
git remote add origin GIT_REPO_URL
git lfs install --force
git lfs track *.jpg *.tga *.fbx *.assetbundle *.psd *.hdr *.ttf *.mdb *.mp3 *.ogg *.png *.pdf *.zip *.bundle *.otf *.wav *.bmp *.pdb *.a *.acb *.awb *.dll *.exr
trackはLFSに置きたいものを適当に設定。
###2.LFSに置きたいファイルについて、管理履歴から除外
trackを行った際に .gitattributes が生成されているので、LFS管理にするファイルリストを生成します。面倒なのでファイルにまとめて自動作業化。
→ migrate コマンドあんじゃん!!!!
###3.コミットログごとにリモートリポジトリにコミット
この部分の情報がなかなか見つかりませんでした。
ローカルリポジトリに記録されたコミットIDを指定して順番にコミットしていくことで、転送量エラーが置きないようにします。
(ただしSVN時代に大きいコミットをしていた場合はどうしようもないので諦めるしか無い?)
for i in $(git log | grep ^commit | cut -b 8- | tail -r); do
git push -u origin ${i}:refs/heads/master ;
done
#実は
ここまで書いておきながら、Gitの管理履歴から除外するところまでしか処理が終わっていないので、無事に移行されたのかは、まだわかりません!