Tuve una falla en el disco duro que resultó en que algunos archivos de un repositorio de Git se dañaran. Cuando lo ejecuto git fsck --full
, obtengo el siguiente resultado:
error: .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack SHA1 checksum mismatch
error: index CRC mismatch for object 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid code lengths set)
error: cannot unpack 6c8cae4994b5ec7891ccb1527d30634997a978ee from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack at offset 97824129
error: inflate: data stream error (invalid stored block lengths)
error: failed to read object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa at offset 276988017 from .git/objects/pack/pack-6863e0a0e4b4ded6090fac5d12eba6ca7346b19c.pack
fatal: object 0dcf6723cc69cc7f91d4a7432d0f1a1f05e77eaa is corrupted
Tengo copias de seguridad del repositorio, pero la única copia de seguridad que incluye el archivo del paquete ya lo tiene dañado. Entonces creo que tengo que encontrar una manera de recuperar los objetos individuales de diferentes copias de seguridad y de alguna manera instruir a Git para que produzca un nuevo paquete con solo los objetos correctos.
¿Puede darme pistas sobre cómo arreglar mi repositorio?
git
corruption
data-recovery
cristiano
fuente
fuente
.git
carpeta, por supuesto) en el repositorio recién clonado ... y luego lo hicegit status
en el nuevo repositorio ... git detecta correctamente todos los cambios afectados en mis archivos y puedo comenzar mi trabajo nuevamente.Respuestas:
En algunas copias de seguridad anteriores, es posible que los objetos defectuosos se hayan empaquetado en diferentes archivos o que todavía sean objetos sueltos. Para que sus objetos se puedan recuperar.
Parece que hay algunos objetos defectuosos en su base de datos. Así que podrías hacerlo de forma manual.
Debido a
git hash-object
,git mktree
ygit commit-tree
no escriba los objetos porque se encuentran en el paquete, entonces comience a hacer esto:(Sus paquetes se mueven fuera del repositorio y se desempacan nuevamente en él; ahora solo los objetos buenos están en la base de datos)
Tu puedes hacer:
y verifique el tipo de objeto.
Si el tipo es blob: recupere el contenido del archivo de copias de seguridad anteriores (con
git show
ogit cat-file
ogit unpack-file
; entonces puedegit hash-object -w
volver a escribir el objeto en su repositorio actual.Si el tipo es árbol: puede utilizar
git ls-tree
para recuperar el árbol de copias de seguridad anteriores; luego volvergit mktree
a escribirlo en su repositorio actual.Si el tipo es commit: lo mismo con
git show
,git cat-file
ygit commit-tree
.Por supuesto, haría una copia de seguridad de su copia de trabajo original antes de comenzar este proceso.
Además, eche un vistazo a Cómo recuperar un objeto blob dañado .
fuente
.git/objects/pack/
está vacíoBanengusk me estaba poniendo en el camino correcto. Para mayor referencia, quiero publicar los pasos que tomé para corregir la corrupción de mi repositorio. Tuve la suerte de encontrar todos los objetos necesarios en paquetes más antiguos o en las copias de seguridad del repositorio.
fuente
Pruebe los siguientes comandos al principio (vuelva a ejecutarlos si es necesario):
Y luego todavía tienes los problemas, intenta:
eliminar todos los objetos corruptos, por ejemplo
eliminar todos los objetos vacíos, p. ej.
verifique un mensaje de "enlace roto" mediante:
¡Esto le dirá de qué archivo vino el blob corrupto!
para recuperar el archivo, es posible que tenga mucha suerte, y puede ser la versión que ya ha verificado en su árbol de trabajo:
nuevamente, y si genera el SHA1 faltante (4b945 ..) ¡ya está listo!
asumiendo que era una versión anterior que estaba rota, la forma más fácil de hacerlo es hacer:
y eso le mostrará el registro completo para ese archivo (tenga en cuenta que el árbol que tenía puede no ser el árbol de nivel superior, por lo que debe averiguar en qué subdirectorio estaba), entonces ahora puede volver a crear el objeto perdido con objeto hash de nuevo.
para obtener una lista de todas las referencias con confirmaciones, árboles o blobs faltantes:
Puede que no sea posible eliminar algunas de esas referencias utilizando los comandos branch -d o tag -d regulares, ya que morirán si git nota la corrupción. Así que use el comando de plomería git update-ref -d $ ref en su lugar. Tenga en cuenta que en el caso de las ramas locales, este comando puede dejar una configuración obsoleta de la rama en .git / config. Se puede eliminar manualmente (busque la sección [branch "$ ref"]).
Después de que todas las referencias estén limpias, aún puede haber confirmaciones rotas en el reflog. Puede borrar todos los reflogs usando git reflog expire --expire = now --all. Si no desea perder todos sus reflogs, puede buscar los refs individuales para reflogs rotos:
(Tenga en cuenta la opción -g agregada a git rev-list.) Luego, use git reflog expire --expire = now $ ref en cada uno de esos. Cuando desaparezcan todos los refs y reflogs rotos, ejecute git fsck --full para verificar que el repositorio esté limpio. Los objetos colgantes están bien.
A continuación puede encontrar el uso avanzado de comandos que potencialmente pueden causar la pérdida de sus datos en su repositorio de git si no se usan con prudencia, así que haga una copia de seguridad antes de dañar accidentalmente su git. Pruébelo bajo su propio riesgo si sabe lo que está haciendo.
Para tirar de la rama actual en la parte superior de la rama aguas arriba después de buscar:
También puede intentar pagar la nueva rama y eliminar la anterior:
Para encontrar el objeto dañado en git para su eliminación, pruebe el siguiente comando:
Para OSX, use en
sed -E
lugar desed -r
.Otra idea es descomprimir todos los objetos de los archivos del paquete para regenerar todos los objetos dentro de .git / objects, así que intente ejecutar los siguientes comandos dentro de su repositorio:
Si lo anterior no ayuda, puede intentar rsync o copiar los objetos git de otro repositorio, por ejemplo
Para arreglar la rama rota al intentar pagar de la siguiente manera:
Intente eliminarlo y vuelva a realizar el pago desde el origen:
En caso de que git lo lleve a un estado separado, revise
master
y combine en él la rama separada.Otra idea es rebasar el maestro existente de forma recursiva:
Ver también:
fuente
Estos son los pasos que seguí para recuperarme de un objeto blob corrupto.
1) Identificar blob corrupto
El blob dañado es 241091723c324aed77b2d35f97a05e856b319efd
2) Mueva el blob corrupto a un lugar seguro (por si acaso)
3) Obtener padre de blob corrupto
El hash principal es 0716831e1a6c8d3e6b2b541d21c4748cc0ce7180 .
4) Obtener el nombre del archivo correspondiente al blob corrupto
Encuentre este archivo en particular en una copia de seguridad o en el repositorio de git ascendente (en mi caso es dump.tar.gz ). Luego cópielo en algún lugar dentro de su repositorio local.
5) Agregue un archivo previamente dañado en la base de datos de objetos git
6) ¡Celebra!
fuente
git ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: Could not read 19505205fd1f219993da9b75846fff3cf432152d
, y también lo intenté de nuevo sin el paso 2, y eso resultó engit ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: inflate: data stream error (invalid stored block lengths) fatal: failed to read object 19505205fd1f219993da9b75846fff3cf432152d: Invalid argument
Git Checkout puede seleccionar archivos individuales de una revisión. Solo dale el hash de confirmación y el nombre del archivo. Información más detallada aquí.
Supongo que la forma más fácil de solucionar esto de forma segura es volver a la copia de seguridad no comprometida más reciente y luego seleccionar de forma selectiva los archivos no corruptos de las confirmaciones más recientes. ¡Buena suerte!
fuente
Aquí hay dos funciones que pueden ayudar si su copia de seguridad está dañada, o si también tiene algunas copias de seguridad parcialmente dañadas (esto puede suceder si hace una copia de seguridad de los objetos dañados).
Ejecute ambos en el repositorio que está intentando recuperar.
Advertencia estándar: utilícelo solo si está realmente desesperado y ha realizado una copia de seguridad de su repositorio (dañado). Es posible que esto no resuelva nada, pero al menos debería resaltar el nivel de corrupción.
y
fuente
Resolví este problema para agregar algunos cambios como git add -A y git commit nuevamente.
fuente