Lorsque j'essaie de valider les modifications, j'obtiens cette erreur:
error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt
Une idée comment résoudre cette erreur?
ÉDITER
J'ai essayé git fsck
j'ai:
error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt
git add
opération? Votre disque dur est-il plein?git fsck
sont occupées.Réponses:
J'avais un problème similaire. Mon ordinateur portable a manqué de batterie pendant une opération git. Huer.
Je n'ai eu aucune sauvegarde. (NB Ubuntu One n'est pas une solution de sauvegarde pour git; il écrasera utilement votre référentiel sain avec celui corrompu.)
Aux assistants 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 de .git (en fait, je le fais entre chaque étape qui change quelque chose, mais avec un nouveau nom de copie, par exemple .git-old-1, .git-old-2, etc.) :
Étape 2: exécuter
git fsck --full
Étape 3: supprimez le fichier vide. J'ai compris ce que diable; son blanc de toute façon.
Étape 3: exécutez à
git fsck
nouveau. Continuez à supprimer les fichiers vides. Vous pouvez égalementcd
dans le.git
répertoire et exécuterfind . -type f -empty -delete -print
pour supprimer tous les fichiers vides. Finalement, git a commencé à me dire qu'il faisait en fait quelque chose avec les répertoires d'objets:Étape 4: Après avoir supprimé tous les fichiers vides, j'ai fini par
git fsck
exécuter:Étape 5: essayez
git reflog
. Échec car ma tête est cassée.Étape 6: Google. Trouvez ça . Obtenez manuellement les deux dernières lignes du reflog:
Étape 7: Notez qu'à partir de l'étape 6, nous avons appris que le HEAD pointe actuellement vers le tout dernier commit. Essayons donc de regarder le commit parent:
Ça a marché!
Étape 8: Nous devons maintenant pointer HEAD sur 9f0abf890b113a287e10d56b66dbab66adc1662d.
Qui ne s'est pas plaint.
Étape 9: voir ce que fsck dit:
Étape 10: Le pointeur sha1 non valide dans l'arborescence du cache semblait provenir d'un fichier d'index (désormais obsolète) ( source ). Je l'ai donc tué et réinitialisé le dépôt.
Étape 11: nouveau regard sur le fsck ...
Les blobs pendants ne sont pas des erreurs . Je ne suis pas concerné par master.u1conflict, et maintenant qu'il fonctionne, je ne veux plus y toucher!
Étape 12: rattraper mes modifications locales:
J'espère donc que cela pourra être utile aux gens à l'avenir. Je suis content que ça ait marché.
la source
Les fichiers objets git sont devenus corrompus (comme indiqué dans d'autres réponses également). Cela peut se produire lors de pannes de machines, etc.
J'avais la même chose. Après avoir lu les autres principales réponses ici, j'ai trouvé le moyen le plus rapide de corriger le référentiel git cassé avec les commandes suivantes (exécutez dans le répertoire de travail git qui contient le
.git
dossier):Cela supprimera d' abord tous les fichiers d'objets vides qui provoquent la corruption du référentiel dans son ensemble, puis récupérera les objets manquants (ainsi que les dernières modifications) du référentiel distant, puis effectuera une vérification complète du magasin d'objets . Ce qui, à ce stade, devrait réussir sans erreur (il peut cependant y avoir quelques avertissements!)
la source
Cette erreur m'arrive lorsque je pousse mon commit et que mon ordinateur se bloque. Voilà comment je l'ai corrigé.
Étapes à suivre
afficher le fichier objet vide / corrompu
le retirer
J'ai un
fatal: bad object HEAD
messageJe supprime le
index
pour la réinitialisationfatal: impossible d'analyser l'objet 'HEAD'.
juste pour vérifier ce qui se passe
imprime les 2 dernières lignes
tail -n 2
de la branche du journal pour afficher mes 2 dernièrescommit hash
Je choisis le dernier
commit hash
montre tout mon fichier comme
deleted
parce que j'ai supprimé le.git/index
fichiercontinuer la réinitialisation
vérifier ma correction
Remarque: Les étapes commencent lorsque j'ai atterri sur cette question et utilisé les réponses comme référence.
la source
J'ai résolu cela en supprimant les divers fichiers vides que git fsck détectait, puis en exécutant un simple pull git.
Je trouve décevant que maintenant que même les systèmes de fichiers implémentent la journalisation et d'autres techniques "transactionnelles" pour garder le fs sain d'esprit, git puisse atteindre un état corrompu (et ne pas être en mesure de récupérer par lui-même) en raison d'une panne de courant ou de l'espace sur l'appareil.
la source
J'ai juste eu le même problème: après avoir tiré le référentiel distant, quand j'ai fait un état git, j'ai eu: "erreur: le fichier objet (...) est vide" "fatal: l'objet lâche (...) est corrompu"
La façon dont j'ai résolu cela était de:
Je ne sais pas exactement ce qui s'est passé, mais ces instructions semblaient tout nettoyer.
la source
cd .git/ && find . -type f -empty -delete
Parce que je dois redémarrer régulièrement ma machine virtuelle, donc ce problème m'arrive très souvent. Après quelques fois, j'ai réalisé que je ne pouvais pas répéter le processus décrit par @ Nathan-Vanhoudnos à chaque fois que cela se produisait, bien que cela fonctionne toujours. Ensuite, j'ai trouvé la solution plus rapide suivante.
Étape 1
Déplacez votre référentiel entier vers un autre dossier.
Étape 2
Clonez à nouveau le dépôt d'origine.
Étape 3
Supprimez tout sous le nouveau référentiel à l'exception du dossier .git .
Étape 4
Déplacez tout du temp_repo vers le nouveau dépôt sauf le dossier .git .
Étape 5
Supprimer le temp_repo , et nous avons terminé.
Après quelques fois, je suis sûr que vous pouvez effectuer ces procédures très rapidement.
la source
git clone source_to_current_repo.git clean_repo
, 2) sauvegardez l'ancien dossier .git, 3) copiez-le dans le dossier .git propre.C'est tout. Ce n'est peut-être pas le meilleur moyen, mais je pense que c'est tellement pratique.
la source
Dans mon cas, cette erreur s'est produite car je tapais le message de validation et mon bloc-notes s'est éteint.
J'ai fait ces étapes pour corriger l'erreur:
git checkout -b backup-branch
# Créer une branche de sauvegardegit reset --hard HEAD~4
# Réinitialisez le commit où tout fonctionne bien. Dans mon cas, j'ai dû sauvegarder 4 validations dans la tête, c'est-à-dire jusqu'à ce que ma tête soit au point avant de taper le message de validation.Avant de faire cette étape, copiez le hachage des commits que vous allez réinitialiser, dans mon cas j'ai copié le hachage des 4 derniers commitsgit cherry-pick <commit-hash>
# Cherry sélectionne les commits réinitialisés (dans mon cas, il y a 4 commits, j'ai donc fait cette étape 4 fois) de l'ancienne branche vers la nouvelle branche.git push origin backup-branch
# Poussez la nouvelle branche pour être sûr que tout fonctionne biengit branch -D your-branch
# Supprimez la branche localement ('votre-branche' est la branche à problème)git push origin :your-branch
# Supprimer la branche de la télécommandegit branch -m backup-branch your-branch
# Renommez la branche de sauvegarde pour avoir le nom de la branche qui a rencontré le problèmegit push origin your-branch
# Poussez la nouvelle branchegit push origin :backup-branch
# Supprimer la branche de sauvegarde de la télécommandela source
résoudre mon problème
la source
git status
car certains sont vides.Voici un moyen très simple et rapide de résoudre ce problème SI vous avez un référentiel local avec toutes les branches et les commits dont vous avez besoin, et si vous êtes d'accord pour créer un nouveau référentiel (ou supprimer le référentiel du serveur et en créer un nouveau) à sa place):
Cela préserve tout l'historique des validations et les branches que vous aviez dans votre référentiel local.
Si vous avez des collaborateurs sur le référentiel, je pense que dans de nombreux cas, tous vos collaborateurs doivent également modifier l'URL distante de leur référentiel local, et éventuellement pousser tous les commits qu'ils ont que le serveur n'a pas.
Cette solution a fonctionné pour moi lorsque j'ai rencontré ce même problème. J'avais un collaborateur. Après avoir transféré mon référentiel local vers le nouveau référentiel distant, il a simplement changé son référentiel local pour pointer vers l'URL du référentiel distant et tout a bien fonctionné.
la source
J'ai eu le même problème après le crash de mon ordinateur portable. Probablement parce que c'était un grand référentiel, j'avais pas mal de fichiers objets corrompus, qui n'apparaissaient qu'un par un lors de l'appel
git fsck --full
, j'ai donc écrit un petit shell one-liner pour supprimer automatiquement l'un d'eux:$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`
2>&1
redirige le message d'erreur vers stdout pour pouvoir le récupérer-o
renvoie uniquement la partie d'une ligne qui correspond réellement-E
permet des expressions rationnelles avancées-m 1
assurez-vous que seule la première correspondance est renvoyée[0-9a-f]{2}
correspond à l'un des caractères compris entre 0 et 9 et a et f si deux d'entre eux se produisent ensemble[0-9a-f]*
correspond à n'importe quel nombre de caractères compris entre 0 et 9 et a et f apparaissant ensembleIl ne supprime toujours qu'un fichier à la fois, vous pouvez donc l'appeler dans une boucle comme:
$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done
Le problème avec cela est qu'il ne produit plus rien d'utile, donc vous ne savez pas quand il est terminé (il ne devrait tout simplement pas faire quoi que ce soit d'utile après un certain temps)
Pour "corriger" cela, j'ai simplement ajouté un appel
git fsck --full
après chaque tour comme ceci:$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done
Il est maintenant environ deux fois moins rapide, mais il affiche son "état".
Après cela, j'ai joué avec les suggestions de ce fil et j'ai finalement atteint un point où je pouvais
git stash
etgit stash drop
beaucoup de choses cassées.premier problème résolu
Par la suite, j'ai toujours eu le problème suivant:
unable to resolve reference 'refs/remotes/origin/$branch': reference broken
qui pourrait être résolu par$ rm \repo.git\refs\remotes\origin\$branch
$ git fetch
J'ai ensuite fait un
$ git gc --prune=now
$ git remote prune origin
pour faire bonne mesure et
git reflog expire --stale-fix --all
se débarrasser de la
error: HEAD: invalid reflog entry $blubb
coursegit fsck --full
.la source
Allons simple .. seulement si vous avez téléchargé la source sur le dépôt git distant
vérifiez votre git
supprimer le fichier objet vide (tout)
vérifiez à nouveau votre git.
tirez votre source de git distant
la source
Je rencontre beaucoup ce problème avec les machines virtuelles.
Pour moi les oeuvres suivantes:
Si vous voulez vous sauver quelques téléchargements - allez dans votre explorateur de fichiers et supprimez tous les fichiers dans le dossier qui sont déjà validés et laissez dans vos dossiers / vendor et / node_modules (je travaille avec composer et npm).
puis il suffit de créer un nouveau dépôt
ajoutez votre télécommande
et récupérer la branche / tout cela
et vérifiez-le
alors vous devriez être au point avant l'erreur.
J'espère que cela t'aides.
Cordialement.
la source
Je rencontre le même problème et j'utilise un moyen très simple pour le résoudre. J'ai trouvé que ces fichiers manquants existaient sur l'ordinateur de mon coéquipier.
J'ai copié ces fichiers un par un sur un serveur git (9 fichiers au total), et cela a résolu le problème.
la source
Mes collègues et moi avons traversé plusieurs fois ce même problème et pour le résoudre nous faisons simplement les étapes que je décris ci-dessous. Ce n'est pas la solution la plus élégante qui puisse être trouvée mais elle fonctionne sans perte de données.
old_project
pour cet exemple).git clone
.old_project
(sauf le.git
répertoire) dans le répertoire du projet nouvellement créé.J'espère que ça aide ...
la source
Voici un moyen de résoudre le problème si votre dépôt public sur github.com fonctionne, mais que votre dépôt local est corrompu. Sachez que vous perdrez tous les commits que vous avez effectués dans le référentiel local.
D'accord, j'ai donc un dépôt local qui me donne ceci
object empty error
, et le même dépôt sur github.com, mais sans cette erreur. Donc, ce que j'ai simplement fait était de cloner le dépôt qui fonctionne à partir de github, puis de tout copier du dépôt corrompu (sauf le dossier .git), et de le coller le dépôt cloné qui fonctionne.Cela peut ne pas être une solution pratique (puisque vous supprimez les validations locales), cependant, vous conservez le code et un contrôle de version réparé.
N'oubliez pas de sauvegarder avant d'appliquer cette approche.
la source
Dans mon cas, il n'était pas important pour moi de conserver l'historique des validations locales. Donc, si cela s'applique à vous aussi, vous pouvez le faire comme une alternative rapide aux solutions ci-dessus:
Vous remplacez simplement le
.git/
répertoire corrompu par un propre.Supposons le répertoire suivant pour votre projet avec le git corrompu:
projects/corrupt_git/
cp projects/corrupt_git projects/backup
- (facultatif) faire une sauvegardegit clone [repo URL] projects/clean_git
- pour que vous obteniezprojects/clean_git
rm -rf corrupt_git/.git/
- supprimer le dossier .git corrompumv clean_git/.git/ corrupt_git/
- déplacer git propre verscorrupt_git/.git
git status
enprojects/corrupt_git
- pour vous assurer que cela a fonctionnéla source
Copiez tout (dans le dossier contenant le .git) dans une sauvegarde, puis supprimez tout et redémarrez. Assurez-vous d'avoir la télécommande git à portée de main:
alors
Fusionnez ensuite tous les nouveaux fichiers manuellement et essayez de garder votre ordinateur allumé.
la source
Eu le même problème après avoir vérifié le maître d'une branche propre. Après un certain temps, j'ai reconnu beaucoup de fichiers modifiés dans master. Je ne sais pas pourquoi ils ont été là, après avoir quitté une branche propre. Quoi qu'il en soit, parce que les fichiers modifiés n'avaient aucun sens pour moi, je les ai simplement cachés et l'erreur a disparu.
git:(master) git stash
la source
si vous avez une ancienne sauvegarde et que vous êtes pressé:
créez une NOUVELLE SAUVEGARDE de votre chemin de projet actuel, git-broken.
.git
dans la corbeille (ne supprimez jamais).git
de l'ancienne sauvegardegit pull
(créera des conflits de fusion)./src
(ne jamais supprimer)git gui
, poussez et ... applaudissez!la source
La solution en douze étapes décrite ci-dessus m'a également aidé à sortir d'un bourrage. Merci. Les étapes clés étaient d'entrer:
et supprimez tous les objets vides
Puis on obtient les deux lignes du fouet:
Avec les valeurs retournées
À ce stade, je n'avais plus d'erreurs, j'ai donc fait une sauvegarde de mes fichiers les plus récents. Faites ensuite un git pull suivi d'un git push. Copié mes sauvegardes dans mon fichier de référentiel git et fait une autre poussée git. Cela m'a mis au courant.
la source
J'ai corrigé mon erreur git: le fichier objet est vide par:
Espère que cela aide.
la source
Cela m'arrive aussi presque régulièrement. Je n'ai pas établi de protocole lorsque cela se produit exactement, mais je soupçonne qu'il se produit chaque fois que ma machine virtuelle existe "de manière inattendue". Si je ferme la fenêtre de la machine virtuelle (j'utilise Ubuntu 18.04) et recommence, les choses fonctionnent toujours (?). Mais si la fenêtre de la machine virtuelle est toujours ouverte lorsque mon ordinateur portable est arrêté (système hôte Windows), je rencontre ce problème assez fréquemment.
Quant à toutes les réponses données ici:
merci - ils sont très utiles; J'enregistre généralement une copie locale de mon code, restaure le référentiel à distance et remets la copie de sauvegarde dans le dossier local.
comme le problème sous-jacent n'est pas vraiment un problème git, mais plutôt un problème VM et / ou Linux, je me demande s'il ne devrait pas y avoir un moyen de guérir la raison plutôt que les symptômes? Ce type d'erreur n'indique-t-il pas que certaines modifications du système de fichiers ne sont pas "appliquées" dans un délai raisonnable, mais uniquement mises en cache? (voir par exemple /unix/464184/are-file-edits-in-linux-directly-saved-into-disk ) - pour moi, il semble que si les machines virtuelles Linux ne le font pas fsynch leurs affaires assez fréquemment. Que ce soit un problème d'Oracle VirtualBox (qui fonctionne très bien autrement) ou du système de fichiers invité, ou de certains paramètres, que nous ignorons tous, est au-delà de mon expertise. Mais je serais heureux si quelqu'un pouvait faire la lumière là-dessus.
la source
En fait, j'ai eu le même problème. Ayez une copie de votre code avant d'essayer.
je viens de faire
git reset HEAD~
mon dernier commit a été annulé puis je l'ai recommencé, problème résolu!
la source
Attention: Avec plus d'expérience, je me rends compte que c'est l'option nucléaire et que cela ne devrait généralement pas être fait et n'enseigne rien. Cependant, en de rares occasions pour des projets personnels, je l'ai toujours trouvé utile, donc je laisse ça de côté.
Si vous ne vous souciez pas de conserver vos validations historiques, exécutez simplement
Répondez ensuite oui à toute question concernant la suppression de fichiers protégés en écriture. Problème résolu en moins d'une minute.
la source