El extremo remoto colgó inesperadamente mientras clonaba git

278

Mi gitcliente falla repetidamente con el siguiente error después de intentar clonar el repositorio por algún tiempo.

¿Cuál podría ser el problema aquí?

Nota: he registrado mi clave SSH con el proveedor de alojamiento GIT

Receiving objects:  13% (1309/10065), 796.00 KiB | 6 KiB/s
fatal: The remote end hung up unexpectedly
Joe
fuente
¿Puedes verificar si tu proveedor de hosting git está en línea?
Caps
@Caps está en línea y la red también está bien. Parece suceder consistentemente después de algún tiempo.
Joe
66
¿Puedes verificar si a git config --global http.postBuffer 524288000tiene algún efecto en tu clon? Se había ningún mensaje de error adicional como una ' error: RPC failed; result=56, HTTP code = 0'
VonC
@VonC: el comando anterior se ejecutó bien, no vio ningún resultado en la consola.
Joe
3
@ Joe, ¿puedes clonar después del git config --global http.postBuffer 524288000?
VonC

Respuestas:

470

Solución rápida:

Con este tipo de error, generalmente comienzo aumentando el postBuffertamaño:

git config --global http.postBuffer 524288000

(algunos comentarios a continuación informan que tienen que duplicar el valor):

git config --global http.postBuffer 1048576000

Más información:

Desde la git configpágina del manual , http.postBufferse trata de:

Tamaño máximo en bytes del búfer utilizado por los transportes HTTP inteligentes al enviar datos al sistema remoto.
Para solicitudes mayores que este tamaño de búfer, HTTP / 1.1 y Transfer-Encoding: chunkedse utiliza para evitar crear un archivo de paquete masivo localmente. El valor predeterminado es 1 MiB, que es suficiente para la mayoría de las solicitudes.

Incluso para el clon, eso puede tener un efecto, y en este caso, el OP Joe informa:

[clon] funciona bien ahora


Nota: si algo salió mal en el lado del servidor, y si el servidor usa Git 2.5+ (Q2 2015), el mensaje de error podría ser más explícito.
Consulte " Clonación de Git: el extremo remoto colgó inesperadamente, intentó cambiar postBufferpero aún falla ".


Kulai ( en los comentarios ) señala esta página de Git de solución de problemas de Atlassian , que agrega:

Error code 56indica que un curl recibió el error, lo CURLE_RECV_ERRORque significa que hubo algún problema que impidió que se recibieran los datos durante el proceso de clonación.
Por lo general, esto se debe a una configuración de red, firewall, cliente VPN o antivirus que finaliza la conexión antes de que se hayan transferido todos los datos.

También menciona la siguiente variable de entorno, para ayudar con el proceso de depuración.

# 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

Con Git 2.25.1 (febrero de 2020), usted sabe más sobre esta http.postBuffer"solución".

Ver commit 7a2dc95 , commit 1b13e90 (22 de enero de 2020) por brian m. Carlson ( bk2204) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 53a8329 , 30 de enero de 2020)
( Discusión de la lista de correo de Git )

docs: mencionar cuando aumentar http.postBuffer es valioso

Firmado por: brian m. carlson

Los usuarios en una amplia variedad de situaciones se encuentran con problemas de inserción HTTP.

A menudo, estos problemas se deben a software antivirus, servidores proxy de filtrado u otras situaciones de intermediario; otras veces, se deben a la simple falta de fiabilidad de la red.

Sin embargo, una solución común a los problemas de inserción HTTP que se encuentran en línea es aumentar http.postBuffer.

Esto no funciona para ninguna de las situaciones mencionadas anteriormente y solo es útil en un pequeño número de casos altamente restringidos: esencialmente, cuando la conexión no es compatible con HTTP / 1.1.

Documente cuándo aumentar este valor es apropiado y lo que realmente hace, y desaliente a las personas a usarlo como una solución general para los problemas de empuje, ya que no es efectivo allí.

Entonces la documentación por git config http.postBufferahora incluye:

http.postBuffer

