エラーメッセージ
GnuTLS recv error (-110): The TLS connection was non-properly terminated.
別の表記
- error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
clone、fetch、push の実行中は、git がこれを「error: RPC failed; curl 56 GnuTLS recv error (-110): …」の一部として表示します。ls-remote や最初のリクエストでは、「fatal: unable to access '<url>': 」の後に表示されます。OpenSSL でビルドされた git は、同じ事象を「OpenSSL SSL_read: … unexpected eof while reading」と報告します。
git over HTTPS with libcurl-gnutls (Debian, Ubuntu) — GNUTLS_E_PREMATURE_TERMINATION
このエラーの意味
git が HTTPS でデータを受信している最中に、正常な終了を示す TLS の close_notify メッセージがないまま TCP 接続が閉じられました。GnuTLS(エラー -110、GNUTLS_E_PREMATURE_TERMINATION)はこれを読み取りの失敗として扱うため、clone、fetch、push が中断されます。証明書には問題がなく、転送の途中で何かが接続を切断しました。
発生する理由
プロキシ、ファイアウォール、NAT ゲートウェイが接続を切断している
よくある接続時間やアイドル時間に制限を設けた企業のプロキシやファイアウォール、VPN クライアント、一部の家庭用ルーターは、長時間続く HTTPS 転送を TLS のシャットダウンなしに切断します。
Git サーバーまたはそのリバースプロキシがタイムアウトしている
よくある大きなリポジトリは、サーバー側でのパックに時間がかかります。GitLab、Gitea、Bitbucket の前段にある nginx、HAProxy、ロードバランサーのタイムアウトが短いと、git がまだ待っている間に接続が閉じられます。
非常に大規模な clone や push
ときどき大きなバイナリの履歴を持つリポジトリでは、転送が、経路上のあらゆる時間制限やサイズ制限が問題になる規模に達します。http.postBuffer を増やす方法がよく勧められますが、これは git がリクエストボディを送る方法を変えるだけで、接続の切断を防ぐものではありません。
不安定なネットワーク回線
ときどきWi-Fi のローミング、モバイルのテザリング、混雑した VPN 回線は、転送の途中で接続をリセットすることがあります。その場合、同じコマンドが再試行や有線接続では成功します。
修正方法
- 1.
転送をトレースする
GIT_TRACE_CURL を使うと、HTTP のやり取りがタイムスタンプ付きで表示されます。切りのよい秒数の後に失敗する場合はタイムアウトが、ランダムなタイミングで失敗する場合はネットワークが疑われます。
bash # Where does the transfer stop? Time stamps show cut-offs at fixed timeouts. GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 git clone https://git.example.com/team/app.git 2>&1 | tail -40 - 2.
1 回のリクエストで転送する量を減らす
パーシャルクローン(--filter=blob:none)や、シャロークローンの後に git fetch --unshallow を実行する方法を使うと、処理がより小さなリクエストに分割され、制限に達しにくくなります。
bash # Transfer less per request: shallow or partial clone, then fetch the rest git clone --filter=blob:none https://git.example.com/team/app.git git clone --depth 1 https://git.example.com/team/app.git && cd app && git fetch --unshallow - 3.
サーバー運営者:プロキシのタイムアウトとボディサイズの上限を引き上げる
Git サーバーの前段にあるリバースプロキシには、最も大きなリポジトリでも収まるタイムアウトを設定し、Git のエンドポイントではリクエストボディのサイズを制限しないでください。
text # Reverse proxy in front of the Git server (nginx), for long clones and pushes proxy_read_timeout 600s; proxy_send_timeout 600s; client_max_body_size 0; - 4.
HTTPS の代わりに SSH を使う
HTTPS の経路が転送を切断するプロキシを経由しており、SSH が許可されている場合は、SSH のリモートを使うとそのホップを回避できます。
bash # Bypass the HTTPS path (and the proxy that cuts it) entirely git remote set-url origin git@git.example.com:team/app.git
関連するエラー
curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while…curl (OpenSSL 3 backend)error:0A000126:SSL routines::unexpected eof while readingOpenSSL 3fatal: unable to access 'https://git.example.com/team/app.git/': server verific…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)