¿Cómo completar un clon de git para un gran proyecto en una conexión inestable?


193

Estoy tratando de clonar el código base de LibreOffice, pero en este momento tengo una conexión a Internet de aproximadamente 300 kbps y es todo menos estable. Puedo recuperar la conexión en cualquier momento, pero el proceso de clonación git ya dejó de funcionar y no hay forma de que vuelva a funcionar. ¿Hay alguna manera de tener una descarga de clon git más resistente a fallas?

Una opción que me consideré es descargar el directorio .git de otra persona, pero depende demasiado de los demás y no me parece la mejor solución posible.


66
¿Necesita clonar todas las revisiones, o solo las últimas? Tal vez depth -1es una solución?
takeshin

1
El enfoque de paquete ya está en su lugar para repos como kernel/git/torvalds/linux.git. Y se está discutiendo un clon git reanudable (marzo de 2016). Ver stackoverflow.com/a/29192890/6309 .
VonC

Me pregunto. ¿No lo haré git init, configurar un control remoto y luego buscar hasta que tenga éxito? No creo que fetch descarte los objetos descargados con éxito si falla la conexión.
Андрей Беньковский

@ АндрейБеньковский ¿Alguien ha intentado esto?
William Entriken

Respuestas:


71

No creo que esto esté listo todavía. Hay una página antigua de GSoC que planeaba implementar la función deseada. Mi mejor apuesta es, como sugirió descargarlo como un directorio. Supongo que puede reanudar las descargas a través de otros protocolos.

Clon reiniciable

Al clonar un repositorio grande (como KDE, Open Office, kernel de Linux) actualmente no hay forma de reiniciar un clon interrumpido. Puede tomar un tiempo considerable para que un usuario al final de una pequeña tubería descargue los datos, y si el clon se interrumpe en el medio, el usuario debe comenzar desde el principio e intentar nuevamente. Para algunos usuarios, esto puede hacer que sea imposible clonar un repositorio grande.

Objetivo: Permitir que git-clone reanude automáticamente una descarga fallida anteriormente sobre el protocolo nativo git: //. Lenguaje: C Mentor: Shawn Pearce Sugerido por: Shawn Pearce en gmane


Actualizar

Junto con la git clone --depth=1sugerencia de clonación superficial ( ) en una de las otras respuestas, puede ser útil si alguien puede hacer un depósito desnudo para usted si puede comunicarse con el proveedor. Puede convertir fácilmente el repositorio desnudo en un repositorio completo. Lea también los comentarios en esa respuesta, ya que un clon superficial no siempre ayuda.


Gracias por la información, por lo que mi problema es conocido y se trabaja en una solución ... ¿Qué recomendaría como solución?
LaPingvino

9
Bueno, ayer perdí mis 600 rupias ($ 10) debido a este problema. El ancho de banda de Internet es algo muy valioso en mi parte del mundo.
Amit Singh Tomar

2
Mucha gente solicita actualizaciones y nadie comparte su contribución a la solución.
William Entriken

2
Mar'18 - ¡Lukin por eso todavía ... en esta tierra!
terrícola

3
11 años después, el ataque de Google al problema socioeconómico subyacente del ancho de banda poco confiable con Google Fiber y Google Fi tuvo resultados mixtos. Sus micro trincheras de fibra en la ciudad de Louisville fueron cortadas muy poco en el asfalto, y los cables se encontraron saliendo de la superficie de la carretera poco después del trabajo. Mientras tanto, --depth 1y --unshallowparece haber resistido los años de uso.
rwong

126

Dos soluciones (o más bien soluciones alternativas ) que vienen a la mente son:

  • Use clones poco profundosgit clone --depth=1 , es decir , luego profundice este clon usando git fetch --depth=N, con N creciente . Puede usar git fetch --unshallow(desde 1.8.0.3) para descargar todas las revisiones restantes.

  • Pídale a alguien que haga un paquete con alguna versión etiquetada (consulte la página de manual de git-bundle (1) ). El paquete en sí es un archivo ordinario, que puede descargar de cualquier manera, a través de HTTP / FTP con soporte de reanudación, a través de BitTorrent, a través de rsync, etc. .


