Durante el primer clon de un repositorio, git primero recibe los objetos (lo cual es bastante obvio), y luego pasa aproximadamente la misma cantidad de tiempo "resolviendo deltas". ¿Qué está pasando realmente durante esta fase del clon?
187
Respuestas:
Git usa la codificación delta para almacenar algunos de los objetos en paquetes. Sin embargo, usted no quiere tener que reproducir todos los cambios cada vez en un archivo determinado con el fin de obtener la versión actual, por lo Git también tiene instantáneas ocasionales de los contenidos de los archivos almacenados también. "Resolver deltas" es el paso que se ocupa de asegurarse de que todo se mantenga constante.
Aquí hay un capítulo de la sección "Git Internals" del libro Pro Git, que está disponible en línea, que habla sobre esto.
fuente
git gc
o cuando Git lo determine necesario) Git comprimirá todos los archivos "sueltos" en un paquete para ahorrar espacio y se creará un archivo de índice en ese paquete. Por lo tanto, zlib se comprimirá con su propio algoritmo delta, pero Git usa la codificación delta para almacenar versiones anteriores. Dado que el acceso más común y frecuente es la última versión, que se almacena como una instantánea.Las etapas de
git clone
son:"Resolver deltas" es el mensaje que se muestra para la segunda etapa, indexando el archivo del paquete ("git index-pack").
Los archivos de paquete no tienen los ID de objeto reales en ellos, solo el contenido del objeto. Entonces, para determinar cuáles son las ID de objeto, git tiene que hacer una descompresión + SHA1 de cada objeto en el paquete para producir la ID de objeto, que luego se escribe en el archivo de índice.
Un objeto en un archivo de paquete puede almacenarse como un delta, es decir, una secuencia de cambios para realizar en otro objeto. En este caso, git necesita recuperar el objeto base, aplicar los comandos y SHA1 el resultado. El objeto base en sí podría tener que derivarse aplicando una secuencia de comandos delta. (Aunque en el caso de un clon, el objeto base ya se habrá encontrado, hay un límite para la cantidad de objetos fabricados que se almacenan en la memoria caché).
En resumen, la etapa de "resolución de deltas" implica la descompresión y suma de comprobación de la base de datos de repositorio completa, lo que no sorprende sorprendentemente, lleva mucho tiempo. Presumiblemente, descomprimir y calcular SHA1 en realidad lleva más tiempo que aplicar los comandos delta.
En el caso de una recuperación posterior, el archivo de paquete recibido puede contener referencias (como bases de objetos delta) a otros objetos que se espera que el git receptor ya tenga. En este caso, el git de recepción reescribe el archivo de paquete recibido para incluir dichos objetos referenciados, de modo que cualquier archivo de paquete almacenado sea autosuficiente. Esto podría ser donde se originó el mensaje "resolviendo deltas".
fuente
Amber parece estar describiendo el modelo de objetos que Mercurial o usos similares. Git no almacena los deltas entre versiones posteriores de un objeto, sino más bien instantáneas completas del objeto, cada vez. Luego comprime estas instantáneas usando la compresión delta, tratando de encontrar buenas deltas para usar, independientemente de en qué parte del historial existan.
fuente