Skip to content

Git push時のRPC failed HTTP 400エラーの解決方法

問題の詳細

git push origin master コマンドでプライベートGitHubリポジトリにファイルをプッシュしようとすると、以下のエラーが発生しファイルが表示されない問題:

RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet

このエラーは主に以下の状況で発生します:

  • 大きなファイルや多数の変更を一度にプッシュしようとする場合
  • GitのHTTPバッファサイズがデフォルト値のままの場合
  • 古いバージョンのGitを使用している場合
  • リポジトリに大きなバイナリファイルが含まれている場合

効果的な解決策

1. HTTPバッファサイズの拡大

最も効果的で一般的な解決法は、GitのHTTPバッファサイズを増やすことです:

bash
# バッファサイズを150MBに設定(デフォルトは約1MB)
git config --global http.postBuffer 157286400

# より大きな変更の場合は500MBに設定
git config http.postBuffer 524288000

なぜこれが有効か?

デフォルトのバッファサイズでは大規模なデータ転送中にサーバー接続が切断されます。バッファサイズを拡大することで:

  • 大きなデータチャンクをまとめて転送可能に
  • 転送タイムアウトを回避
  • サーバー予期せぬ切断を防止

2. Gitバージョンの更新と確認

古いGitバージョンが原因でエラーが発生する場合があります:

bash
# 現在のGitバージョンを確認
git --version

# Homebrewを使ったmacOSでのアップデート例
brew update
brew upgrade git
brew link --overwrite git

環境変数PATHを確認し、古いGitバージョンが優先されていないか確認してください。

3. 変更を小分けにしてpush

特に大きな変更をプッシュする場合:

bash
# コミットを分割して個別にプッシュ
git push origin <commit-hash>:master

大規模プッシュの注意点

1回のプッシュで以下を避ける:

  • 50ファイルを超える変更
  • 合計100MBを超えるバイナリファイル
  • 大規模なリファクタリングを含むコミット

4. リポジトリの最適化

大きなバイナリファイルを扱う場合:

bash
# 不要なオブジェクトの削除(リポジトリ軽量化)
git gc --auto

# Git LFSの導入(大型ファイル管理)
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes

Git LFSは以下のファイルに特に有効:

  • 50MBを超える画像/動画ファイル
  • データセット(CSV, JSON)
  • コンパイル済みバイナリ

根本原因と予防策

エラーが発生する理由

HTTP 400エラーは主に:

  1. バッファ不足:デフォルトサイズ(1MB)で大規模データ転送が不完全に
  2. ネットワーク制約:不安定な接続やファイアウォール制限
  3. リポジトリ肥大化:時間経過による履歴データの増加

恒久的な予防策

bash
# .gitconfigに永続的設定を追加
[httpl
    postBuffer = 157286400
]
# リポジトリサイズモニタリング
git count-objects -vH
# プッシュ最適化オプション
git push --thin --no-verify

重要な注意点

  • 個人トークンの有効期限:GitHub認証トークンが切れていないか確認
  • 企業ネットワーク制限:プロキシ設定が必要な場合git config --global http.proxy [url]
  • GitHubサービスの障害GitHub Statusで確認

最終手段

上記対策でも解決しない場合:

  1. ローカルリポジトリを再クローン
bash
git clone https://github.com/user/repo.git new_directory
cp -r old_directory/.git new_directory/
cd new_directory
git push origin master
  1. SSHプロトコルへの切替
bash
git remote set-url origin git@github.com:user/repo.git
  1. GitHubサポートへの問い合わせ

これらの解決策を適切に実施することで、RPC failed; HTTP 400エラーはほぼ解決します。定期的なリポジトリメンテナンスで予防すれば、大規模プッシュも安心して行えます。