Pular para o conteúdo
ecdsa.com
git over HTTPS with libcurl-gnutls (Debian, Ubuntu)Git

Mensagem de erro

GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Também aparece como

  • error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Durante clone, fetch e push, o git o apresenta como “error: RPC failed; curl 56 GnuTLS recv error (-110): …”; durante ls-remote ou a primeira requisição, ele aparece depois de “fatal: unable to access '<url>': ”. Builds do git com OpenSSL relatam o mesmo evento como “OpenSSL SSL_read: … unexpected eof while reading”.

git over HTTPS with libcurl-gnutls (Debian, Ubuntu) — GNUTLS_E_PREMATURE_TERMINATION

O que significa

Enquanto o git recebia dados por HTTPS, a conexão TCP foi fechada sem a mensagem TLS close_notify, que marca um encerramento correto. O GnuTLS (erro -110, GNUTLS_E_PREMATURE_TERMINATION) trata isso como uma leitura com falha, então o clone, o fetch ou o push é abortado. Os certificados estavam corretos; algo cortou a conexão no meio da transferência.

Por que acontece

Como corrigir

  1. 1.

    Rastrear a transferência

    GIT_TRACE_CURL mostra a troca HTTP com carimbos de data/hora. Uma falha depois de um número redondo de segundos indica um tempo limite; uma falha em momentos aleatórios indica a rede.

    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. 2.

    Transferir menos em cada requisição

    Um clone parcial (--filter=blob:none) ou um clone raso seguido de git fetch --unshallow divide o trabalho em requisições menores, com menos chance de atingir um limite.

    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. 3.

    Donos do servidor: aumentar os tempos limite e os limites de corpo no proxy

    Configure, no proxy reverso que fica na frente do servidor Git, tempos limite que cubram seus maiores repositórios e não limite o tamanho do corpo das requisições nos endpoints do 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. 4.

    Usar SSH em vez de HTTPS

    Se o caminho HTTPS passa por um proxy que corta transferências e o SSH é permitido, um remoto SSH evita esse salto.

    bash
    # Bypass the HTTPS path (and the proxy that cuts it) entirely
    git remote set-url origin git@git.example.com:team/app.git

Erros relacionados

Ver toda a base de erros de assinatura