J'ai eu une panne de disque dur qui a entraîné l'endommagement de certains fichiers d'un référentiel Git. Lors de l'exécution, git fsck --full
j'obtiens la sortie suivante:
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
J'ai des sauvegardes du référentiel, mais la seule sauvegarde qui inclut le fichier du pack l'a déjà endommagé. Je pense donc que je dois trouver un moyen de récupérer les objets uniques à partir de différentes sauvegardes et demander à Git de produire un nouveau pack avec uniquement les objets corrects.
Pouvez-vous s'il vous plaît me donner des conseils sur la façon de réparer mon référentiel?
git
corruption
data-recovery
Christian
la source
la source
.git
dossier bien sûr) dans le référentiel fraîchement cloné ... et ensuite faitgit status
dans le nouveau dépôt ... git détecte correctement toutes les modifications affectées à mes fichiers et je peux recommencer mon travail.Réponses:
Dans certaines sauvegardes précédentes, vos objets défectueux peuvent avoir été compressés dans différents fichiers ou être encore des objets lâches. Ainsi, vos objets peuvent être récupérés.
Il semble qu'il y ait quelques objets défectueux dans votre base de données. Vous pouvez donc le faire manuellement.
À cause de
git hash-object
,git mktree
etgit commit-tree
n'écrivez pas les objets car ils se trouvent dans le pack, alors commencez à faire ceci:(Vos packs sont sortis du référentiel et décompressés à nouveau dans celui-ci; seuls les bons objets sont maintenant dans la base de données)
Tu peux faire:
et vérifiez le type de l'objet.
Si le type est blob: récupérez le contenu du fichier à partir des sauvegardes précédentes (avec
git show
ougit cat-file
ougit unpack-file
; alors vous pouvezgit hash-object -w
réécrire l'objet dans votre référentiel actuel.Si le type est tree: vous pouvez utiliser
git ls-tree
pour récupérer l'arborescence des sauvegardes précédentes; puisgit mktree
pour le réécrire dans votre référentiel actuel.Si le type est commit: la même chose avec
git show
,git cat-file
etgit commit-tree
.Bien sûr, je sauvegarderais votre copie de travail originale avant de commencer ce processus.
Jetez également un œil à Comment récupérer un objet blob corrompu .
la source
.git/objects/pack/
Banengusk me mettait sur la bonne voie. Pour plus d'informations, je souhaite publier les étapes que j'ai suivies pour corriger la corruption de mon référentiel. J'ai eu la chance de trouver tous les objets nécessaires soit dans des packs plus anciens, soit dans des sauvegardes de référentiel.
la source
Essayez d'abord les commandes suivantes (réexécutez si nécessaire):
Et puis vous avez encore des problèmes, essayez de:
supprimer tous les objets corrompus, par exemple
supprimer tous les objets vides, par ex.
vérifier un message "lien rompu" en:
Cela vous indiquera de quel fichier le blob corrompu provient!
pour récupérer le fichier, vous pourriez être vraiment chanceux, et c'est peut-être la version que vous avez déjà extraite dans votre arbre de travail:
encore une fois, et s'il sort le SHA1 manquant (4b945 ..) vous avez maintenant terminé!
en supposant que c'était une ancienne version qui était cassée, le moyen le plus simple de le faire est de faire:
et cela vous montrera tout le journal de ce fichier (veuillez vous rendre compte que l'arborescence que vous aviez n'est peut-être pas l'arborescence de niveau supérieur, vous devez donc déterminer vous-même dans quel sous-répertoire il se trouvait), alors vous pouvez maintenant recréer le objet manquant avec objet de hachage à nouveau.
pour obtenir une liste de toutes les références avec des commits, des arbres ou des blobs manquants:
Il peut ne pas être possible de supprimer certaines de ces références en utilisant les commandes branch -d ou tag -d normales, car elles mourront si git remarque la corruption. Utilisez donc la commande de plomberie git update-ref -d $ ref à la place. Notez que dans le cas de branches locales, cette commande peut laisser la configuration de branche périmée dans .git / config. Il peut être supprimé manuellement (recherchez la section [branche "$ ref"]).
Une fois que toutes les références sont propres, il peut encore y avoir des commits interrompus dans le reflog. Vous pouvez effacer tous les reflogs en utilisant git reflog expire --expire = now --all. Si vous ne voulez pas perdre tous vos reflogs, vous pouvez rechercher les refs individuels pour les reflogs cassés:
(Notez l'option -g ajoutée à git rev-list.) Ensuite, utilisez git reflog expire --expire = now $ ref sur chacun d'entre eux. Lorsque toutes les références et reflogs cassés ont disparu, exécutez git fsck --full afin de vérifier que le référentiel est propre. Les objets pendantes sont ok.
Vous trouverez ci-dessous une utilisation avancée des commandes qui peuvent potentiellement entraîner la perte de vos données dans votre référentiel git si elles ne sont pas utilisées à bon escient, alors faites une sauvegarde avant de causer accidentellement d'autres dommages à votre git. Essayez à vos risques et périls si vous savez ce que vous faites.
Pour extraire la branche actuelle au-dessus de la branche amont après l'extraction:
Vous pouvez également essayer de retirer une nouvelle branche et de supprimer l'ancienne:
Pour trouver l'objet corrompu dans git à supprimer, essayez la commande suivante:
Pour OSX, utilisez à la
sed -E
place desed -r
.Une autre idée est de décompresser tous les objets des fichiers de pack pour régénérer tous les objets dans .git / objects, alors essayez d'exécuter les commandes suivantes dans votre référentiel:
Si ci-dessus ne vous aide pas, vous pouvez essayer de rsync ou de copier les objets git d'un autre dépôt, par exemple
Pour réparer la branche cassée lors de la tentative de paiement, procédez comme suit:
Essayez de le supprimer et de procéder à nouveau au paiement en amont:
Dans le cas où git vous mettrait dans l'état détaché, vérifiez le
master
et fusionnez-y la branche détachée.Une autre idée est de rebaser le maître existant de manière récursive:
Voir également:
la source
Voici les étapes que j'ai suivies pour récupérer à partir d'un objet blob corrompu.
1) Identifiez le blob corrompu
Le blob corrompu est 241091723c324aed77b2d35f97a05e856b319efd
2) Déplacez le blob corrompu vers un endroit sûr (juste au cas où)
3) Obtenir le parent du blob corrompu
Le hachage parent est 0716831e1a6c8d3e6b2b541d21c4748cc0ce7180 .
4) Obtenez le nom de fichier correspondant à l'objet blob corrompu
Trouvez ce fichier particulier dans une sauvegarde ou dans le référentiel git en amont (dans mon cas, il s'agit de dump.tar.gz ). Puis copiez-le quelque part dans votre référentiel local.
5) Ajouter un fichier précédemment corrompu dans la base de données d'objets git
6) Célébrez!
la source
git ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: Could not read 19505205fd1f219993da9b75846fff3cf432152d
, et j'ai aussi essayé à nouveau sans l'étape 2, et cela a abouti àgit ls-tree 9504a07fb803edfdf0c1dd99c5d561274af87982 error: inflate: data stream error (invalid stored block lengths) fatal: failed to read object 19505205fd1f219993da9b75846fff3cf432152d: Invalid argument
Git checkout peut en fait sélectionner des fichiers individuels à partir d'une révision. Donnez-lui simplement le hachage de validation et le nom du fichier. Plus d'informations détaillées ici.
Je suppose que le moyen le plus simple de résoudre ce problème en toute sécurité est de revenir à la dernière sauvegarde non validée, puis de sélectionner sélectivement les fichiers non corrompus à partir de nouveaux commits. Bonne chance!
la source
Voici deux fonctions qui peuvent vous aider si votre sauvegarde est corrompue ou si vous avez également quelques sauvegardes partiellement corrompues (cela peut se produire si vous sauvegardez les objets corrompus).
Exécutez les deux dans le dépôt que vous essayez de récupérer.
Avertissement standard: à n'utiliser que si vous êtes vraiment désespéré et que vous avez sauvegardé votre dépôt (corrompu). Cela pourrait ne rien résoudre, mais au moins devrait mettre en évidence le niveau de corruption.
et
la source
J'ai résolu ce problème pour ajouter des changements comme git add -A et git commit à nouveau.
la source