RPC エラーと http.postBuffer

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

git push の実行中に次のような RPC failed エラーが表示され:

  • error: RPC failed; result=22, HTTP code = 404
  • error: RPC failed; result=22, HTTP code = 411
  • Unable to rewind rpc post data - try increasing http.postBuffer error: RPC failed; result=56, HTTP code = 0

...Stack Overflow または MSDN フォーラムでヘルプを検索すると、http.postBuffer を設定するための古い推奨事項がたくさん表示されます。

これは行わないでください。 少なくとも、わけもわからずに行ってはいけません。 まず、この記事の推奨事項を確認します。

Git をアップグレードする

バージョン 2.8 以前の Git クライアントをまだ実行している場合は、まず Git をアップグレードする必要があります。 新しいバージョンの Git にはバグ修正があり、http.postBuffer を設定する必要はありません。

以前のバージョンの Git でバグが発生した内部ユーザーや外部のお客様からの十分なサポート リクエストがあり、サーバー側のリマインダーを Azure DevOps Services/TFS に追加することにしました。

c:\mydir>git fetch
remote: Microsoft (R) Visual Studio (R) Team Services
remote: We noticed you're using an older version of Git. For a better experience, upgrade to the latest version at https://git-scm.com/downloads
remote: Found 4 objects to send. (6 ms)
Unpacking objects: 100% (4/4), done.

修正プログラムを確認する

TFS サーバーが Windows 2012 R2 以前を実行している場合は、これらの修正プログラムが該当するかどうかを確認します。

プロキシまたはロード バランサーを使用しているかどうかを確認する

バグのある、またはチャンク エンコードをサポートしていないひどいプロキシを使用している場合は、より大きなプッシュのエラーが表示されます。 正しく構成されていないロード バランサーの背後にオンプレミスの TFS を配置した場合も、同じことが発生する可能性があります。 プロキシをバイパスするとき、またはロード バランサーをバイパスするときに同じプッシュが成功した場合 (たとえば、サーバー自体から localhost にプッシュすることで)、代わりにプロキシまたはロード バランサーを修正します。

プロキシまたはロード バランサーが壊れているが、制御できない場合はどうすればよいでしょうか?

これは、http.PostBuffer を設定することが新しいバージョンの Git にとって有用であることを示す、唯一のシナリオです。

http.postBuffer に関する質問

http.postBuffer を設定することは有害ですか?

経験上、有害というよりは不要ですが、いくつかのネガティブな副作用もあります。

  • 既定値よりも大きくすると、プッシュが大きくなり、待機時間が長くなる可能性があります (クライアントは HTTP 要求をより大きなチャンクにバッファーするため)。
  • HTTP サーバーの HTTP チャンク サイズ制限を超えて設定した場合 (TFS サーバーの maxAllowedContentLengthmaxRequestLengthweb.config など)、チャンク サイズの制限を超えるプッシュはすべて失敗し始めます。

既に設定されている場合は、どのように http.postBuffer の設定を解除しますか?

設定されているかどうかをチェックするには、次を実行します。

git config --show-origin --get-all http.postBuffer

両方のグローバル .gitconfig ファイルで設定を解除する必要がある場合があります。

git config --global --unset http.postBuffer

また、リポジトリ レベル .git/config でも同様に設定解除します (グローバル設定をオーバーライドします)。

git config --local --unset http.postBuffer