3
El truco de clones poco profundos no funciona bien en la práctica. La clonación de un repositorio bien embalado (git: //libvirt.org/libvirt.git) cambia una transferencia de 68M en una transferencia de 61M + 35M. Una función para priorizar el árbol de trabajo, en lugar de todas las ramas en profundidad 1, podría funcionar mejor; La reanudación de la sesión sería aún mejor.
Tobu

1
@Tobu: el truco de clones poco profundos podría funcionar en un repositorio con una larga historia. Hay trabajo en curso para hacer que el clon superficial obtenga solo una sola rama de forma predeterminada. Eso podría haber ayudado. O no.
Jakub Narębski

66
Esto funciona realmente bien ahora, con git 1.7.10. La profundidad inicial = 1 clon del repositorio de Git es de solo 4.72Mb, mientras que el repositorio completo es de 55Mb. Las recuperaciones adicionales pueden ser tan pequeñas como desee (profundidad = 100 me dio una recuperación de ~ 20Mb). La descarga comprimida total fue de 31Mb, sobre un clon y 3 recuperaciones.
naught101

2
@ naught101 Descarga objetos para una revisión, y si el código fuente en sí es grande (no el historial), entonces será un problema nuevamente ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donefuncionó para mí, gracias! :)
Trass3r

15

Este método utiliza un servidor de terceros.

Primero, hazlo git clone --bare, luego rsync -v -P -e ssh user@host:repo.git . puedes usar msys en Windows.


Intenté la opción --bare, creó el contenido esperado de los archivos internos .git dentro de repo.git, tuve que hacer el archivo git clone: ​​///path/to/repo.git/ para obtener el repositorio real
PiyusG

1
Linus no es dueño de GitHub ... por "servidor de terceros", ¿en realidad quiere decir "servidor Git que no encarcela a sus usuarios tanto como para prohibir su uso rsync(1) por la forma en que GitHub te estoy mirando "? ¿O quiere decir primero git clone en un servidor de terceros y luego sincronizarlo a la máquina local?
JamesTheAwesomeDude


9

Puede "descargar el directorio .git de otra persona", pero con esa otra persona siendo el repositorio oficial. Los repositorios de LibreOffice están disponibles a través de http, por ejemplo, build.giten http://anongit.freedesktop.org/git/libreoffice/build.git/ (consulte http://cgit.freedesktop.org/libreoffice/ para obtener la lista completa, la URL http está en la parte inferior de la página de cada repositorio).

Lo que ves en estas URL http no es más que un .gitdirectorio (en realidad un repositorio "desnudo", que solo tiene lo que encontrarás en el .gitdirectorio). Es el mismo directorio que leería el servidor para el git://protocolo ( git daemon). Si realiza una copia de estos directorios con un descargador web (por ejemplowget -m -np ), puede clonar desde su copia y funcionará tan bien como si hubiera clonado directamente desde el repositorio http.

Entonces, lo que puede hacer es: para cada repositorio, obtenga una copia del mismo con su descargador web favorito (que se ocupará de todos los problemas con la reanudación de descargas interrumpidas) y clone desde esa copia. Cuando desee actualizar, use nuevamente su descargador web favorito para actualizar su copia, y extraiga de esa copia. Ahora sus clones y actualizaciones son tan resistentes a las malas conexiones como su descargador web favorito.


Ellos hicieron la conversión a un solo repositorio, tratando la punta wget decide descargar el sitio a la vez sin embargo ... (tratando de nuevo ahora, probablemente actualizar aquí más tarde ...)
LaPingvino

Su comando parece obtener todos los enlaces en el sitio, que no es lo que debe suceder. Recurrí a escribir un script que parece funcionar aquí: gist.github.com/1307703 De todos modos, ¡muchas gracias por la idea inicial!
LaPingvino

Una idea interesante, estoy tratando de obtener el repositorio ruby ​​/ ruby ​​de github y el robots.txt me bloquea ... ¿alguna sugerencia?
Hanetzer

6

Analicemos sus git clonepartes componentes y utilicémoslas git checkoutpara evitar volver a descargar archivos.

Cuando se git cloneejecuta, las primeras cosas que hace son equivalentes a

git init
git remote add origin <repo_url>
git fetch origin <branch>

Si ejecuta los pasos anteriores manualmente, y suponiendo que se completaron correctamente, ahora puede ejecutar lo siguiente tantas veces como sea necesario:

git checkout --force <branch>

Tenga en cuenta que revisará todos los archivos cada vez que se ejecute, pero no tendrá que volver a descargar los archivos , lo que puede ahorrarle un montón de tiempo.


1
no funciona de la manera que usted describe, no permitirá reiniciar git después de una recuperación interrumpida
MaikoID

Como dije, una vez que asumes que una búsqueda se ha completado con éxito, puedes ejecutar git reset. Si su recuperación está rota, el reinicio no funcionará. Debe A) intentar repetidamente buscar nuevamente hasta que funcione, o B) abandonar esto e intentar otra cosa.
Cowlinator

Hice algo más que funcionó milagrosamente. Hice un git pull en lugar de git fetch =)
MaikoID

@MaikoID Creo que un git pull solo llama a git fetch internamente, y luego se fusiona, por lo que el comando debería haber hecho la diferencia
lucidbrot

