こういうブログの掴みって大事だと思うんですよね。
僕は掴みません。
※動作を保証するものではありません。
背景
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方法でうまくいかない場合は他に原因がある可能性はあります。