¿Cómo aprieto mis objects?

Cuando trato de usar Sourcetree obtengo:

git -c diff.mnemonicprefix=false -c core.quotepath=false fetch origin error: inflate: data stream error (unknown compression method) fatal: loose object 982fcbfe3c97cec4319853db4e32bd77f72ae0bf (stonetworking in .git/objects/98/2fcbfe3c97cec4319853db4e32bd77f72ae0bf) is corrupt fatal: index-pack failed 

Recibí este post previamente con una cadena aleatoria diferente de letras / numbers, y decidí eliminar ese file específico y luego obtuve este. Por lo tanto, supongo que si borro, hago pull, delete, pull etc. eventualmente eliminaré todos los errores y podré extraerlos.

¿Hay alguna forma de corregir todos estos errores a la vez? es decir. apriete estos objects para que no produzcan un "error de object suelto".

¿Por qué estoy obteniendo esto? ¿Qué significa realmente ser un object suelto? ¿Cuál es la causa probable de esto (es decir, qué hice mal para get esto) y cómo puedo evitar esto en el futuro?

Editar: parece que mi suposition era errónea, después de eliminar varios de estos files y tratar de extraer nuevamente, obtengo Fatal: pack has 88 unresolved deltas . fatal: index-pack failed . Nota: en realidad, no borré los files que acabo de mover, si aún se necesitan.

El problema no es que los objects estén sueltos ( son "sueltos", sino que su opuesto está "embalado", no "apretado") sino que están dañados (o, una vez que los extrae, faltan por completo).

Los nombres que parecen 982fcbfe3c97cec4319853db4e32bd77f72ae0bf como 982fcbfe3c97cec4319853db4e32bd77f72ae0bf son de hecho SHA-1 ID, que son los "nombres verdaderos" de los objects, calculados por el código de sum de comprobación SHA-1 de git (que opera en el encabezado git seguido de los datos descomprimidos). Como SHA-1 es una sum de comprobación criptográfica, el nombre mismo valida los datos: al abrir el file, descomprimirlo y ejecutar la sum de comprobación sobre los datos resultantes debería producirse el mismo SHA-1.

No lo es, y esto significa que el nombre es incorrecto o que los datos almacenados se han dañado. Así es como git detecta automáticamente el daño (bueno, una de las forms, pero todas están basadas en la misma idea de sum de comprobación SHA-1).

Esto a su vez significa que cualquier medio de almacenamiento (disco local, SSD, almacenamiento en la nube o lo que sea que esté usando) está defectuoso: no está almacenando sus files correctamente. Tendrá que lidiar con esto primero, luego continúe y arregle su repository (normalmente restaurando una copy de security o clonando una copy desde algún lugar que todavía tenga una buena versión).

Tema al lado: ¿qué es exactamente un "object suelto"?

Un repository git es solo una database "almacén de objects" con algo de pegamento especial.

Un object, en git, es uno de los cuatro types de files: commit, tree, blob (file), o tag (label anotada).

Inicialmente, cada object se almacena por separado, en un file cuyo nombre coincide con la sum de comprobación SHA-1 del object, que git usa como nombre del object. Para recuperar algo de la database, necesita este nombre; le da esto al código de la tienda de objects y extrae los datos asociados (descomprimiendo si es necesario).

Incluso comprimidos, sin embargo, los objects pueden ocupar mucho espacio en disco, y muchos objects, como los files fuente, son similares a otras versiones del mismo object. Por lo tanto, para ahorrar más espacio en disco, git puede "empaquetar" un set de objects en un "file de package". Dentro de un file pack, git comprime estos objects uno contra otro (esta es la "compression delta" que se ve de vez en cuando). El file de package resultante tiene su propio nombre SHA-1, y git mantiene un índice de todos los ID de SHA-1 de todos los objects almacenados en él. Si le pide al object-extractor del repository un object, primero busca un object suelto; si no se encuentra, comtesting los packages (a través de su índice) y los extrae de allí.