4

Si tiene acceso a un servidor de terceros, puede clonar allí y luego copiar.


4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

Este comando me ayuda (Gracias a Nicola Paolucci )

por ejemplo

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

Basándose en las respuestas basadas en clones / profundidad: unas pocas líneas de bash hacen esto fácilmente ...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done


Gracias, parece funcionar, estoy tratando de clonar el Arduino, estaba al 25% con aproximadamente 800 MB, y se bloqueó. La descarga en partes parece ser más segura, pero puede que no sea necesario en los pasos 1, tal vez 10 o 50 es mejor, dependiendo de cómo se actualice, imagine 80 mil archivos, no deberían escribirse en tan pocas profundidades. Uso: for m in seq 1 10 1000; do git pull --depth = $ m; hecho para obtener pasos de 10. PD Si hago Ctrl + CI pierdo solo el paquete actual, y puedo comenzar de nuevo
user3394963

3

Este problema también me mordió. En mi caso hay una solución alternativa. Puede o no aplicarse en su caso.

A veces estoy usando un teléfono móvil para iniciar operaciones git en un sistema remoto. Si mi wi-fi se rompe, por supuesto, la sesión finaliza y git abandona toda la operación de clonación sin recuperarse. Pero dado que la conexión a Internet desde mi sistema remoto al git master es sólida, no es necesario que el clon se detenga. Todo lo que necesito es el sentido común para separar el clon de la sesión terminal. Esto se puede hacer usando screen / tmux o nohup / daemon. Por lo tanto, es un mal funcionamiento de liveware en mi caso.



2

Use CNTRL Z para detener la clonación. No cierre la terminal, ponga el sistema / laptop en hibernación y luego continúe más tarde con el comando fg. Me enfrentaba a este mismo problema hoy mientras intentaba clonar un repositorio de github. Esto vino como un ahorro de tiempo para mí.


2

Aumentar el tamaño del búfer lo ayudará en este problema. Solo sigue los pasos.

pasos:

1. Abra el terminal o Git Bash y con "cd" vaya a la ubicación donde desea clonar el repositorio.

2. Establecer compresión a 0

git config --global core.compression 0

3.Configurar tamaño de tampón posterior

git config --global http.postBuffer 1048576000

4.Set maxRequestBuffer tamaño

git config --global http.maxRequestBuffer 100M

5. Ahora comienza a clonar

git clone <repo url>

6.Espere hasta que se complete el clon.

Gracias. Feliz codificación !!!


Esta definitivamente debería ser la respuesta aceptada. Soluciona el problema.
SuperEye hace

1

Me gustaría poner mis 5 centavos aquí. Esto es realmente lo que me ayudó a resolver este problema.

  • desactivar la compresión
  • aumentar http.postBuffer
  • hacer un clon parcial
  • navegue al directorio clonado y obtenga el resto del clon
  • tira el resto
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

Esto me ayudó a clonar un repo de ~ 3GB a través de la conexión adsl de 8Mbps, por supuesto, tuve que realizar operaciones de extracción y extracción algunas veces, pero aún así ...


0

si suponemos que los servidores tienen una buena banda (y usted tiene un servidor) otra respuesta es:

  1. crear su propio servidor usando el lado del servidor Git Envoltura 's
  2. clonarlo en su servidor
  3. Zip que el uso de Server-Side Zip Archiver s'
  4. descárguelo desde y con el soporte de reanudación del lado del servidor

pero esto solo funciona con una experiencia de desarrollo web muy básica;) y también necesita git.exeen su servidor


0

El mismo problema aquí: tengo una conexión a Internet realmente débil con frecuencia de no más de 10-15 kb / seg :-P

Para mí, la forma wget funcionó muy bien. Vaya al sitio del repositorio donde está el botón verde "clonar o descargar", haga clic y copie el enlace de la opción de descarga ZIP.

Luego inserte el enlace al comando
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Funciona de maravilla...


0

La mejor solución que funcionó para mí:

Me enfrenté al mismo problema con una mala conexión a Internet. Entonces se me ocurrió la siguiente solución:

Creé un pequeño archivo php en mi servidor para descargar el paquete como un archivo zip:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

luego descargue el archivo zip usando cualquier administrador de descargas que admita reanudar


-1

Puede intentar usar mercurial con la extensión hg-git.

Si eso no funciona, puede usarlo git fetch <commit-id>para buscar solo partes de un repositorio git remoto (puede buscarlo en un repositorio git vacío, no es necesario crearlo con clon). Pero puede corregir la configuración de la rama (= crear ramas de seguimiento locales y remotas) cuando utiliza este enfoque.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.