【GitHub】2GB以上のリポジトリ移行

こういうブログの掴みって大事だと思うんですよね。
僕は掴みません。

※動作を保証するものではありません。

背景

Gitのことも勉強できるし良いタスク来たなと思ったのもつかの間。
つまりに詰まったので知識共有/備忘録のため作成しています。

今回の条件は以下です。

  • コミット履歴は残す。
  • 他のGitからGithubに移行する。
  • .gitの大きさが2GB以上ある。

AWS Codecommit から GitHub への移行になります。

結論

分けてpushを行う。

まずは5000件のcommitのpush

$ git rev-list --reverse HEAD | perl -ne 'print unless $i++ % 5000;' | xargs -I{} git push origin {}:refs/heads/master

その後、再度push

$ git push --set-upstream origin master

今回の移行では2GBのリポジトリ移行でした。

まずはClone

$ git clone 移行元のリポジトリ

大きさを確認する。

$ du -sh .git

上記を行うとやはり2GB以上あることがわかると思います。

今回はファイル削除を行わずに複数回に分けてpushします。

$ git rev-list --reverse HEAD | perl -ne 'print unless $i++ % 5000;' | xargs -I{} git push origin {}:refs/heads/master
  • HEADに指定しているブランチのgitのコミット履歴を古い順に並べる。
  • コミット履歴から1コミット目、5001コミット目…という感じで絞り込む
    • ‘print unless $i++ % 5000’ ではunlessの判定として、$i++ % 5000 の結果が0となったら表示するようにしている。
    • 1コミット目は配列では0個目なので表現上1ずつずれている。
  • 1コミット目、5001コミット目…をxargsを使って指定してコマンドを実行する。

その後、再度push

$ git push --set-upstream origin master

例えば、7500コミットがあるリポジトリの場合、5001コミット目から7500コミット目までがpushされていない状態となるため、このように再度pushする必要がある。

まとめ

そのほかに不要ファイルの削除する方法がありますが、不要ファイルの削除方法は別の記事で作成します。

また、1ファイル100MB以上あるとpushできない制約もあるので、このpush方法でうまくいかない場合は他に原因がある可能性はあります。

以下参考サイト

https://stackoverflow.com/questions/65281493/push-fails-to-github-rpc-failed-and-remote-end-hung-up-unexpectedly