O hirunewani blog

Q. git pushすると400エラーが発生する

Created at

大きなファイルをpushしようとすると、http.postBufferの制限に引っかかり400エラーが発生する場合がある。

エラーが発生する状況

プッシュを行うと次のようなエラーが発生する状況だった。

$ git push origin
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly

直近のコミットを確認すると、サイズが非常に大きなファイルが含まれていたため、Gitのデフォルトの制限に引っかかったのだろうと推測できる。

解決案 1. http.postBufferを設定する

http.postBufferを変更することで、大きなファイルでもpushできるようになる。

現在の値は次のコマンドで確認できる。何も表示されなければデフォルト値の1Mが適用されている。

git config --get http.postBuffer

これを適当な値に変更すればいい。

git config http.postBuffer 2M

調べていると、--globalオプションを付けて設定しないと上手くいかなかったという報告が見られるが、今回問題が発生した方の環境では問題がなかった。

git config --global http.postBuffer 2M

解決案 2. ファイルを圧縮する

ファイルを圧縮して問題ないのであれば、圧縮するのも一つの手段だと思われる。

あまりにも大きなファイルが多いとgit cloneなどに時間がかかるようになるため、適切なファイルサイズに抑えることは望ましい。

解決案 3. Git LFSを利用する

Git LFSは、実際のファイルではなくファイルへの参照を保存することで大きなファイルを扱うGitの拡張のようなシステム。

GithubでもGit LFSは利用できる。

https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-git-large-file-storage

Git LFSの使い方は公式サイトが詳しい。

https://git-lfs.com/