Tamaño máximo en bytes del búfer utilizado por los transportes HTTP inteligentes al enviar datos al sistema remoto.
Para solicitudes mayores que este tamaño de búfer, HTTP / 1.1 y Transfer-Encoding: fragmentado se usan para evitar crear un archivo de paquete masivo localmente.
El valor predeterminado es 1 MiB, que es suficiente para la mayoría de las solicitudes.

Tenga en cuenta que aumentar este límite solo es efectivo para deshabilitar la codificación de transferencia fragmentada y, por lo tanto, debe usarse solo cuando el servidor remoto o un proxy solo admite HTTP / 1.0 o no cumple con el estándar HTTP.
En general, aumentar esto no es una solución efectiva para la mayoría de los problemas de inserción, pero puede aumentar el consumo de memoria de manera significativa ya que todo el búfer se asigna incluso para pequeñas pulsaciones .

VonC
fuente
2
Esto también funcionó para mí, aunque estoy un poco confundido sobre cuándo los "transportes HTTP inteligentes" están involucrados en una transferencia ssh://.
delicateLatticeworkFever
44
Gracias, el truco funcionó pero con el doble del valor que se le dio en la respuesta.
Lolitha Ratnayake
10
Tal vez la documentación es incorrecta, pero POST no es lo que sucede cuando recupera / clona a través de HTTP. Estoy confundido sobre por qué la postBufferconfiguración tiene algún efecto en un clon o búsqueda.
void.pointer
Levantar postBuffer y usar https me ayuda. Gracias, VonC
Yauhen
2
@Astravagrant Ok, he actualizado la respuesta para hacer que ese valor sea más visible.
VonC
32

Mismo error con Bitbucket. Arreglado por

git config --global http.postBuffer 500M
git config --global http.maxRequestBuffer 100M
git config --global core.compression 0
wizawu
fuente
este resolvió mi problema con el error de restablecimiento de la conexión y este error: fatal: el extremo remoto colgó inesperadamente
Emperador Krauser
¡Esto resolvió mi problema! Omg, busqué en internet, ¡gracias! <3
silvenon
17

El truco http.postBuffer no funcionó para mí. Sin embargo:

Para otras personas que experimentan este problema, puede ser un problema con GnuTLS. Si configura el modo detallado, puede ver que el error subyacente se ve algo similar a las líneas del código a continuación.

Desafortunadamente, mi única solución hasta ahora es usar SSH.

He visto una solución publicada en otro lugar para compilar Git con OpenSSL en lugar de GnuTLS. Hay un informe de error activo para el problema aquí .

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
fuente
3
Me sale el mismo registro detallado como tú. pero resuelto mediante el uso de mayor valor postBuffer.
suiwenfeng
3
git config --global http.postBuffer 10000000000000000000000000000000
suiwenfeng
Las versiones más nuevas de git fallan debido a "fatal: valor de configuración numérico incorrecto '100000000000' para 'http.postbuffer': fuera de rango", pero en mi caso no ayuda configurar el valor de configuración.
Karl Richter
El tamaño más grande que puedo lograr es100000000000000
nhoxbypass
8

Obs .: Cambiar http.postBuffertambién puede requerir configurar el archivo de configuración de Nginx para que gitlab acepte tamaños de cuerpo más grandes para el cliente, ajustando el valor de client_max_body_size.

Sin embargo, existe una solución alternativa si tiene acceso a la máquina Gitlab o a una máquina en su red, y eso es haciendo uso de git bundle.

  1. vaya a su repositorio git en la máquina fuente
  2. correr git bundle create my-repo.bundle --all
  3. transfiera (por ejemplo, con rsync) el archivo my-repo.bundle a la máquina de destino
  4. en la máquina de destino, ejecute git clone my-repo.bundle
  5. git remote set-url origin "path/to/your/repo.git"
  6. git push

¡Todo lo mejor!

Ruxandra T.
fuente
7

Lo único que funcionó para mí fue clonar el repositorio usando el enlace HTTPS en lugar del enlace SSH .

Ayan
fuente
5

Si está utilizando https y obtiene el error.

Usé https en lugar de http y resolvió mi problema

