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"?
Respuesta
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.
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. –
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. –
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
Las etapas de git clone
son:
- recibir un archivo "paquete" de todos los objetos en la base de datos de recompra
- Crear un archivo de índice para el paquete recibido
- 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".
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.
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
- 1. ¿Qué está haciendo Eclipse cuando dice que está actualizando índices?
- 2. sortedArrayUsingSelector ¿qué está haciendo?
- 3. ¿Qué es el modo: shim realmente está haciendo?
- 4. postgres: ¿Qué está haciendo realmente la consulta 'select * from user'?
- 5. ¿Qué está haciendo CDbl?
- 6. ¿Qué está haciendo?
- 7. ¿Qué está haciendo este código? :() {: |: &} ;:
- 8. nmap dice que el puerto está cerrado mientras que nestat dice que está escuchando
- 9. ¿Qué está haciendo Groovy aquí?
- 10. ¿Alguien realmente está usando git super/subprojects?
- 11. ¿Qué está realmente haciendo log4j cuando activamos o desactivamos algunos lugares de registro?
- 12. ¿Qué está haciendo QString :: toUtf8?
- 13. ¿mysqldump --password realmente hace lo que dice?
- 14. ¿Qué está haciendo exactamente esta macro?
- 15. Perfiles de Flex: ¿qué está haciendo [enterFrameEvent]?
- 16. ¿Por qué dice XSD que mi elemento no está completo?
- 17. Colecciones de Java.shuffle está haciendo qué?
- 18. ¿Qué está haciendo esta inyección de SQL?
- 19. lo que innerHTML está haciendo en javascript?
- 20. ¿Qué está haciendo VC++ al empacar bitfields?
- 21. Vea lo que está haciendo sp_execute
- 22. ¿Por qué usar `git commit` cuando está separado?
- 23. ¿Por qué el constructo con() no está incluido en C#, cuando está realmente bien en VB.NET?
- 24. ¿Qué está haciendo que este descriptor de seguridad se estropee?
- 25. ¿Qué está haciendo mi compilador? (Memcpy optimización)
- 26. ¿Qué es ordenar? ¿Qué está sucediendo cuando algo está "ordenado"?
- 27. cómo investigar qué está haciendo un proceso?
- 28. ¿Qué está haciendo la multidifusión en 224.0.0.251?
- 29. ¿Qué está haciendo esta expresión regular?
- 30. ¿Qué está haciendo '$ :. unshift File.dirname (__ FILE__)'?
Relacionados: http://stackoverflow.com/questions/9478023/is-the-git-binary-diff-algorithm-delta-storage-standardized –