604 votes

Comment puis-je réparer l'erreur Git "le fichier objet ... est vide"?

Lorsque j'essaie de valider les modifications, je reçois cette erreur :

erreur : le fichier objet .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 est vide
fatal: l'objet lâche 3165329bb680e30595f242b7c4d8406ca63eeab0 (stocké dans .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) est corrompu

J'ai essayé git fsck et j'ai reçu :

erreur : le fichier objet .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 est vide
fatal: l'objet lâche 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stocké dans .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) est corrompu

Comment puis-je résoudre cette erreur ?

0 votes

Avez-vous tué de force une opération git add ? Votre disque dur est-il plein ?

0 votes

Non, mon disque dur n'est pas plein, je ne me souviens pas avoir arrêté de force une opération git add, et si je l'ai fait ? Comment puis-je résoudre cela ?

0 votes

Non, l'erreur est toujours là ...

1131voto

Nathan VanHoudnos Points 2919

J'ai eu un problème similaire. Mon ordinateur portable s'est éteint pendant une opération Git. Bouh.

Je n'avais pas de sauvegardes. (N.B. Ubuntu One n'est pas une solution de sauvegarde pour Git ; cela écrasera votre référentiel sain avec celui corrompu.)

Aux magiciens de Git, si c'était une mauvaise façon de le réparer, veuillez laisser un commentaire. Cela a cependant fonctionné pour moi... au moins temporairement.

Étape 1 : Faites une sauvegarde du dossier .git (en fait, je le fais entre chaque étape qui modifie quelque chose, mais avec un nouveau nom de copie, par exemple, .git-old-1, .git-old-2, etc.) :

cd ~/workspace/mcmc-chapter
cp -a .git .git-old

Étape 2 : Exécutez git fsck --full

git fsck --full

erreur : le fichier objet .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e est vide
fatal : l'objet non connecté 8b61d0135d3195966b443f6c73fb68466264c68e (stocké dans .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e) est corrompu

Étape 3 : Supprimez le fichier vide. Je me suis dit pourquoi pas ; de toute façon, il est vide.

rm .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e

