2011-09-08 28 views
11

Estoy ejecutando git 1.6.4.2. La recolección de basura está fallando diciendo "error: no se puede encontrar <SHA1>".Git - cómo recuperarse de un blob perdido

He logrado determinar que el objeto que falta es un blob, y no hay forma de que pueda recuperar el blob. Parece que 2 scripts que ejecutan "git add" y "git commit" se estaban ejecutando al mismo tiempo y se las arreglaron para interferir entre sí, de modo que uno cometió una versión más nueva de un archivo que el otro, y el blob de la versión anterior desapareció.

Entonces, lo que estoy tratando de hacer ahora es retrotraer mi repositorio para sacar la confirmación que se refiere al árbol que se refiere al blob que falta.

Sé en qué rama estaba la confirmación, así que ejecuté "git reset" para rebobinar al padre de la confirmación duff. Y sé que la sucursal se fusionó en otro lugar, así que reescribí esa sucursal también. Hasta donde yo sé, duff commit/tree/blob no son referenciados por nada. Pero si ejecuto git prune --expire = ahora seguido de git gc, entonces sigo recibiendo un error sobre el objeto faltante.

Así que mi pregunta es esta: ¿cómo puedo consultar la base de datos de git para encontrar cada objeto de árbol que contiene la id del blob duff? ¿Y cómo puedo averiguar qué está causando que git prune lo retenga?

Tricky !!

Gracias Kevin

+0

¿Has probado 'git fsck'? http://book.git-scm.com/4_maintaining_git.html –

+0

No estoy seguro de entender lo que sucedió. ¿Puedes reportar lo que dice 'git fsck'? –

+1

Después de un poco más de excavación resulta que mi pregunta es respondida aquí: http://stackoverflow.com/questions/7201720/how-to-delete-a-blob-from-git-repo git prune no era podando las cosas que había recuperado porque el reflog todavía se estaba refiriendo a él - git reflog expire --exires = now --todo arreglado que y la publicación referenciada proporciona un mecanismo para ejecutar git lstree en cada confirmación para encontrar el referido blob – kbro

Respuesta

11

Después de un poco más de excavación resulta que mi pregunta es contestada aquí: How to delete a blob from git repo - git prune no estaba podando las cosas que me hiero atrás porque la reflog todavía se refería a ella. Ejecutando

git reflog expire --expire=now --all 

solucionó eso. Además, la publicación referenciada proporciona un mecanismo para ejecutar git lstree en cada confirmación para encontrar el blob al que se hace referencia.

+5

Tal vez 'git reflog expire --expire = now --all', not' --exires = now'? –

1

que tenían el mismo problema (falta de blob) y la solución con

git reflog expire --expire=now --all 

no hacer el truco. encontré mi solución aquí: https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F

Esta simple línea de

git hash-object -w <file> 

fija la burbuja faltante.

Espero que esto ayude.

+0

'git hash-object -w ' le permite volver a insertar un archivo perdido en el repositorio. Esto es diametralmente opuesto a mi problema. Quería eliminar un archivo duff del repositorio, y 'git prune' no lo estaba haciendo porque el reflog todavía apuntaba a él. – kbro

Cuestiones relacionadas