remove - git tag best practices
Cómo recuperar git de manera eficiente desde un clon superficial (5)
Usamos git para distribuir un sistema operativo y mantenerlo actualizado . No podemos distribuir el repositorio completo ya que es demasiado grande (> 2 GB), por lo que hemos estado utilizando clones poco profundos (~ 300M). Sin embargo, recientemente, cuando se extrae de un clon poco profundo, ahora se obtiene ineficazmente todo el repositorio de> 2 GB . Este es un desperdicio insostenible de ancho de banda para implementaciones.
La documentación de git dice que no se puede obtener de un repositorio poco profundo, aunque eso no es estrictamente cierto. ¿Hay alguna solución para hacer una git clone --depth 1
capaz de recuperar solo lo que ha cambiado? ¿O alguna otra estrategia para mantener el tamaño de la distribución lo más pequeño posible mientras se tienen todos los bits que necesita Git para hacer una actualización?
Intenté sin éxito clonar desde --depth 20
para ver si se actualizará más eficientemente, eso no funcionó. También busqué en http://git-scm.com/docs/git-bundle , pero eso parece crear enormes paquetes.
Acabo de g clone github.com:torvalds/linux
y me llevó mucho tiempo, así que me g clone github.com:torvalds/linux
CTRL+C
Luego hizo g clone github.com:torvalds/linux --depth 1
y lo clonó bastante rápido. Y solo tengo una confirmación en el git log
.
Entonces clone --depth 1
debería funcionar. Si necesita actualizar el repositorio existente, debe usar git fetch origin branchname:branchname --depth 1
. Funciona también, solo obtiene una confirmación.
Resumiendo:
Clon inicial:
git clone git_url --depth 1
Actualización de código
git fetch origin branch:branch --depth 1
No sé si se adapta a su configuración, pero lo que uso es tener clon completo de un repositorio en un directorio separado. Luego hago un clon superficial del repositorio remoto con referencia al local.
git clone --depth 1 --reference /path/to/local/clone [email protected]/group/repo.git
De esta forma, solo se obtienen las diferencias con el repositorio de referencia y el control remoto. Para que sea aún más rápido, puedes usar la opción --shared
, pero asegúrate de leer sobre las restricciones en la documentación de git
(puede ser peligroso).
También descubrí que, en algunas circunstancias, cuando el control remoto ha cambiado mucho, el clon comienza a captar demasiados datos. Es bueno romperlo y actualizar el repositorio de referencia (que extrañamente requiere mucho menos ancho de banda del que se necesitó en primer lugar). Y luego reinicia el clon.
Si puede seleccionar una rama específica, puede ser aún más rápido. Aquí hay un ejemplo con la rama Spark master y la última etiqueta:
Clon inicial
git clone [email protected]:apache/spark.git --branch master --single-branch --depth 1
Actualizar a una etiqueta específica
git fetch --depth 1 origin tags/v1.6.0
Se vuelve muy rápido cambiar etiquetas / ramas de esta manera.
Tenga en cuenta que Git 1.9 / 2.0 (Q1 2014) podría ser más eficiente en la búsqueda de un clon superficial.
Ver commit 82fba2b , de Nguyễn Thái Ngọc Duy ( pclouds
) :
Ahora que git admite la transferencia de datos desde o hacia un clon superficial, estas limitaciones ya no son ciertas.
Todos los detalles están en " shallow.c
: los 8 pasos para seleccionar nuevos commits para .git/shallow
".
Puede ver la consecuencia en commits como 0d7d285 , f2c681c y c29a7b8 que admiten clon, send-pack / receive-pack con / desde clones poco profundos.
smart-http ahora también es compatible con fetch / clone superficial .
Incluso puedes clonar desde un repositorio poco profundo .
Actualización 2015: git 2.5+ (Q2 2015) incluso permitirá una recuperación de compromiso única . Consulte " Extraer un compromiso específico de un repositorio de git remoto ".
Actualización 2016 (octubre): git 2.11+ (Q4 2016) permite buscar:
- desde una fecha
--shallow-since=<date>
- con una mayor profundidad :
--deepen=N
--depth
es una opción de git fetch
. Veo que el documento en realidad no destaca que el git clone
haga una búsqueda.
Cuando recuperas, los dos repos intercambian información sobre quién tiene qué, comenzando desde los cabezales del control remoto y buscando hacia atrás la confirmación compartida más reciente en los historiales de los revisores recuperados, luego completando todos los objetos faltantes para completar solo los nuevos commits entre Compromisos compartidos más recientes y los recién recuperados.
A --depth=1
fetch solo obtiene las puntas de las ramas y no hay antecedentes. Otras búsquedas de esos historiales obtendrán todo lo nuevo mediante el procedimiento anterior, pero si los commits previamente recuperados no están en el historial recién recuperado, fetch lo recuperará todo, a menos que limite la búsqueda con --depth
.
Su cliente realizó una búsqueda de profundidad = 1 de un repositorio y cambió las URL a un repositorio diferente. Al menos una ruta de ancestro larga en los refs de este nuevo repositorio aparentemente no comparte compromisos con nada actualmente en su repositorio. Puede valer la pena investigarlo, pero de cualquier forma, a menos que exista alguna razón en particular, sus clientes pueden hacer cada búsqueda --depth=1
.