O terminal remoto desligou inesperadamente enquanto clonava git

278

Meu gitcliente falha repetidamente com o seguinte erro depois de tentar clonar o repositório por algum tempo.

Qual poderia ser o problema aqui?

Nota: Registrei minha chave SSH no provedor de hospedagem GIT

Receiving objects:  13% (1309/10065), 796.00 KiB | 6 KiB/s
fatal: The remote end hung up unexpectedly
Joe
fonte
Você pode verificar se o seu provedor de hospedagem git está online?
Caps
O @Caps está on-line e a rede também está bem. Parece acontecer de forma consistente depois de algum tempo.
31711 Joe
6
Você pode verificar se git config --global http.postBuffer 524288000algum efeito no seu clone? Existe alguma mensagem de erro adicional como um ' error: RPC failed; result=56, HTTP code = 0'
VonC
@VonC - O comando acima foi executado muito bem, não viu nenhuma saída no console.
31711 Joe
3
@ Joe você é capaz de clonar após o git config --global http.postBuffer 524288000?
VonC 27/07

Respostas:

470

Solução rápida:

Com esse tipo de erro, geralmente começo aumentando o postBuffertamanho:

git config --global http.postBuffer 524288000

(alguns comentários abaixo relatam ter que dobrar o valor):

git config --global http.postBuffer 1048576000

Mais Informações:

Na git configpágina do manual , http.postBuffertrata-se de:

Tamanho máximo em bytes do buffer usado pelos transportes HTTP inteligentes ao POSTAR dados para o sistema remoto.
Para solicitações maiores que esse tamanho de buffer, HTTP / 1.1 e Transfer-Encoding: chunkedé usado para evitar a criação local de um grande pacote de arquivos. O padrão é 1 MiB, o que é suficiente para a maioria das solicitações.

Mesmo para o clone, isso pode ter um efeito e, neste caso, o OP Joe informa:

[clone] funciona bem agora


Nota: se algo der errado no lado do servidor e se o servidor usar o Git 2.5+ (Q2 2015), a mensagem de erro poderá ser mais explícita.
Consulte " Clonagem do Git: a extremidade remota desligou inesperadamente, tentou alterar postBuffermas ainda falhou ".


Kulai ( nos comentários ) aponta para esta página Atlitian Troubleshooting Git , que adiciona:

Error code 56indica que uma onda recebe o erro, o CURLE_RECV_ERRORque significa que houve algum problema que impedia que os dados fossem recebidos durante o processo de clonagem.
Normalmente, isso é causado por uma configuração de rede, firewall, cliente VPN ou antivírus que está encerrando a conexão antes que todos os dados tenham sido transferidos.

Ele também menciona a seguinte variável de ambiente, para ajudar no processo de depuração.

# Linux
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1

#Windows
set GIT_TRACE_PACKET=1
set GIT_TRACE=1
set GIT_CURL_VERBOSE=1

Com o Git 2.25.1 (fevereiro de 2020), você sabe mais sobre essa http.postBuffer"solução".

Consulte commit 7a2dc95 , commit 1b13e90 (22 jan 2020) por brian m. Carlson ( bk2204) .
(Mesclado por Junio ​​C Hamano - gitster- no commit 53a8329 , 30 de janeiro de 2020)
( discussão na lista de discussão do Git )

docs: mencione quando o aumento do http.postBuffer é valioso

Assinado por: brian m. Carlson

Usuários em uma ampla variedade de situações se deparam com problemas de envio de HTTP.

Muitas vezes, esses problemas são causados ​​por software antivírus, proxies de filtragem ou outras situações intermediárias; outras vezes, devido à simples falta de confiabilidade da rede.

No entanto, uma solução comum para os problemas de envio HTTP encontrados online é aumentar o http.postBuffer.

Isso funciona para nenhuma das situações mencionadas acima e é útil apenas em um número pequeno e altamente restrito de casos: essencialmente, quando a conexão não suporta HTTP / 1.1 corretamente.