git config --global https.postBuffer 524288000
Aransiola Oluwaseun
fuente
En mi caso no funcionó con http.postBuffer, así que intenté usar https.postBuffer como usted sugirió. Esta solución funcionó. ¡Gracias!
Pascut
¿Qué pasa si estoy usando ssh? No puedo moverme a http / https.
RobisonSantos
5

Basado en esta respuesta , intenté lo siguiente (con https url):

  1. clonación inicial del repositorio:

git clone --depth 25 url-here

  1. buscar confirmaciones con un aumento de dos veces por profundidad de prueba:

git fetch --depth 50

git fetch --depth 100

git fetch --depth 200

...y así

  1. eventualmente (cuando creo que es suficiente) corro git fetch --unshallow, y está hecho.

El proceso obviamente se tarda mucho más tiempo, pero en mi entorno caso http.postBuffery core.compressionno ayudó.

UPD : descubrí que la recuperación a través de ssh funciona para cualquier tamaño de repositorio (descubierto accidentalmente), hecho git clone <ssh url>, dado que ha creado claves ssh. Una vez que se obtiene el repositorio, cambio la dirección remota usandogit remote set-url <https url to repo>

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

Obtuve la solución después de usar el siguiente comando:

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

hmjha
fuente
44
¿Cómo ejecutarías eso cuando clone aún no ha creado un repositorio local de git?
lucidbrot
4

Tengo el mismo problema, lo solucioné con el método de prueba y error. Cambié el valor de core.compression hasta que funcione.

Comencé con "git config --global core.compression 1" después de 3 intentos

"git config --global core.compression 4" funcionó para mí.

G Gopikrishna
fuente
4

Esto se debe al problema de conectividad a Internet, me enfrenté al mismo problema. Hice una copia superficial de código usando

git clone --depth 1 //FORKLOCATION

Más tarde no se autorizó el clon usando

git fetch --unshallow
Srikanth Josyula
fuente
2

en /etc/resolv.confagregar la línea al final del archivo

options single-request
vallabh
fuente
Si el postBuffer no ayuda, esta respuesta es lo que sugiero probar a continuación, ya que funcionó para mí.
Khanh
2

Bueno, quería impulsar una solución de 219 MB, pero no tuve suerte con

git config --global http.postBuffer 524288000

¿Y cuál es el punto de tener un buffer de publicación de 525 MB de todos modos? Es una tontería. Así que miré el error de git a continuación:

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

Entonces git quiere publicar 5 MB, luego hice el búfer de publicación de 6 MB, y funciona

git config --global http.postBuffer 6291456
G.Flemming
fuente
Esto tiene sentido. Miré el tamaño de mi repositorio, que es de 15 mb. Tanto ssh como HTTPS se quejaron con el mismo error, ssh fue menos útil. He clonado proyectos más grandes sin problemas de github, este estaba en bitbucket que simplemente no le gustan los proyectos grandes y es lento para descargar. Lo mismo sucede en gitlab. Establecer cualquier cosa no resolverá el problema. El problema aquí es con el control remoto. Pasar a github Configurar mi postbuffer cerca de mi tamaño de repositorio de 15M parecía ayudarme, no creo que sea la solución completa todavía.
Abhishek Dujari
git config --global http.postBuffer 157286400, configuré esto en el búfer, y el cambio de mi wifi funcionó.
ram880
2

Tuve el mismo problema y estaba relacionado con una mala conexión a Internet, así que después de probar algunas configuraciones de git, ¡me desconecté de mi red y me conecté nuevamente y funciona!

Parece que después de la conexión perdida (o la acción que dispara esta situación), git está atascado.

Espero que pueda ser de ayuda para alguien más aquí.

Mejor,

Dody
fuente
2

También tuve el mismo problema. La razón de este problema es como las descripciones de Kurtis sobre GNUTLS.

Si tiene el mismo motivo y su sistema es Ubuntu, puede resolver este problema instalando la última versión de git desde ppa:git-core/ppa. Los comandos son los siguientes.

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

