
Githubエラー「HTTP 400 curl 22」発生時の対処法
Githubへのpushが「HTTP 400エラー」で突然できなくなってしまったときの解決方法

はじめに
開発しはじめたばかりのプロジェクトにおいて、githubにソースをpushすると、突然「HTTP 400」エラーが発生しました。
手元でのコミットは問題ありませんでしたので、プッシュ時に問題があるようです。
使用しているgithubのレポジトリへのプッシュは初回というわけではなく、何度か実績があったので、今回特別な問題があると推測されます。
エラーログは以下のとおりです。

git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree commit -q -F /var/folders/8z/lz1n016n0bqbnslwv7ppvsc00000gn/T/SourceTreeTemp.zE5P6b
git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags --set-upstream origin refs/heads/main:refs/heads/main
Pushing to https://github.com/organization_name/project_name
POST git-receive-pack (chunked)
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
Everything up-to-date
Completed with errors, see above
なお、git管理には「SourceTree」というツールを使用しており、今回のエラーログはそのツールでの出力です。
問題点
このときにコミットした変更点を振り返ると、画像を追加したり変更点が多く変更したファイルサイズも大きいということがいえます。
「Github HTTP 400 curl 22」のキーワードで調べてみると原因がわかりました。
結論からいうと、やはり一度にpushしようとしているファイルサイズが大きすぎることが原因でした。
あとからわかりますが、pushしようとしたファイル数は306ファイルで、ファイルサイズは18MBほどでした。
「この程度でエラーになってしまうの!?」と感じなくもありませんが、1度にプッシュできるファイルサイズはデフォルトで1MBです。かなり小さいですね。
なお、現在の設定がどうなっているかは、以下のコマンドで確認することができます。
git config --get http.postBuffer
これで何も出力されなかったらデフォルト値の1MBということです。
対処方法
実は手元の環境では、SourceTreeを使わずに、コンソールからpushしたら成功してしまいました。
% git push
Enumerating objects: 306, done.
Counting objects: 100% (306/306), done.
Delta compression using up to 8 threads
Compressing objects: 100% (255/255), done.
Writing objects: 100% (303/303), 18.44 MiB | 7.51 MiB/s, done.
Total 303 (delta 31), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (31/31), completed with 1 local object.
To https://github.com/organization_name/project_name
5d6b060..aaa7ec8 main -> main
しかし、なぜ成功したかはわかっていません。
git config --get http.postBuffer
で確認しても出力はなくデフォルト値の1MBのままでした。
今後に向けて本質的な対策はしておきます。
解決方法は、このpostできるサイズの設定をデフォルト値から変更するということです。
例えば150MBに変更するのであれば、以下コマンドのように設定を変更します。
git config http.postBuffer 157286400
以下の書式でも可です。
git config http.postBuffer 150M
変更後、設定を確認してみると、きちんと150Mと出力されるようになっていました。
% git config --get http.postBuffer
150M
これで問題なくGithubにpushすることができるようになりました。
ちなみに、「SourceTree」の設定もきちんと書き変わっていることが確認できます。
SourceTree上の該当のプロジェクトを開いて、「設定」「高度な設定」と開き、ウィンドウ左下の「Config ファイルを編集...」ボタンをクリックすると、configファイルが開きます。
configファイルに「postBuffer = 150M」というように表示されていれば正しく設定されていることが確認できます。

