¿Cómo puedo reparar un repository git con un object perdido?

Mi repository de desarrollo en algún momento perdió un object.

$ git fsck fatal: failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8: Invalid argument $ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8 error: unable to find 2dddc84156fa30e4614a7ea5a1895885011b8db8 fatal: git cat-file 2dddc84156fa30e4614a7ea5a1895885011b8db8: bad file 

Un repository recién clonado tiene ese object.

 $ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8 tree 

Me gustaría mantener mi repository de desarrollo, tiene twigs y depósitos desechados.

¿Cómo puedo parchear ese object en mi repository roto?

Lo que puede intentar es get el file .git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8 del repository recién clonado y copyrlo en su repository de desarrollo …

Más o less se networkinguce a esto: ¿tiene una copy de security de ese file (.git / objects / 2d / ddc84156fa30e4614a7ea5a1895885011b8db8) en cualquier lugar? Si puede encontrarlo, cópielo de nuevo a su repository de git y todo estará bien de nuevo. En otras palabras, ¿sabes si el repository ha sido clonado? Si lo tiene, encontrará ese file en la carpeta git del clon y cópielo en el suyo. Si no ha clonado el repository, ¿lo ha comprimido en algún lugar? Si tienes un mac, ¿has marcado la máquina del time? Si no está en un Mac, ¿está utilizando algo para hacer una copy de security de su código?

Básicamente se networkinguce a esto: necesita una copy de security de ese file. Git está diseñado para que cuando esto suceda, solo use la copy de security (que es un clon del repository) para restaurar el file. Dicho esto, el nombre del file se basa en un hash SHA1, por lo que si puede encontrar ese nombre de file en el repository de otra persona, es muy probable que pueda usarlo en su propio 🙂

Por lo general, es una buena práctica clonar siempre sus repositorys en otra location, para mantenerlos seguros en caso de que ocurra algo como esto. Esta es también la razón por la cual services como github y bitbucket son tan populares.

También es probable que desee ver esta pregunta: ¿Cómo recuperar los objects de Git dañados por la falla del disco duro?

Hace poco tuve un montón de objects faltantes en un repository local y un repository de reference no dañado para restaurarlo. Aquí está la magia que se me ocurrió que funcionó para mí:

 cd <path-to-local-repo> git unpack-objects < <reference-repo-path>/objects/pack/pack-<hash>.pack 

Resulta que todos los objects que necesitaba estaban en un file pack en el repository de reference en lugar de files de objects "sueltos" por separado. Este simple encantamiento descomprime el file del package en la database local, completando los agujeros. Después de hacer

 git gc 

para limpiar cualquier commit pendiente (es decir, debido a rebasar, modificar commits, etc.) mi git fsck ahora está limpio.