¿Cuál es la forma más rápida de trabajar en git con una connection de networking lenta?

Este es el escenario: en el trabajo tenemos bastantes sucursales y no hemos mantenido el repository tan orderado como debería, agregando / eliminando de vez en cuando files grandes o cosas por el estilo, y rara vez eliminando twigs muertas.

Así que hoy es un día de nieve y tengo que trabajar desde casa. Tengo una connection lenta de VPN, y todo lo que necesito es la manera más rápida de llegar a la única twig que me importa y comenzar a trabajar, con la capacidad de enviar los commits hacia atrás.

En SVN, habría actualizado las routes / files que necesitaba y habría estado trabajando en muy poco time. Al igual que la mayoría de los novatos git, solo tengo un puñado de commands confiables, y mi copy alternativa de git o git pull van a ser muy lenta.

Entonces parece ser una pregunta en dos partes:

  1. ¿Cómo puedo clonar un repository para trabajar lo más rápido posible, y
  2. ¿Cómo puedo extraer / empujar de este repository (editar, comprometer, tirar, pulsar)

Solución de trabajo (según las sugerencias de @ g19fanatic a continuación):

> mkdir <project_name> > cd <project_name> > git clone -b <branchname> <repo_url> --depth=1 remote: Counting objects: 16679, done. remote: Compressing objects: 100% (11926/11926), done. remote: Total 16679 (delta 6936), reused 10919 (delta 3337) Receiving objects: 100% (16679/16679), 628.12 MiB | 430 KiB/s, done. Resolving deltas: 100% (6936/6936), done. > git pull Already up-to-date. 

(hacer pequeños cambios en otra máquina, confirmar / presionar)

 > git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (5/5), done. remote: Total 5 (delta 0), reused 0 (delta 0) 

Excelente, esto funcionó.

El único problema es que transfirió el doble de datos inicialmente que los bashs siguientes , pero dejó el repository en un estado utilizable. Consideraré que esto fue respondido, pero creo que podría haber una mejora en el tamaño de la transferencia inicial.

Primer bash fallido:

Parte 1. parece ser mejor resuelto por:

En lugar de clonar todo el repository con todas sus twigs e historial, cree un nuevo repository vacío y busque la única twig que me interesa con una profundidad de 1 (sin historial):

 mkdir <project_name> cd <project_name> git init git fetch --depth=1 <repo_url> <branchname>:refs/remotes/origin/<branchname> git checkout <branchname> 

Esto fue genial, ya que realizó una transferencia de networking mucho más pequeña que la que tendrían los clones o git completos.

Pero ahora estoy teniendo problemas con la parte 2) tirando y empujando de este depósito superficial. Mis compañeros de trabajo están realizando pequeñas actualizaciones a lo largo del día, como yo, por lo que debería ser posible tirar y empujar rápidamente estos pequeños cambios incrementales. Pero cuando trato de configurar la twig para rastrear el control remoto, git pull intenta extraer el historial completo. Incluso ejecutando extracción o recuperación con –depth 1 parece querer transferir sobre instantáneas completas de nuevo (en lugar de pequeños cambios incrementales).

Entonces, ¿qué puedo hacer en una situación así? (Aparte de lo obvio: limpie el repository, eliminando elementos del historial anterior y twigs muertas).

Segundo bash fallido (según las sugerencias de @ g19fanatic a continuación):

Siguiendo la sugerencia de @ g19fanatic, creé un repository usando

 > mkdir <project_name> > cd <project_name> > git init > git remote add origin <repo_url> > git pull origin <branchname> --depth=1 remote: Counting objects: 9403, done. remote: Compressing objects: 100% (6675/6675), done. remote: Total 9403 (delta 2806), reused 7217 (delta 2136) Receiving objects: 100% (9404/9403), 325.63 MiB | 206 KiB/s, done. Resolving deltas: 100% (2806/2806), done. ... 

Esto creó una twig de seguimiento y extrajo correctamente solo un historial de 1 twig (~ 9400 objects, 325MB, mientras que el repository completo tiene ~ 46k objects). Sin embargo, una vez más, parece que no puedo sacar nada sin get más información de la que creo que es necesario extraer. Creo que debería poder retirar mis compromisos de compañeros de trabajo en unos pocos objects y algunos kilobytes. Pero esto es lo que veo:

 > git pull origin <branchname> remote: Counting objects: 45028, done. remote: Compressing objects: ... ^C 

Esto iba a extraer todos los objects del repository completo, así que lo rompí. Intenté el tirón con el argumento –depth = 1:

 > git pull origin <branchname> --depth=1 remote: Counting objects: 9870, done. remote: Compressing objects: 100% (7045/7045), done. Receiving objects: 4% (430/9870), 4.20 MiB | 186 KiB/s ^C 

9k + objects iba a ser similar al tirón inicial, pero lo di un poco porque pensé que tal vez algunos de esos objects ya existirían localmente. Sin embargo, después de transferir 4+ MB, rompí este command porque parece estar haciendo toda la transferencia nuevamente. Recuerde, espero pequeñas actualizaciones de mis compañeros de trabajo, y no tengo time para extraer 300 MB cada vez.

Al hacer una pequeña testing aquí, pude hacer lo siguiente …

Tenemos un compartido –repo repo en la networking

tengo la configuration remota como git remote add origin <pathToShanetworkingRepo>
hago un git pull origin <branch> --depth=1 (no en git fetch pero git pull )

esto logra con éxito solo los commits "HEAD + depth" para esta twig. Puedo comprometerme con esto y lo otro y luego presionar ( git push debería funcionar bien) se vuelve a salir sin problemas.

para extraer los nuevos commits y JUST los commits nuevos del repository compartido, tengo que escribir explícitamente el git pull origin <branch> . Dado que esta es la forma en que originalmente hice el tirón (explícitamente), tengo que hacer lo mismo esta vez …

Esto no debería tirar de más historia que la profundidad que estableciste originalmente (no importa)


Para estar completo, también puede realizar una configuration de profundidad cuando está clonando el repository:
git clone -b <branch> <pathToRepo> --depth=<numCommitsWanted>