2011-01-14 21 views
125

Durante el primer clon de un repositorio, git primero recibe los objetos (lo que es bastante obvio), y luego pasa aproximadamente la misma cantidad de tiempo "resolviendo deltas". ¿Qué está sucediendo realmente durante esta fase del clon?¿Qué está haciendo realmente Git cuando dice que está "resolviendo deltas"?

+0

Relacionados: http://stackoverflow.com/questions/9478023/is-the-git-binary-diff-algorithm-delta-storage-standardized –

Respuesta

37

Git usa delta encoding para almacenar algunos de los objetos en los paquetes. Sin embargo, no desea tener que reproducir cada cambio alguna vez en un archivo determinado para obtener la versión actual, por lo que Git también tiene instantáneas ocasionales del contenido del archivo almacenado también. "Resolución de deltas" es el paso que tiene que ver con asegurarse de que todo eso se mantenga constante.

Here's a chapter de la sección "Git Internals" del libro de Pro Git, que está disponible en línea, que habla de esto.

+41

Esta respuesta es incorrecta. Parece describir cómo funciona Mercurial, no Git. Está apareciendo en las búsquedas de Google para este problema, así que siento la necesidad de responder. Git no * almacena * las diferencias entre confirmaciones como deltas; Git es una tienda de "objetos enteros". Como tal, Git no necesita "instantáneas" para mostrar ningún archivo dado porque el historial de archivos no necesita ser reconstruido a partir de deltas. Así es como funciona Mercurial. –

+9

El único lugar donde entra en juego la codificación delta está en el archivo del paquete que es estrictamente para la compresión y la transferencia; no altera la forma en que Git "ve" el mundo. (Http://kernel.org/pub/software/scm/git/docs/v1.6.2.3/technical/pack-heuristics.txt) Por favor ver la respuesta de araqnid abajo para una respuesta precisa. –

+2

Toda "instantánea" significa en este contexto una copia completa de un estado de archivo, en lugar de una versión codificada en delta. Como mencionaste, Git * does * usa delta-encoding en packfiles. Nadie dijo que "altera cómo Git ve el mundo"; por favor deja de proyectar tus propias suposiciones. – Amber

75

Las etapas de git clone son:

  1. recibir un archivo "paquete" de todos los objetos en la base de datos de recompra
  2. Crear un archivo de índice para el paquete recibido
  3. Mira la revisión de cabecera (para un repositorio non-bare, obviamente)

"Resolución de deltas" es el mensaje que se muestra para la segunda etapa, indexando el archivo del paquete ("paquete de índice git").

Los archivos de paquete do no tienen los ID de objeto reales en ellos, solo el contenido del objeto. Entonces, para determinar cuáles son los ID de los objetos, git tiene que hacer una descompresión + SHA1 de cada objeto en el paquete para producir el ID del objeto, que luego se escribe en el archivo de índice.

Un objeto en un archivo de paquete se puede almacenar como un delta, es decir, una secuencia de cambios para hacer a otro objeto. En este caso, git necesita recuperar el objeto base, aplicar los comandos y SHA1 el resultado. El propio objeto base podría tener que derivarse aplicando una secuencia de comandos delta. (Aunque en el caso de un clon, ya se habrá encontrado el objeto base, existe un límite en la cantidad de objetos manufacturados que se almacenan en la memoria).

En resumen, la etapa de "resolver deltas" implica descomprimir y verificar toda la base de datos de repos, lo que no sorprendentemente lleva bastante 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 objeto delta) a otros objetos que se espera que el git receptor ya tenga. En este caso, la git receptora en realidad reescribe el archivo del paquete recibido para incluir dichos objetos referenciados, de modo que cualquier archivo almacenado sea autosuficiente. Este podría ser el origen del mensaje "resolución de deltas".

+5

¿Se puede paralelizar? – brooksbp

+0

¿Esta compresión delta es más que almacenar múltiples objetos en una secuencia de datos zlib? – fuz

+0

@FUZxxl sí, se trata de utilizar un algoritmo como diff o xdelta para comparar dos gotas y producir una edición guión – araqnid

4

Amber parece describir el modelo de objeto que utiliza Mercurial o similar. Git no almacena los deltas entre versiones posteriores de un objeto, sino instantáneas completas del objeto, cada vez. A continuación, comprime estas instantáneas utilizando la compresión delta, tratando de encontrar buenos deltas para usar, independientemente de dónde existan en el historial.

+5

En realidad, mientras que Git puede almacenar objetos sueltos que no están necesariamente siempre se almacena como tal - como el los objetos sueltos se pueden eliminar y reemplazar con contenido empaquetado. No creo que la respuesta de Amber dijera nada sobre las versiones posteriores. – AlBlue

Cuestiones relacionadas