rm: supprimer le fichier vide régulier protégé en écriture `.git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e' ? o

Étape 3 : Exécutez à nouveau git fsck. Continuez à supprimer les fichiers vides. Vous pouvez également cd dans le répertoire .git et exécuter find . -type f -empty -delete -print pour supprimer tous les fichiers vides. À un moment donné, Git a commencé à me dire qu'il faisait réellement quelque chose avec les répertoires d'objets:

git fsck --full

Vérification des répertoires d'objet : 100% (256/256), terminé.
erreur : le fichier objet .git/objects/e0/cbccee33aea970f4887194047141f79a363636 est vide
fatal : l'objet non connecté e0cbccee33aea970f4887194047141f79a363636 (stocké dans .git/objects/e0/cbccee33aea970f4887194047141f79a363636) est corrompu

Étape 4 : Après avoir supprimé tous les fichiers vides, j'en suis finalement arrivé à ce que git fsck fonctionne réellement :

git fsck --full

Vérification des répertoires d'objet : 100% (256/256), terminé.
erreur : HEAD : pointeur sha1 invalide af9fc0c5939eee40f6be2ed66381d74ec2be895f
erreur : refs/heads/master ne pointe pas vers un objet valide !
erreur : refs/heads/master.u1conflict ne pointe pas vers un objet valide !
erreur : 0e31469d372551bb2f51a186fa32795e39f94d5c : pointeur sha1 invalide dans l'arborescence de cache
blob pendants 03511c9868b5dbac4ef1343956776ac508c7c2a2
blob manquant 8b61d0135d3195966b443f6c73fb68466264c68e
blob manquant e89896b1282fbae6cf046bf21b62dd275aaa32f4
blob pendants dd09f7f1f033632b7ef90876d6802f5b5fede79a
blob manquant caab8e3d18f2b8c8947f79af7885cdeeeae192fd
blob manquant e4cf65ddf80338d50ecd4abcf1caf1de3127c229

Étape 5 : Essayez git reflog. Échec car mon HEAD est corrompu.

git reflog

fatal : mauvais objet HEAD

Étape 6 : Recherche sur Google. Trouvez ceci. Obtenez manuellement les deux dernières lignes du reflog :

tail -n 2 .git/logs/refs/heads/master

f2d4c4868ec7719317a8fce9dc18c4f2e00ede04 9f0abf890b113a287e10d56b66dbab66adc1662d Nathan VanHoudnos  1347306977 -0400    commit: up to p. 24, including correcting spelling of my name
9f0abf890b113a287e10d56b66dbab66adc1662d af9fc0c5939eee40f6be2ed66381d74ec2be895f Nathan VanHoudnos  1347358589 -0400    commit: fixed up to page 28

Étape 7 : Notez qu'à partir de l'étape 6, nous avons appris que la HEAD pointe actuellement vers le tout dernier commit. Alors essayons simplement de regarder le commit parent :

git show 9f0abf890b113a287e10d56b66dbab66adc1662d

commit 9f0abf890b113a287e10d56b66dbab66adc1662d
Author: Nathan VanHoudnos 
Date:   Mon Sep 10 15:56:17 2012 -0400

    up to p. 24, including correcting spelling of my name

diff --git a/tex/MCMC-in-IRT.tex b/tex/MCMC-in-IRT.tex
index 86e67a1..b860686 100644
--- a/tex/MCMC-in-IRT.tex
+++ b/tex/MCMC-in-IRT.tex

Cela a fonctionné !

Étape 8 : Maintenant, nous devons pointer HEAD vers 9f0abf890b113a287e10d56b66dbab66adc1662d.

git update-ref HEAD 9f0abf890b113a287e10d56b66dbab66adc1662d

Qui n'a pas râlé.

Étape 9 : Voyons ce que fsck dit :

git fsck --full

Vérification des répertoires d'objet : 100% (256/256), terminé.
erreur : refs/heads/master.u1conflict ne pointe pas vers un objet valide !
erreur : 0e31469d372551bb2f51a186fa32795e39f94d5c : pointeur sha1 invalide dans l'arborescence de cache
blob pendants 03511c9868b5dbac4ef1343956776ac508c7c2a2
blob manquant 8b61d0135d3195966b443f6c73fb68466264c68e
blob manquant e89896b1282fbae6cf046bf21b62dd275aaa32f4
blob pendants dd09f7f1f033632b7ef90876d6802f5b5fede79a
blob manquant caab8e3d18f2b8c8947f79af7885cdeeeae192fd
blob manquant e4cf65ddf80338d50ecd4abcf1caf1de3127c229

Étape 10 : Le pointeur sha1 invalide dans l'arborescence de cache semblait provenir d'un fichier d'index (maintenant obsolète) (source). Donc je l'ai supprimé et j'ai réinitialisé le dépôt.

rm .git/index
git reset

Changements non mis en scène après la réinitialisation :
M    tex/MCMC-in-IRT.tex
M    tex/recipe-example/build-example-plots.R
M    tex/recipe-example/build-failure-plots.R

Étape 11 : En regardant à nouveau fsck...

git fsck --full

Vérification des répertoires d'objet : 100% (256/256), terminé.
erreur : refs/heads/master.u1conflict ne pointe pas vers un objet valide !
blob pendants 03511c9868b5dbac4ef1343956776ac508c7c2a2
blob pendants dd09f7f1f033632b7ef90876d6802f5b5fede79a

Les blobs pendants ne sont pas des erreurs. Je ne suis pas préoccupé par master.u1conflict, et maintenant que ça fonctionne, je ne veux plus y toucher !

Étape 12 : Rattraper mes modifications locales :

git status

# Sur la branche master
# Modifications non validées pour le commit :
#   (utilisez "git add ..." pour mettre à jour ce qui sera validé)
#   (utilisez "git checkout -- ..." pour annuler les modifications dans le répertoire de travail)
#
#    modifié :   tex/MCMC-in-IRT.tex
#    modifié :   tex/recipe-example/build-example-plots.R
#    modifié :   tex/recipe-example/build-failure-plots.R
#
< ... snip ... >
aucune modification ajoutée au commit (utilisez "git add" et/ou "git commit -a")

git commit -a -m "récupération du fiasco git"

[master 7922876] récupération du fiasco git
 3 fichiers modifiés, 12 insertions(+), 94 suppressions(-)

git add tex/sept2012_code/example-code-testing.R
git commit -a -m "ajout du code d'exemple"

[master 385c023] ajout du code d'exemple
 1 fichier modifié, 331 insertions(+)
 création du mode 100644 tex/sept2012_code/example-code-testing.R

108 votes

Excellente réponse, avec toutes les étapes et tout. Je suppose que tu m'as épargné de chercher chaque chose sur Google !

37 votes

A fonctionné comme un charme! J'aurais aimé pouvoir voter pour cela plusieurs fois ;)

1 votes

Hmm, mon ordinateur portable s'est éteint pendant une opération git (SparkleShare essayait de valider mes notes alors qu'il se fermait) et après cela, le dépôt a été corrompu de cette manière. J'ai suivi vos étapes jusqu'à6 mais il semble que les derniers commits étaient censés faire partie des fichiers d'objets vides que j'ai supprimés ? En fait, les 3 derniers commits étaient complètement corrompus, donc je suppose qu'il n'y avait rien que je puisse faire. Heureusement, je n'ai pas vraiment besoin des commits individuels de SparkleShare et je peux simplement copier le fichier corrompu d'une machine à une autre et le fusionner.

37voto

Simone Gianni Points 4009

J'ai résolu ce problème en supprimant les différents fichiers vides que git fsck détectait, puis en lançant une simple commande Git pull.

Je trouve décevant que même maintenant que les systèmes de fichiers implémentent le journaling et d'autres techniques "transactionnelles" pour maintenir la cohérence du système de fichiers, Git puisse se retrouver dans un état corrompu (et ne pas pouvoir récupérer de lui-même) à cause d'une panne de courant ou d'un manque d'espace sur le dispositif.

3 votes

Je suis sûr que la réponse ci-dessus est techniquement meilleure, mais elle a cessé de fonctionner à l'étape 6 et était bien au-dessus de mes compétences techniques. L'approche expédiente est git pull

2 votes

J'ai rencontré une situation où, après avoir effectué les étapes 1-11 des instructions de la réponse de Nathan (qui a très bien fonctionné!), j'ai rencontré une erreur disant que refs/origin/master et refs/origin/head n'étaient pas définis (ou quelque chose comme ça). git pull a corrigé cela. Donc je pense que les deux solutions fonctionnent ensemble.

2 votes

Je suis conscient que les systèmes de fichiers utilisés journalisent normalement uniquement les métadonnées. Vous pouvez activer le journaling également pour les données, mais je suppose que ce n'est pas la valeur par défaut en raison des coûts supplémentaires. C'est probablement pourquoi les fichiers étaient vides.... et les systèmes de fichiers observent généralement les transactions par fichier, alors que git a plusieurs fichiers modifiés par transaction, donc même si le système de fichiers maintient la cohérence par fichier, si git ne le fait pas, alors je suppose que git aboutira à des états incohérents...

11voto

Nicolas Points 31

Je viens juste d'avoir le même problème : après avoir tiré le dépôt distant, lorsque j'ai fait un git status, j'ai obtenu :

"erreur: le fichier objet (...) est vide"
"fatal: l'objet détaché (...) est corrompu"

La façon dont j'ai résolu cela était de :

  1. git stash
  2. supprimer le fichier Git en erreur (je ne suis pas sûr que cela était nécessaire)
  3. git stash clear

Je ne sais pas exactement ce qui s'est passé, mais ces instructions semblaient tout nettoyer.

4 votes

J'aime toujours les réponses plus simples :) Pour l'étape 2, j'ai utilisé la commande fournie dans la réponse de @Nathan VanHoudnos : cd .git/ && find . -type f -empty -delete

7voto

seg.fault Points 86

J'ai rencontré un problème similaire avec GIT. Même si la réponse fournie par @Nathan-Vanhoudnos est excellente, j'ai trouvé que la solution fournie ici est plus facile à appliquer et fonctionne également.

6voto

cyberfranco Points 1
  1. Déplacez votre dossier d'application pour en faire une sauvegarde, c'est-à-dire mv app_folder app_folder_bk (c'est comme un git stash)
  2. git clone your_repository
  3. Enfin, ouvrez un outil de fusion (j'utilise le visualiseur de différences Meld sur Linux ou WinMerge sur Windows) et copiez les modifications de droite (app_folder_bk) vers la gauche (nouveau app_folder) (c'est comme un git stash apply).

C'est tout. Peut-être que ce n'est pas la meilleure façon, mais je trouve que c'est pratique.

1 votes

Ceci est ce que vous devriez faire lorsque vous avez toutes les modifications locales poussées vers un amont, ou que les modifications sont minimes, donc le clonage est plus rapide que la récupération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X