会社の開発メンバーやリポジトリ数、コミット数が増えてきたおかげもあって、インストールして使っていたGitlabが重くなりやすくなってきて効率を落としていたので、今年に入ってGitHubへ移行を実施しました。その時に実施した作業を簡単にまとめます。(既出かもしれませんが...)
mirrorオプションでブランチも含めて一括で移行
よく紹介されている方法としては以下のようなものです。
git clone ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo
git remote set-url origin ssh://git@github.com/hoge/repo.git
git push origin --all
この方法でも大体の移行はできますが、ローカルに落としていないbranchやtagなどを移行することはできなかったので、以下の手段に切り替えました。
git clone --mirror ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo.git
git remote add --mirror=push github ssh://git@github.com/hoge/repo.git
git push github
こうすることで、ローカルにブランチを落とすことなく移動することができます。
データ容量エラーへの対応
ここからは特定のプラットフォームへの移行に限定される話かもしれませんが、GitHubに対して移行をする場合、100MB以上のファイルのコミット歴があるリポジトリ/ブランチをpushしようとすると以下のようなエラーとなります。
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
エラーメッセージにちゃっかり宣伝入ってますw
現存するものには、この大きさのファイルがなかったので、Manually reviewing large files in your repository にある git_find_big.sh を使って、大きいファイルを調査します。(1. の「Download the script」リンクから落とすことができます)
git_find_big.sh を調べる対象のリポジトリ直下に置いたら、実行します。(本当はSHAなどもう少し長いです)
$ sh git_find_big.sh
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
-e size pack SHA location
769396 86216
1018364 15570 abcdefgh dump.sql
996 344
780 158 bcdefghi hoge/fuga.php
........
実際、100MB以上のファイルのコミット履歴が残っている場合、大抵そのファイルは使ってなくて、誤ってcommitされていることが多いかと思います。(私の場合も、上記の例のようにマスキングDBのdumpファイルがコミットされたために、pushが通りませんでした)
その場合は、履歴をなかったことにして対応することができます。(歴史を書き換える危険な作業なので、バックアップを取ってから実行されることをお勧めします)
git clone ssh://git@gitlab.xxx.com/hoge/repo.git
cd repo
git filter-branch --index-filter "git rm -r --cached --ignore-unmatch dump.sql" -- --all
git push origin --all --force
例として、dump.sqlのコミット履歴を抹消しています。この操作を、大容量ファイル全てに対して実行したら、pushすることができます。