La database de objects Git parece estar perdiendo objects blob

Basado en este artículo de Git , donde se explican los objects y cómo se almacenan, estoy mirando nuestros objects de repository git, y creo que cualquiera de los gits almacena las cosas de forma un poco diferente o no almacena todo.

Fondo

De acuerdo con el artículo, hay types de objects como tree , commit y blob :

  1. blob es simplemente un file.
  2. tree es como un object contenedor, en su contenido, tiene códigos hash SHA1 que hacen reference a un subtree u otros objects blob.
  3. commit contiene un tree references, así como información sobre el autor, el time, etc.

Hasta aquí todo bien.

Nuestro código fuente

Nuestro código fuente contiene cientos de carpetas, miles de files, etc. Y casi agregamos todo al control de origen.

El problema

Cuando ejecuto el siguiente command: find .git/objects -type f , obtengo el siguiente resultado:

enter image description here

Son los únicos objects que puedo ver, que contienen commit , tree y blobs .

Vamos a verificar el contenido de un object de muestra de esa list ejecutando este command git cat-file -p 04acc15d91xxxxxxxxxxxxxxxxxxxxxxxxxxxx :

enter image description here

Si le gustan los types en el contenido de un object de tree tomado, vemos que hace reference a tres objects de tree y dos objects de blob . Y los blobs, como veis, tienen nombres que terminan en varias extensiones, y son files reales en mi carpeta de código fuente.

Pero cuando pensamos en la cantidad de files que tenemos, la cantidad de objects no coincide. Son muy pocos objects en la list de objects. ¿Dónde están esos otros objects de blob ?

Además, cuando digo $ git cat-file -p e57531c55xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx en un object blob , obtengo el mismo contenido que si abriera el file con un editor de text, que se espera:

enter image description here

Esto es bueno y todo. Si bien todo está funcionando como se esperaba. Entonces, ¿dónde están el rest de los objects de blob ?

Además, cuando miro un object de tree con subtreees, veo la misma estructura de carpeta que veo en mi directory de trabajo, que también se espera de acuerdo con este párrafo de la misma página:

Git almacena contenido de manera similar a un sistema de files UNIX, pero un poco simplificado. Todo el contenido se almacena como objects de tree y blob, con treees que corresponden a inputs de directory UNIX y blobs que corresponden más o less a inodos o contenido de files. Un único object de tree contiene una o más inputs de tree, cada una de las cuales contiene un puntero SHA-1 a un blob o subtree con su modo, tipo y nombre de file asociado.

Siento que, en algún momento, Git deja de crear treees para carpetas y los almacena como grandes blobs?

La razón por la que siente que le faltan files de objects git en el disco es que tiene razón y está equivocado.

Ya no están en el disco como files separados, sino que se han combinado en un file de package.

Entonces están en el disco, simplemente no están en files separados.

Puede ver este file de package en la parte inferior de su captura de pantalla superior. Un file de package es un file .pack junto con .idx , el índice del file de package.

Puede mirar dentro del file del package ejecutando este command:

 git verify-pack -v .git/objects/pack/pack-SHA-OF-PACK.pack 

Esto debería include algo así como:

 200c8213bd227eed106fed7b168ac3dfd5257cc3 commit 263 184 12 b8043e69c7af9925e3a52500ab26cc743ff5ef5f commit 458 293 196 ... non delta: 311 objects chain length = 1: 194 objects ... .git\objects\pack\pack-SHA....pack: ok 

(este conocimiento y el listdo de ejemplos de arriba tomado de esta página: desempaquetar packages de Git )

Entonces, ¿qué pasa si realmente piensas que tu repository está borroso? Que realmente le faltan files? Bueno, entonces le pedirías a git que verificara la estructura y el contenido de tu repository de git con esto:

 git fsck 

Esto dará como resultado algo como esto:

 $ git fsck Checking object directories: 100% (256/256), done. Checking objects: 100% (890/890), done. 

Tenga en count que si ha borrado twigs, rebasado o ha hecho otros commands de reescritura de historial, probablemente también verá líneas como esta:

 dangling blob f7f7076e53ec9d5a7bde5dcac55af66ea269a5d0 dangling blob f837cd05aa401ba36b1a41a6cc7e7e87c25c0ae3 

Esto es benigno en el sentido de que ya no se hace reference a ninguna twig, label, CABEZA o similar, y eventualmente se eliminará. Si, por otro lado, te faltan confirmaciones, como por ejemplo si borraste una twig, estos hashes podrían devolverte el contenido.