これは何?
$ git clone [巨大なリポジトリ]
の実行結果が fatal: the remote end hung up unexpectedly
というエラーになってしまい、クローンに失敗する場合の対処法をまとめてみました。
対処法
Step1. postBuffer の拡張
http.postbuffer の設定値が小さすぎることが原因の場合があるので、拡張します。
$ git config --global http.postbuffer 4M
4M〜16M あたりまで試して無理なら、この対処法での解決は諦めて、次のStepに移ります。
Step2. リポジトリの最新断面だけを取得する
Step1だけで解決しない「巨大なリポジトリ」は、経験的には5年以上継続して追加修正の開発が行われているような歴史のある(或いは歴史は長くないがコミットされているファイルのサイズが大きい)リポジトリであることが多いように思われます。
解決方法としては、まず最初に最新の断面だけを取得し、過去のコミットログが必要であれば、徐々に遡りながら何度かに分けて取得するアプローチをとります。
リポジトリの最新断面だけを取得する。
$ git clone --depth 1 [巨大なリポジトリ]
main(旧: master)ブランチ以外のブランチに関する最新断面も取得しておきたい場合は、次のコマンドです。
$ git clone --depth 1 --no-single-branch [巨大なリポジトリ]
最新断面だけ取得すれば、今後の開発が続けられるとか、最新断面だけが欲しいという用途であれば、これで完了です。
過去のコミットログをすべて取得したい場合は、次のStepです。
Step3. データ取得範囲を限定して徐々に過去のコミットログを取得する
最新断面のみをcloneした対象のリポジトリの過去のコミットログを遡及して取得するには、やりかた色々ありますが、ここでは2パターン紹介しておきます。
まずは、clone したディレクトリに移動しておきます。
$ cd [Step2.で clone した巨大なリポジトリ]
残りのコミットログをすべて取得する
残りのコミットログが一気に取得できるサイズであれば、このコマンド一発で済みますが、そもそもリポジトリ全体を git clone
できなかったような巨大リポジトリなので、これを先に実行しても同様のエラーになると思います。
$ git fetch --unshallow
次の手順を一定程度繰り返した上で、残りを一気に...みたいな使い方ができる、という参考までに載せておきます。
コミット数を指定して徐々に取得する
例えば、1000コミット分ならエラーにならずに取得できるサイズだとして「更に1000コミット分の履歴を遡及して取得する」というコマンドが以下のコマンドです。
$ git fetch --deepen 1000
これをループ処理で実行するなどして、小刻みにコミットログを過去に遡及して取得していく、というアプローチです。
while true
do
git fetch --deepen 1000
done
最終的にすべてのログを取得し終えて、これ以上取得するログが無くなった場合は、上記コマンドの結果が
remote: Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
となります。サンプルの無限ループは終了条件をサボっているので、 Ctrl + C
で止めてください。
以上で、めでたしめでたし、です。
参考サイト