Git

Git Shallow Clone y Clone Depth

Git Shallow Clone y Clone Depth

Comprensión de la clonación superficial y la profundidad de clonación de Git

Git es un sistema de control de versiones distribuido. Esa es una de las ventajas de usar Git. No tiene que depender de un servidor central o repositorio para trabajar localmente. Todo lo que necesita con respecto al historial de sus módulos está al alcance de su mano. Sin embargo, puede convertirse en un problema cuando se trata de repositorios con archivos binarios grandes o repositorios que tienen una larga historia. Especialmente si tiene una situación en la que necesita descargarlo nuevo cada vez, como un servidor de compilación, entonces el tamaño y los tiempos de descarga pueden convertirse en un problema.

La solución de Git al problema es un clon superficial donde puede usar la profundidad del clon para definir qué tan profundo debe ir su clon. Por ejemplo, si usa -depth 1, durante la clonación, Git solo obtendrá la última copia de los archivos relevantes. Puede ahorrarle mucho espacio y tiempo.

Clonación superficial y tamaño de Git

Echemos un vistazo al popular repositorio de Git para Django. Si clona por completo el repositorio, obtiene lo siguiente:

$ git clon https: // github.com / django / django.git
Clonando en 'django'…
remoto: Contando objetos: 409053, hecho.
remoto: Comprimir objetos: 100% (26/26), hecho.
remoto: Total 409053 (delta 6), reutilizado 8 (delta 1), paquete reutilizado 409026
Recepción de objetos: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, hecho.
Resolución de deltas: 100% (297045/297045), hecho.
Comprobando conectividad ... hecho.
Comprobación de archivos: 100% (5860/5860), hecho.

Ahora, si comprueba el tamaño de su copia local, es:

$ du -sh django /
225M django /

Consigamos el mismo repositorio de Django con un clon superficial:

$ git clone --depth 1 https: // github.com / django / django.git
Clonando en 'django' ..
remoto: Contando objetos: 8091, hecho.
remoto: Comprimir objetos: 100% (4995/4995), hecho.
remoto: Total 8091 (delta 2036), reutilizado 5507 (delta 1833), paquete reutilizado 0
Recepción de objetos: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, hecho.
Resolución de deltas: 100% (2036/2036), hecho.
Comprobando conectividad ... hecho.
Comprobación de archivos: 100% (5860/5860), hecho.

Ahora, si verifica el tamaño de su copia local, debería ser significativamente menor:

$ du -sh django /
55M django /

Cuando su servidor se ocupa de cientos de líneas de productos, este tipo de ahorro de espacio en el disco duro puede resultar útil. En los casos de proyectos de juegos donde hay binarios pesados, esto puede tener un efecto dramático. También ayuda con proyectos a largo plazo. Por ejemplo, la clonación completa del repositorio de Linux desde GitHub es de más de 7 GB, pero puede clonarlo superficialmente por menos de 1 GB.

Clon superficial e historia de Git

Puede verificar localmente la clonación superficial con su propio repositorio. Creemos un archivo en nuestro repositorio local, hagamos cambios y lo consigamos 10 veces. Y luego podemos clonar el repositorio:

$ mkdir _example
$ cd _example
$ ls
$ git init
Repositorio de Git vacío inicializado en / Users / zakh / git_repo / _example /.git /
$ echo x> archivo_grande
$ git add -A
$ git commit -m "Confirmación inicial"
[master (root-commit) dd11686] Confirmación inicial
1 archivo modificado, 1 inserción (+)
modo de creación 100644 large_file
$ echo xx> archivo_grande
$ git add -A
$ git commit -m "Modificación a large_file 1"
[master 9efa367] Modificación a large_file 1
1 archivo modificado, 1 inserción (+), 1 eliminación (-)
..
..
prueba $ mkdir
$ cd prueba
$ git clone file: //// Users / zakh / git_repo / _example
Clonando en '_example'…
remoto: Contando objetos: 33, hecho.
remoto: Comprimir objetos: 100% (22/22), hecho.
remoto: Total 33 (delta 10), reutilizado 0 (delta 0)
Recepción de objetos: 100% (33/33), 50.03 MiB | 42.10 MiB / s, hecho.
Resolución de deltas: 100% (10/10), hecho.
Comprobando conectividad ... hecho.

En este ejemplo, hemos creado el repositorio _example git en la carpeta / Users / zakh / git_repo / con un solo large_file. Solo se muestran las dos primeras confirmaciones. Luego, estamos creando un clon completo de ese repositorio en una ubicación diferente.

Entonces, revisemos el historial de nuestras confirmaciones:

$ git log --en línea
7fa451f Modificación a large_file 10
648d8c9 Modificación a large_file 9
772547a Modificación a large_file 8
13dd9ab Modificación a large_file 7
5e73b67 Modificación a large_file 6
030a6e7 Modificación a large_file 5
1d14922 Modificación a large_file 4
bc0f2c2 Modificación a large_file 3
2794f11 Modificación a large_file 2
d4374fb Modificación a large_file 1
924829d Confirmación inicial

Vemos todas las confirmaciones en el clon completo.
Ahora eliminemos la copia actual y luego el clon superficial con una profundidad de 1:

$ git clone --depth 1 file: //// Users / zakh / git_repo / _example
Clonando en '_example'…
remoto: Contando objetos: 3, hecho.
remoto: Comprimir objetos: 100% (2/2), hecho.
remoto: Total 3 (delta 0), reutilizado 0 (delta 0)
Recepción de objetos: 100% (3/3), 50.02 MiB | sesenta y cinco.12 MiB / s, hecho.
Comprobando conectividad ... hecho.

Si miramos el historial ahora, vemos solo el último historial de confirmaciones:

$ git log --en línea
7fa451f Modificación a large_file 10