Documente quando elevar esse valor é apropriado e o que ele realmente faz, e desencoraje as pessoas a usá-lo como uma solução geral para problemas de envio, pois não é eficaz lá.

Portanto, a documentação do git config http.postBuffermomento inclui:

http.postBuffer

Tamanho máximo em bytes do buffer usado pelos transportes HTTP inteligentes ao POSTAR dados para o sistema remoto.
Para solicitações maiores que esse tamanho de buffer, HTTP / 1.1 e Transfer-Encoding: chunked são usados ​​para evitar a criação local de um grande pacote de arquivos.
O padrão é 1 MiB, o que é suficiente para a maioria das solicitações.

Observe que aumentar esse limite é eficaz apenas para desativar a codificação de transferência em blocos e, portanto, deve ser usado apenas quando o servidor remoto ou um proxy suportar apenas HTTP / 1.0 ou não for compatível com o padrão HTTP.
Aumentar isso não é, em geral, uma solução eficaz para a maioria dos problemas de push, mas pode aumentar significativamente o consumo de memória, pois todo o buffer é alocado mesmo para pequenos pushs .

VonC
fonte
2
Isso funcionou para mim também, embora eu esteja um pouco confuso sobre quando "transportes HTTP inteligentes" estão envolvidos em uma transferência ssh://.
delicateLatticeworkFever
4
Graças o truque funcionou, mas com o dobro do valor que foi dado na resposta.
Lolitha Ratnayake
10
Talvez a documentação esteja errada, mas o POST não é o que acontece quando você busca / clona por HTTP. Estou confuso sobre o motivo pelo qual a postBufferconfiguração tem algum efeito em um clone ou busca.
void.pointer
Aumentar o postBuffer e usar https me ajuda. Obrigado, VonC
Yauhen
2
@ Astravagrant Ok, atualizei a resposta para tornar esse valor mais visível.
VonC
32

Mesmo erro com o Bitbucket. Corrigido por

git config --global http.postBuffer 500M
git config --global http.maxRequestBuffer 100M
git config --global core.compression 0
wizawu
fonte
este resolveu o meu problema com o erro redefinição de conexão e este erro: Erro fatal: O lado remoto desligou inesperadamente
Imperador Krauser
Isso resolveu meu problema! Omg, eu olhei por toda a internet, obrigado! <3
silvenon 03/02
17

O truque http.postBuffer não funcionou para mim. Contudo:

Para outras pessoas que enfrentam esse problema, pode ser um problema no GnuTLS. Se você definir o modo detalhado, poderá ver o erro subjacente parecer algo ao longo das linhas do código abaixo.

Infelizmente, minha única solução até agora é usar o SSH.

Eu vi uma solução publicada em outro lugar para compilar o Git com o OpenSSL, em vez do GnuTLS. Há um relatório de bug ativo para o problema aqui .

GIT_CURL_VERBOSE=1 git clone https://github.com/django/django.git

