Out of memory~ で github にプッシュできない問題

GitHub のロゴ。

GitHub にプッシュしようとするとき、ファイルサイズが大きいか、あるいは差分のサイズが大きすぎるため、プッシュできないことがあります。 このとき、概ね「fatal: Out of memory~」なる表示が返ります。

実際に malloc に失敗したファイルサイズが返っていることもあります。具体的には下記の通りです。

ここではこの問題を解決したときの手順についてまとめておきます。

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master fatal: Out of memory, malloc failed (tried to allocate 114259809 bytes)

fatal: The remote end hung up unexpectedly

fatal: The remote end hung up unexpectedly fatal: write error: Bad file descriptor

ゲームや映像などの製作物を管理しているとき、リソースの整理に伴って複数のテクスチャや動画、モデルファイルが移動するとこのような問題が起こりますね。

試すべき3つのこと

そもそもサーバー側で制限がかけられているようなシチュエーションでは解決することができませんが、 次の 3 つの操作を試してみるべきです。

(1) バッファサイズを大きくする

プッシュするときに許容するバッファサイズを大きくします。

$ git config http.postBuffer 524288000

(2) 利用メモリサイズを大きくする

git は転送時に圧縮する工程が含まれますが、その工程で利用するメモリサイズを大きくします。

$ git config --global pack.windowMemory "524m"

(3) スレッド数を減らす

処理は遅くなりますが、圧縮時に利用するスレッド数を減らすことで一度に確保するメモリ領域を抑えられるようです。 詳細は良く分かっていません。増やすのではなく減らす点に注意します。

$ git config --global pack.threads "2"

その他の操作

検索して調べる限り、他に https ではなく SSH を利用するなどの方法を試すべきとされています。 またそもそも LFS を利用しているかどうかも確認しておいたほうが良さそうです。

Reference