Hagamos un clon superficial con una profundidad de 3:

$ git clone --depth 3 file: //// Users / zakh / git_repo / _example
Clonando en '_example'…
remoto: Contando objetos: 9, hecho.
remoto: Comprimir objetos: 100% (6/6), hecho.
remoto: Total 9 (delta 2), reutilizado 0 (delta 0)
Recepción de objetos: 100% (9/9), 50.02 MiB | sesenta y cinco.15 MiB / s, hecho.
Resolución de deltas: 100% (2/2), hecho.
Comprobando conectividad ... hecho.

Ahora vemos más confirmaciones:

$ git log --en línea
7fa451f Modificación a large_file 10
648d8c9 Modificación a large_file 9
772547a Modificación a large_file 8

Problemas con el clon superficial de Git

Los usuarios deben comprender que el tamaño y el ahorro de tiempo de descarga dependen de la organización de las confirmaciones. Pueden diferir significativamente de un repositorio a otro. Es una buena idea probar el repositorio con un clon superficial para comprobar cuánto espacio en el disco duro y tiempo de descarga le ahorrará.

Otra consideración es que, aunque puede enviar código desde un clon superficial, puede llevar más tiempo debido a los cálculos entre el servidor remoto y el local. Entonces, si está confirmando código regularmente desde la copia local, probablemente tenga sentido usar un clon completo.

Opción de rama múltiple

Cuando usa el indicador -depth con el comando clon, Git asume el indicador -single-branch de forma predeterminada. Pero puede usar el indicador -no-single-branch para decirle a Git que obtenga historias de la profundidad especificada de cada rama.

Aquí están las ramas de Django sin la opción -no-single-branch (profundidad 1):

$ git branch -a
* Maestro
remotes / origin / HEAD -> origen / maestro
mandos a distancia / origen / maestro

Solo la rama maestra está presente.

Aquí están las ramas de Django después de usar la opción -no-single-branch:

$ git clone --depth 1 --no-single-branch https: // github.com / django / django.git
Clonando en 'django'…
remoto: Contando objetos: 95072, hecho.
remoto: Comprimir objetos: 100% (42524/42524), hecho.
remoto: Total 95072 (delta 52343), reutilizado 82284 (delta 42389), paquete reutilizado 0
Recepción de objetos: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, hecho.
Resolución de deltas: 100% (52343/52343), hecho.
Comprobando conectividad ... hecho.
Comprobación de archivos: 100% (5860/5860), hecho.
$ du -sh django
124M django

Tenga en cuenta que aunque la profundidad sigue siendo 1, el tamaño del clon es 124M en lugar del 55M del caso anterior.
Si revisamos las ramas, deberíamos ver muchas más ramas en este clon:

$ cd django
$ git branch -a
* Maestro
remotes / origin / HEAD -> origen / maestro
control remoto / origen / ático / boulder-oracle-sprint
controles remotos / origen / ático / historia completa
remotes / origin / attic / generic-auth
mandos a distancia / origen / ático / gis
mandos a distancia / origen / ático / i18n
mandos a distancia / origen / ático / eliminación de magia
mandos a distancia / origen / ático / auth múltiple
remotes / origin / attic / multiple-db-support
remotes / origin / attic / new-admin
remotes / origin / attic / newforms-admin
remotes / origin / attic / per-object-permissions
remotes / origin / attic / queryset-refactor
mandos a distancia / origen / ático / esquema-evolución
remotos / origen / ático / esquema-evolución-ng
remotes / origin / attic / search-api
remotos / origen / ático / sqlalchemy
mandos a distancia / origen / ático / unicode
mandos a distancia / origen / maestro
controles remotos / origin / soc2009 / admin-ui
remotes / origin / soc2009 / http-wsgi-improvement
remotes / origin / soc2009 / i18n-mejoras
remotes / origin / soc2009 / model-validation
mandos a distancia / origin / soc2009 / multidb
remotes / origin / soc2009 / test-mejoras
remotes / origin / soc2010 / carga de aplicaciones
remotes / origin / soc2010 / query-refactor
mandos a distancia / origin / soc2010 / test-refactor
remotos / origen / estable / 0.90.X
remotos / origen / estable / 0.91.X
remotos / origen / estable / 0.95.X
remotos / origen / estable / 0.96.X
remotos / origen / estable / 1.0.X
remotos / origen / estable / 1.1.X
remotos / origen / estable / 1.10.X
remotos / origen / estable / 1.11.X
remotos / origen / estable / 1.2.X
remotos / origen / estable / 1.3.X
remotos / origen / estable / 1.4.X
remotos / origen / estable / 1.5.X
remotos / origen / estable / 1.6.X
remotos / origen / estable / 1.7.X
remotos / origen / estable / 1.8.X
remotos / origen / estable / 1.9.X
remotos / origen / estable / 2.0.X

Resumen

El clon superficial de Git puede ayudarlo a ahorrar tiempo y espacio en el disco duro. Pero tiene un precio. Si envía código regularmente a repositorios remotos, aumentará los tiempos de confirmación. Entonces, para flujos de trabajo regulares, es una buena idea evitar clones superficiales.

Referencias:

Los mejores juegos de línea de comandos para Linux
La línea de comandos no es solo su mayor aliado cuando usa Linux, también puede ser la fuente de entretenimiento porque puede usarla para jugar muchos...
Las mejores aplicaciones de mapeo de gamepad para Linux
Si te gusta jugar juegos en Linux con un gamepad en lugar de un sistema de entrada de teclado y mouse típico, hay algunas aplicaciones útiles para ti....
Herramientas útiles para jugadores de Linux
Si le gusta jugar juegos en Linux, es probable que haya utilizado aplicaciones y utilidades como Wine, Lutris y OBS Studio para mejorar la experiencia...