Estaba enfrentando este problema cuando clonaba datos (a través de HTTP) desde un repositorio de git remoto alojado en una instancia de AWS EC2 administrada por elastic beanstalk. La clonación en sí también se realizó en la instancia de AWS EC2.

Probé todas las soluciones mencionadas y sus combinaciones:

  • configuración de git http.postBuffer
  • ajustehttp.maxrequestbuffer
  • apagando la compresión git e intentando "superficial" git cloney luego git fetch --unshallow- vea fatal: temprano EOF fatal: índice-paquete fallido
  • configuración de memoria GIT de ajuste - packedGitLimit et al, ver aquí: fatal: EOF temprano fatal: índice-paquete fallido
  • configuración de ajuste de nginx: configuración client_max_body_sizetanto en valor grande como en 0 (ilimitado); ajusteproxy_request_buffering off;
  • ajuste options single-request en /etc/resolv.conf
  • estrangulando el rendimiento del cliente git con goteo
  • usando strace para el trazado git clone
  • considerando la actualización del cliente git

Después de todo esto, todavía estaba enfrentando el mismo problema una y otra vez, hasta que descubrí que el problema está en Elastic Load Balancer (ELB) cortando la conexión . Después de acceder a la instancia EC2 (la única que aloja el repositorio de git) directamente en lugar de pasar por ELB, ¡finalmente pude clonar el repositorio de git! Todavía no estoy seguro de cuál de los parámetros ELB (tiempo de espera) es responsable de esto, por lo que todavía tengo que investigar un poco.

ACTUALIZAR

Parece que cambiar la política de drenaje de la conexión para AWS Elastic Load Balancer al aumentar el tiempo de espera de 20 segundos a 300 segundos resolvió este problema para nosotros.

La relación entre el git clone errores y el "drenaje de la conexión" es extraña y no es obvia para nosotros. Puede ser que el cambio del tiempo de espera de drenaje de la conexión provocó algunos cambios internos en la configuración de ELB que solucionaron el problema con el cierre prematuro de la conexión.

Esta es la pregunta relacionada en el foro de AWS (sin respuesta aún): https://forums.aws.amazon.com/thread.jspa?threadID=258572

Juraj Martinka
fuente
Buena captura, más específica que en mi respuesta. +1
VonC
1

Tuve un problema similar, pero con un trabajo de bambú. Bamboo estaba fallando al hacer un clon local (local pero a través de un proxy SSH) de un repositorio en caché, eliminé el caché y luego funcionó, pero cada vez que intenta clonar desde el caché local hay un error. Parece un problema con la versión de bambú del proxy SSH no git per se.

watsonmw
fuente
1

Tengo el mismo error al usar BitBucket. Lo que hice fue eliminar https de la URL de mi repositorio y establecer la URL usando HTTP.

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

RESUELTO CON WIFI Configuración de enrutador:

Tuve el mismo problema cuando estoy en wifi con Configuración PPPoE (inicio de sesión automático por enrutador wifi).

La velocidad de descarga de Git es muy lenta 15kb.

packet_write_wait: conexión al puerto 22 17.121.133.16: tubería rota fatal: el extremo remoto colgó inesperadamente fatal: EOF temprano fatal: falló el paquete de índice

Solución: 1. Cambió la configuración a IP dinámica, reinicie el enrutador wifi. 2. Desde el inicio de sesión del navegador web hasta el portal del proveedor de servicios de Internet (no configure PPPoE, inicie sesión automáticamente desde el enrutador wifi).

Después de cambiar Git, la velocidad de descarga es de 1.7MiB.

GovindaRaju
fuente
1

Esto resolvió mi problema:

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

Los trucos anteriores no me ayudaron, ya que el repositorio era más grande que el tamaño máximo de empuje permitido en github. Lo que funcionó fue una recomendación de https://github.com/git-lfs/git-lfs/issues/3758 que sugería presionar un poco a la vez:

Si su sucursal tiene una larga historia, puede intentar empujar un número menor de confirmaciones a la vez (por ejemplo, 2000) con algo como esto:

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

