1. srtk86

    Posted

    srtk86
Changes in title
+GitlabからGitHubにリポジトリを移行する時にやったこと
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,66 @@
+
+会社の開発メンバーやリポジトリ数、コミット数が増えてきたおかげもあって、インストールして使っていた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](https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html) にある 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することができます。