Cloning into 'django'...
* Couldn't find host github.com in the .netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.131... * Connected to github.com (192.30.252.131) port 443 (#0)
* found 153 certificates in /etc/ssl/certs/ca-certificates.crt
*    server certificate verification OK
*    common name: github.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: 
*    start date: Mon, 10 Jun 2013 00:00:00 GMT
*    expire date: Wed, 02 Sep 2015 12:00:00 GMT
*    issuer: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance EV CA-1
*    compression: NULL
*    cipher: ARCFOUR-128
*    MAC: SHA1
> GET /django/django.git/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.8.4
Host: github.com
Accept: */*
Accept-Encoding: gzip

Pragma: no-cache
< HTTP/1.1 200 OK
< Server: GitHub.com
< Date: Thu, 10 Oct 2013 03:28:14 GMT

< Content-Type: application/x-git-upload-pack-advertisement
< Transfer-Encoding: chunked
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Vary: Accept-Encoding
< 
* Connection #0 to host github.com left intact
* Couldn't find host github.com in the .netrc file; using defaults
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.131... * connected
* found 153 certificates in /etc/ssl/certs/ca-certificates.crt
* SSL re-using session ID
*    server certificate verification OK
*    common name: github.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: 
*    start date: Mon, 10 Jun 2013 00:00:00 GMT
*    expire date: Wed, 02 Sep 2015 12:00:00 GMT
*    issuer: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance EV CA-1
*    compression: NULL
*    cipher: ARCFOUR-128
*    MAC: SHA1
> POST /django/django.git/git-upload-pack HTTP/1.1
User-Agent: git/1.8.4
Host: github.com
Accept-Encoding: gzip

Content-Type: application/x-git-upload-pack-request
Accept: application/x-git-upload-pack-result
Content-Encoding: gzip
Content-Length: 2299
* upload completely sent off: 2299out of 2299 bytes

< HTTP/1.1 200 OK
< Server: GitHub.com
< Date: Thu, 10 Oct 2013 03:28:15 GMT

< Content-Type: application/x-git-upload-pack-result
< Transfer-Encoding: chunked
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Vary: Accept-Encoding
< 
remote: Counting objects: 232015, done.
remote: Compressing objects: 100% (65437/65437), done.
* GnuTLS recv error (-9): A TLS packet with unexpected length was received.
* Closing connection #0
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
Kurtis
fonte
3
eu recebo o mesmo log detalhado como você. mas resolvido usando um valor maior de postBuffer.
Suiwenfeng 6/16
3
git config --global http.postBuffer 1000000000000000000000000000000000
suiwenfeng
As versões mais recentes do git falham devido a "fatal: valor de configuração numérico inválido '100000000000' para 'http.postbuffer': fora do intervalo", mas definir o valor de configuração não ajuda no meu caso.
Karl Richter
O maior tamanho que posso obter é100000000000000
nhoxbypass 17/03
8

Obs .: A alteração http.postBuffertambém pode exigir a instalação do arquivo de configuração do Nginx para que o gitlab aceite tamanhos de corpo maiores para o cliente, ajustando o valor de client_max_body_size.

No entanto, existe uma solução alternativa se você tiver acesso à máquina Gitlab ou a uma máquina em sua rede, e isso é usando git bundle.

  1. vá para o seu repositório git na máquina de origem
  2. corre git bundle create my-repo.bundle --all
  3. transferir (por exemplo, com rsync) o arquivo my-repo.bundle para a máquina de destino
  4. na máquina de destino, execute git clone my-repo.bundle
  5. git remote set-url origin "path/to/your/repo.git"
  6. git push

Muito bem sucedida!

Ruxandra T.
fonte
7

A única coisa que funcionou para mim foi clonar o repositório usando o link HTTPS em vez do link SSH .

Ayan
fonte
5

Se você estiver usando https e estiver recebendo o erro.

Eu usei https em vez de http e resolveu meu problema

git config --global https.postBuffer 524288000
Aransiola Oluwaseun
fonte
No meu caso, não funcionou com http.postBuffer, então tentei usar https.postBuffer como sugerido. Esta solução funcionou. Obrigado!
Pascut
E se eu estiver usando ssh? Não consigo passar para http / https.
RobisonSantos
5

Com base nesta resposta , tentei o seguinte (com https url):

  1. clonagem inicial de repo:

git clone --depth 25 url-here

  1. busca confirmada com aumento duas vezes por profundidade de tentativa:

git fetch --depth 50

git fetch --depth 100

git fetch --depth 200

...e assim por diante

  1. eventualmente (quando acho que o suficiente é buscado) eu corro git fetch --unshallow- e está feito.

O processo, obviamente, leva muito mais tempo, mas na minha definição de caso http.postBuffere core.compressionnão ajudou.

UPD : Descobri que a busca via ssh funciona para qualquer tamanho de repositório (descoberto acidentalmente), feito com git clone <ssh url>, desde que você tenha criado chaves ssh. Depois que o repositório é buscado, altero o endereço remoto usandogit remote set-url <https url to repo>

Андрей Саяпин
fonte
4

Eu tenho solução depois de usar o comando abaixo:

git repack -a -f -d --window=250 --depth=250

hmjha
fonte
4
Como você executaria isso quando o clone ainda não criou um repositório git local?
lucidbrot 23/09/18
4

Eu tenho o mesmo problema, eu corrigi isso com o método de tentativa e erro. Alterei o valor do core.compression até que funcione.

Comecei com "git config --global core.compression 1" após 3 tentativas

"git config - global core.compression 4" funcionou para mim.

G Gopikrishna
fonte
4

Isto é devido ao problema de conectividade com a Internet, eu enfrentei o mesmo problema. Eu fiz uma cópia superficial do código usando

git clone --depth 1 //FORKLOCATION

Mais tarde desalojou o clone usando

git fetch --unshallow
Srikanth Josyula
fonte
2

em /etc/resolv.confadicionar a linha ao final do arquivo

options single-request
vallabh
fonte
Se o postBuffer não ajudar, esta resposta é o que sugiro tentar a seguir, pois funcionou para mim.
Khanh
2

Bem, eu queria fornecer uma solução de 219 MB, mas não tive sorte com

git config --global http.postBuffer 524288000

E qual é o sentido de ter um buffer posterior de 525 MB? é bobagem. Então, olhei para o erro git abaixo:

Total 993 (delta 230), reused 0 (delta 0)
POST git-receive-pack (5173245 bytes)
error: fatal: RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054

Então git quer postar 5 MB, então eu fiz o buffer pós 6 MB, e funciona

git config --global http.postBuffer 6291456
G.Flemming
fonte
isso faz sentido. Eu olhei para o meu tamanho de repositório, que é de 15 mb. O ssh e o HTTPS se queixaram do mesmo erro, o ssh foi menos útil. Eu clonei projetos maiores sem problemas do github, este estava no bitbucket que simplesmente não gosta de projetos grandes e é lento para baixar. A mesma coisa acontece no gitlab. Definir qualquer coisa não resolverá o problema. o problema aqui é com o controle remoto. Mudando para o github Ajustar meu pós-buffer perto do tamanho de meu repositório de 15 milhões parecia me ajudar, não acredito que ainda seja a solução completa.
Abhishek Dujari
git config --global http.postBuffer 157286400, coloquei isso no buffer e a alteração do meu wifi funcionou.
ram880
2

Eu tive o mesmo problema e estava relacionado a uma conexão ruim à Internet; portanto, depois de tentar algumas configurações do git, acabei de me desconectar da minha rede e conectar novamente e funciona!

Parece que após a conexão perdida (ou a ação que aciona essa situação), o git fica preso.

Espero que possa ser uma ajuda para alguém mais aqui.

melhor,

Dody
fonte
2

Eu também tive o mesmo problema. A razão para esse problema é como as descrições de Kurtis sobre o GNUTLS.

Se você tiver o mesmo motivo e seu sistema for Ubuntu, poderá resolver esse problema instalando a versão mais recente do git a partir de ppa:git-core/ppa. Os comandos são os seguintes.

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get git
NanerLee
fonte
apt-get git??
Glenn
2

Eu estava enfrentando esse problema ao clonar dados (via HTTP) de repositório git remoto hospedado na instância do AWS EC2 gerenciado pelo beanstalk elástico. A clonagem em si também foi realizada na instância do AWS EC2.

Tentei todas as soluções mencionadas e suas combinações:

  • definindo git's http.postBuffer
  • configuraçãohttp.maxrequestbuffer
  • desativando a compactação git e tentando "superficial" git clonee depois git fetch --unshallow- veja fatal: EOF inicial fatal: índice-pacote falhou
  • ajustando as configurações de memória GIT - packedGitLimit e outros, veja aqui: fatal: EOF inicial fatal: índice-pacote falhou
  • ajustando client_max_body_sizea configuração do nginx - definindo o valor grande e 0 (ilimitado); configuraçãoproxy_request_buffering off;
  • configuração options single-requestno /etc/resolv.conf
  • limitando a produtividade do cliente git com gotejamento
  • usando strace para rastreamento git clone
  • considerando a atualização do cliente git

Depois de tudo isso, eu ainda estava enfrentando o mesmo problema repetidamente, até descobrir que esse problema ocorre no Elastic Load Balancer (ELB) cortando a conexão . Depois de acessar a instância do EC2 (a que hospeda o Git Repo) diretamente, em vez de passar pelo ELB, finalmente consegui clonar o Git Repo! Ainda não tenho certeza de quais parâmetros do ELB (timeout) são responsáveis ​​por isso, então ainda preciso fazer alguma pesquisa.

ATUALIZAR

Parece que alterar a política de Drenagem de conexão do AWS Elastic Load Balancer aumentando o tempo limite de 20 segundos para 300 segundos resolveu esse problema.

A relação entre os git cloneerros e o "esgotamento da conexão" é estranha e não é óbvia para nós. Pode ser que a alteração do tempo limite da drenagem da conexão tenha causado algumas alterações internas na configuração do ELB que corrigiram o problema com o fechamento prematuro da conexão.

Esta é a pergunta relacionada no fórum da AWS (sem resposta ainda): https://forums.aws.amazon.com/thread.jspa?threadID=258572

Juraj Martinka
fonte
Boa captura, mais específica do que na minha resposta. +1
VonC 22/06
1

Eu tive um problema semelhante, mas com um trabalho de bambu. O Bamboo falhou ao executar um clone local (local, mas através de um proxy SSH) de um repositório em cache, excluí o cache e depois disso funcionava, mas sempre que ele tenta clonar a partir do cache local, ocorre uma falha. Parece um problema com a versão de bambu do proxy SSH, e não o git por si só.

watsonmw
fonte
1

Eu tenho o mesmo erro ao usar o BitBucket. O que fiz foi remover https do URL do meu repositório e definir o URL usando HTTP.

git remote set-url origin http://[email protected]/mj/pt.git
mjosh
fonte
1

RESOLVIDO COM WIFI Router Setting:

Eu tenho o mesmo problema quando estou no wifi com Configurações PPPoE (login automático pelo roteador wifi).

A velocidade de download do Git é 15kb muito lenta.

packet_write_wait: Conexão com a porta 17.121.133.16 22: fatal de pipe quebrado: a extremidade remota desligou inesperadamente fatal: fatal EOF inicial: fatal o pacote de índices

Solução: 1. Configuração alterada para IP dinâmico, reinicie o roteador wifi. 2. Do login do navegador da web ao portal do provedor de serviços da Internet (não configure o PPPoE, faça o login automático a partir do roteador wifi).

Depois de alterar a velocidade de download do Git, é de 1,7MiB.

GovindaRaju
fonte
1

Isso resolveu meu problema:

git clone --depth=20 https://repo.git -b master
unclehowell
fonte
1

Os truques acima não me ajudaram, pois o repositório era maior que o tamanho máximo permitido no github. O que funcionou foi uma recomendação de https://github.com/git-lfs/git-lfs/issues/3758 que sugeria pressionar um pouco de cada vez:

Se sua ramificação tiver um longo histórico, tente enviar um número menor de confirmações por vez (por exemplo, 2000) com algo como isto:

git rev-list --reverse master | ruby -ne 'i ||= 0; i += 1; puts $_ if i % 2000 == 0' | xargs -I{} git push origin +{}:refs/heads/master

Isso percorrerá a história do mestre, empurrando objetos 2000 de cada vez. (Você pode, é claro, substituir um ramo diferente nos dois lugares, se quiser.) Quando isso for feito, você poderá pressionar o mestre uma última vez, e as coisas deverão estar atualizadas. Se 2000 for demais e você enfrentar o problema novamente, poderá ajustar o número para que fique menor.

Marc Meyer
fonte
Alternativa interessante para a minha resposta de 8 anos. Votado.
VonC
1

Desperdiçou algumas horas tentando algumas dessas soluções, mas acabou atribuindo isso a um IPS corporativo (Instrusion Protection System) que interrompeu a conexão após a transferência de uma certa quantidade de dados.

usuário linux shonky
fonte
1

Para largura de banda compartilhada, tente clonar quando a carga for menor. Caso contrário, tente com uma conexão de alta velocidade. Se ainda não funcionar, use o comando abaixo,

git config --global http.postBuffer 2048M
git config --global http.maxRequestBuffer 1024M
git config --global core.compression 9

git config --global ssh.postBuffer 2048M
git config --global ssh.maxRequestBuffer 1024M

git config --global pack.windowMemory 256m 
git config --global pack.packSizeLimit 256m

E tente clonar novamente. Pode ser necessário alterar essas configurações de acordo com o tamanho da memória disponível.

Sazzad Hissain Khan
fonte
0

Isso funcionou para mim, configurando o servidor de nomes do Google porque nenhum servidor de nomes padrão foi especificado, seguido pelo reinício da rede:

sudo echo "dns-nameservers 8.8.8.8" >> /etc/network/interfaces && sudo ifdown venet0:0 && sudo ifup venet0:0
Luca Steeb
fonte
0

Eu enfrentei esse problema usando o git no Kubuntu. Também notei instabilidade geral nas redes e encontrei uma solução .

em /etc/resolv.conf, adicione a linha no final do arquivo

opções de solicitação única

Isso corrigiu atrasos antes que cada resolução de nomes de domínio e git começassem a funcionar como um encanto depois disso.

truf
fonte
0

Eu encontrei o meu problema com o arquivo .netrc. Se você também o tiver, faça o seguinte:

Abra o arquivo .netrc e edite-o para incluir credenciais do github. Digite nano ~/netrcougedit ~/netrc

Em seguida, inclua o seguinte: * machine github.com

Nome de usuário de login

senha SECRETA

machine api.github.com

Nome de usuário de login

senha SECRETA *

Você pode incluir sua senha bruta lá, mas por motivos de segurança, gere um token de autenticação aqui no github e cole-o no lugar da sua senha.

Espero que isso ajude alguém

Ruto Collins
fonte
0

Pode ser por causa do tamanho das confirmações que estão sendo enviadas. Divida o número de confirmações pelas seguintes etapas:

git log -5

Veja os últimos 5 commits e você saberia quais não são enviados por push para o remoto. Selecione um ID de confirmação e envie todas as confirmações até esse ID:

git push <remote_name> <commit_id>:<branch_name>

NOTA: Acabei de verificar meu commit, que pode ter o maior tamanho; primeiro empurrado até então. O truque funcionou. !!

Vinayak Bagaria
fonte
0

Eu estava fazendo git push no meu Mac OS X El Capitan. Eu estava recebendo o mesmo erro, tentei de tudo para corrigir o que encontrei no google / stackoverflow. No que diz respeito à versão, estou usando a versão mais recente do github, que é a 2.7.4. Criei um projeto no meu sistema local e queria que isso fosse público na minha conta do github. O tamanho do projeto não estava em torno de 8 MB. Percebi que quando eu estava enviando alguns arquivos de tamanho em torno de 1,5 MB, ele estava sendo enviado corretamente, mas com tamanho grande falhou para mim, com o mesmo erro,

A única opção que eu tinha era fazer alterações no pedaço de MB. Agora eu pressionei todas as alterações. Esta é uma solução alternativa para mim até que eu seja corrigido para esta solução.

Portanto, você também pode tentar empurrar a mudança na confirmação múltipla. Ou, se você tiver várias pastas, poderá enviar alterações por cada pasta (se o tamanho da pasta não for grande).

Espero que isso ajude você a trabalhar continuamente no projeto.

Rahul Raghuvanshi
fonte
0

Diante do mesmo problema, tente mesclar-se com outro ramo e faça um puxão deles. Funciona para mim mesmo.

Anupam Maurya
fonte
0

usar em sshvez de http, não é uma boa resposta para esta pergunta, mas pelo menos funciona para mim

vuhung3990
fonte