GitlabからGitHubにリポジトリを移行する時にやったこと

  • 13
    Like
  • 0
    Comment

会社の開発メンバーやリポジトリ数、コミット数が増えてきたおかげもあって、インストールして使っていた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することができます。