Git プッシュ時の HTTP 400 エラーの解決方法
Git で大規模なリポジトリをプッシュする際に「RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 Bad Request」というエラーが発生することがあります。このエラーは、大きなファイルや多数のファイルを含むコミットをプッシュする際に特に頻発します。
問題の原因
このエラーは以下のような状況で発生します:
- 大きなバイナリファイル(画像、動画、Jupyter Notebookのグラフ出力など)を含むコミット
- 大量のファイルを含む単一コミット(例:node_modulesフォルダの誤コミット)
- HTTPバッファサイズの制限
- ネットワーク接続の問題(VPN使用時など)
- Gitサーバーの制限
解決方法
以下に効果的な解決策を優先度順に紹介します。
1. HTTP バッファサイズの増加
最も一般的な解決策は、HTTPポストバッファのサイズを増やすことです:
git config http.postBuffer 524288000
このコマンドはバッファサイズを約500MBに設定します。グローバルに設定する場合は:
git config --global http.postBuffer 157286400
TIP
この設定後、git pull && git push
を実行して変更を反映させます。
2. 大きなコミットの分割
単一のコミットが大きすぎる場合、複数の小さなコミットに分割すると解決することがあります:
# 大きなコミットを特定
git log --oneline --stat
# 最新のコミットをリセット(作業ディレクトリの変更は保持)
git reset --soft HEAD~1
# 変更を複数のコミットに分割してコミット
git add [一部のファイル]
git commit -m "部分的なコミット1"
git add [別のファイル]
git commit -m "部分的なコミット2"
# プッシュ
git push
3. SSHの使用
HTTPではなくSSHプロトコルを使用することで問題が解決することがあります:
# SSH URLにリモートを変更
git remote set-url origin git@github.com:username/repository.git
# または新規リモートとして追加
git remote add ssh-origin git@github.com:username/repository.git
git push ssh-origin master
INFO
SSH接続はHTTPとは異なる経路を使用するため、ネットワーク制限を回避できる場合があります。
4. .gitignoreの見直し
大きなファイルや不要なファイルが誤ってコミットされていないか確認します:
# 大きなファイルを検出
git ls-files | xargs wc -c | sort -rn
# node_modulesなどの不要なフォルダがコミットされていないか確認
git check-ignore -v node_modules/
.gitignore
ファイルに以下のようなエントリを追加することで、大きなファイルやフォルダのコミットを防げます:
# 例: .gitignore
node_modules/
*.log
*.zip
*.tar.gz
*.mp4
*.avi
5. ネットワーク設定の調整
VPNを使用している場合やネットワークに問題がある場合は、MTU(Maximum Transmission Unit)サイズを調整することで解決することがあります:
# MTUサイズを一時的に変更(Debian/Ubuntu)
sudo ip link set eth0 mtu 800
# 永続的に変更する場合はネットワーク設定ファイルを編集
6. ブランチごとのプッシュ
すべてのブランチを一度にプッシュする代わりに、ブランチごとに個別にプッシュします:
# ブランチ一覧を表示
git branch -a
# ブランチごとにプッシュ
git push origin branch-name
7. リポジトリの最適化
リポジトリ自体を最適化することで、プッシュ時のデータ量を減らせます:
# ガベージコレクションの実行
git gc --aggressive
# パックファイルの再生成
git repack -a -d --depth=250 --window=250
予防策
今後の問題を防ぐために以下の対策を実施しましょう:
- 適切な.gitignore設定: プロジェクト開始時に適切な
.gitignore
ファイルを設定する - 大きなファイルの管理: Git LFS(Large File Storage)を使用して大きなバイナリファイルを管理する
- 定期的なメンテナンス: 定期的に
git gc
を実行してリポジトリを最適化する - コミットの分割: 大きな変更は複数の小さなコミットに分割する
まとめ
Gitで大規模なリポジトリをプッシュする際のHTTP 400エラーは、主にデータ転送サイズの制限が原因です。バッファサイズの調整、コミットの分割、SSHの使用など、状況に応じた適切な解決方法を選択することで問題を解決できます。予防策を講じることで、将来同じ問題が発生するリスクを減らすことも重要です。
WARNING
これらの解決策を試す前に、現在のGit設定をバックアップしておくことをお勧めします。また、強制プッシュ(--force)は注意して使用してください。