Eso recorrerá la historia del maestro, empujando objetos 2000 a la vez. (Por supuesto, puede sustituir una rama diferente en ambos lugares si lo desea). Cuando lo haya hecho, debería poder presionar al maestro una última vez, y las cosas deberían estar actualizadas. Si 2000 es demasiado y vuelve a encontrar el problema, puede ajustar el número para que sea más pequeño.

Marc Meyer
fuente
Alternativa interesante a mi respuesta de 8 años. Votado
VonC
1

Perdí unas horas probando algunas de estas soluciones, pero finalmente lo rastreé hasta un IPS corporativo (Sistema de protección contra intrusiones) que interrumpió la conexión después de que se transfirió una cierta cantidad de datos.

usuario shonky de linux
fuente
1

Para el ancho de banda compartido, intente clonar cuando la carga sea menor. De lo contrario, intente con una conexión de alta velocidad. Si aún no funciona, utilice el siguiente comando,

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

Y trata de clonar nuevamente. Es posible que deba cambiar esa configuración de acuerdo con su tamaño de memoria disponible.

Sazzad Hissain Khan
fuente
0

Esto funcionó para mí, configurando el servidor de nombres de Google porque no se especificó ningún servidor de nombres estándar, seguido de reiniciar la red:

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

Me enfrenté a este problema usando git en Kubuntu. También noté la inestabilidad general en las redes y encontré una solución .

en /etc/resolv.conf agregue la línea al final del archivo

opciones de solicitud única

Esto solucionó los retrasos antes de que cada resolución de nombre de dominio y git comenzaran a funcionar como un encanto después de esto.

truf
fuente
0

Encontré mi problema con el archivo .netrc, si es así también para usted, puede hacer lo siguiente:

Abra su archivo .netrc y edítelo para incluir credenciales de github. Escriba nano ~/netrcogedit ~/netrc

Luego incluya lo siguiente: * machine github.com

nombre de usuario

contraseña secreta

máquina api.github.com

nombre de usuario

contraseña secreta *

Puede incluir su contraseña sin procesar allí, pero por razones de seguridad, genere un token de autenticación aquí token github y péguelo en lugar de su contraseña.

Espero que esto ayude a alguien

Ruto Collins
fuente
0

Puede deberse al tamaño de las confirmaciones que se están enviando. Desglose la cantidad de confirmaciones mediante los siguientes pasos:

git log -5

Vea los últimos 5 commits y sabrá cuáles no se envían al control remoto. Seleccione una identificación de confirmación y envíe todas las confirmaciones a esa identificación:

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

NOTA: Acabo de comprobar mi confirmación, que podría tener el tamaño más grande; primero empujado hacia arriba hasta entonces. ¡El truco funcionó!

Vinayak Bagaria
fuente
0

Estaba haciendo git push desde mi Mac OS X El Capitan. Recibía el mismo error, intenté todo para solucionarlo, lo que encontré en google / stackoverflow. En lo que respecta a la versión, estoy usando la última versión de github que es 2.7.4. He creado un proyecto en mi sistema local y quería que fuera público en mi cuenta de Github. El tamaño del proyecto no fue de alrededor de 8 MB. Me di cuenta de que cuando estaba presionando algunos archivos de un tamaño de alrededor de 1.5 MB, estaba presionando correctamente, pero con un tamaño grande falló, con el mismo error,

La única opción que tenía era impulsar los cambios en la porción de MB. Ahora he empujado todos los cambios. Esta es una solución para mí hasta que obtenga una solución para esta solución.

Por lo tanto, también puede intentar impulsar el cambio en la confirmación múltiple. O si tiene varias carpetas, puede impulsar los cambios por cada carpeta (si el tamaño de la carpeta no es grande).

Espero que esto te ayude a continuar trabajando en el proyecto.

Rahul Raghuvanshi
fuente
0

Enfrentado el mismo problema, intente fusionarse con otra rama y tome un tirón de ellos. A mí me funciona igual.

Anupam Maurya
fuente
0

usar en sshlugar de http, no es una buena respuesta para esta pregunta, pero al menos funciona para mí

vuhung3990
fuente