Git: “Corrompus lâche objet”
Chaque fois que je sors de ma télécommande, j'obtiens l'erreur suivante à propos de la compression. Quand je lance la compression manuelle, je reçois le même:
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack
Personne ne sait, quoi faire à ce sujet?
De chat-fichier j'obtiens ceci:
$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file
Et à partir de git fsck-je obtenir ceci ( ne sais pas si c'est réellement liés):
$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted
Quelqu'un peut-il m'aider à déchiffrer ce?
- Avez-vous essayé de regarder le dernier objet (45ba4ceb93bc812ef20a6630bb27e9e0b33a012a)?
- Merci... mais comment faire un "look" à un objet? Encore nouveau pour git 🙂
- Essayez
git show
. - git show me donne rien de plus que git fsck déjà fait malheureusement.
- Linus Torvalds a écrit ce qui suit document utile à propos de cette erreur et comment reconstruire manuellement les gouttes si vous avez les fichiers: Comment récupérer corrompu objet blob Quelques astuces pour reconstruire les objets blob dans le but de résoudre un corrompu référentiel
- Pouvez-vous ajouter des commentaires, ou de la modifier, de la accepté de répondre? Je suis exactement dans la même situation, et l'on a accepté la réponse ne semble pas contenir suffisamment de détails pour "Seulement les Travaux TM", mais plutôt de la force de me plonger dans les détails à moi-même.
git cat-file -t <SHA1>
vous indiquera le type. Si non corrompu, vous pourrez alors fairegit cat-file <type> <SHA1>
pour voir le contenu (je l'ai utilisé pour unblob
, je pense que ce sera également vous montrer le contenu d'autres types.)- Dans mon cas, c'était juste un problème d'autorisation. J'ai essayé de tirer à nouveau en tant que root et cela a fonctionné.
- Connexes: stackoverflow.com/questions/801577/...
Vous devez vous connecter pour publier un commentaire.
Semble que vous avez un mauvais arbre de l'objet. Vous aurez besoin d'obtenir l'objet de quelqu'un d'autre. J'espère qu'ils ont une version correct.
L'on pourrait reconstruire si vous ne pouvez pas trouver une version valide de quelqu'un d'autre en devinant ce que les fichiers doivent être là. Vous voudrez peut-être voir si les dates & fois des objets correspondent à la hauteur. Ceux-ci pourraient être liées à des gouttes. Vous pourriez en déduire la structure de l'objet de l'arborescence à partir de ces objets.
Prendre un coup d'oeil à Scott Chacon Git du Screencasts concernant git internes. Cela va vous montrer comment git fonctionne sous le capot et la façon de faire ce travail de détective si vous êtes vraiment coincé et ne peut pas obtenir l'objet de quelqu'un d'autre.
git cat-file -t <SHA1>
vous indiquera le type. Si non corrompu, vous pourrez alors fairegit cat-file <type> <SHA1>
pour voir le contenu (je l'ai utilisé pour unblob
, je pense que ce sera également vous montrer le contenu d'autres types.)blob
. Quand j'ai suivi ces instructions, si,git status
responsedfatal: unable to read <SHA1>
même si j'avais réussi a courugit hash-object -w <file>
(sans doute parce que, par ses instructions, j'avais proposé que le fichier objet à l'écart. De retour, il m'a donné la mêmecorrupt loose object
erreur.)J'ai eu le même problème (je ne sais pas pourquoi).
Ce correctif nécessite l'accès à une inaltéré à distance copie du dépôt, et de garder votre localement de la copie de travail intact.
Mais il a aussi quelques inconvénients:
Le correctif
Exécuter ces commandes dans le répertoire parent au-dessus de votre repo (remplacer 'foo' avec le nom de votre dossier de projet):
cp -R foo foo-backup
git clone [email protected]:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
Sur Windows, vous devrez utiliser:
copy
au lieu decp -R
rmdir /S
au lieu derm -rf
move
au lieu demv
Maintenant foo a son origine
.git
sous-répertoire de retour, mais tous les changements locaux sont toujours là.git status
,commit
,pull
,push
, etc. travailler à nouveau comme ils le devraient..git
dossier.cp
etrm
ne sont pas disponibles, j'ai eu du succès simplement en utilisant l'Explorateur de Windows pour supprimer et remplacer le .git sous-répertoire dans le nouveau clone.git checkout -b loose-object-fix
/git add --all
/git commit -m "Loose object files"
/git checkout <feature-branch>
. J'étais alors en arrière, là où j'étais avant de le lâche objet de situation.foo-backup
à partir de l'étape 1, que le dossier était vide avant.git reflog
qui n'existe que sur cette copie locale du dépôt, et nulle part ailleurs.Votre meilleur pari est probablement tout simplement re-cloner à partir de la télécommande repo (ie. Github ou autre). Malheureusement, vous perdrez toutes les unpushed s'engage et planqué changements, cependant, votre copie de travail doit rester intacte.
D'abord faire une copie de sauvegarde de vos fichiers locaux. Puis le faire à partir de la racine de votre arbre de travail:
Puis valider toute modification de fichiers que nécessaire.
master
avec votre nom de la branche.working
quand il endommagé et que ces étapes ne m'a pas donné une copie locale d'une succursale autre que le maître (et oui, j'avais essayé de remplacer le maître-dessus avecworking
mais cela ne fonctionne pas). Fini de faire les étapes ci-dessus avecmaster
, puis accrocher mes changements et de fairecheckout -b working origin/working
et éclater la cachette là. Semble avoir travaillé - merci!git status
donnéfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. La suppression de la sous-module du système de fichiers et de redémarrer le processus restauré à la normale. Sans doute qu'il y ait des nations unies-poussé de révisions dans submodules premier est une bonne idée...De travail sur une machine virtuelle, dans mon ordinateur portable, la batterie est morte, eu cette erreur;
J'ai réussi à obtenir le repo de travailler à nouveau avec seulement 2 commandes et sans perdre mon travail (fichiers modifiés/les modifications non validées)
Après que j'ai couru un
git status
, l'opération était bien et il y avait mes modifications (en attente d'être commis, le faire maintenant..).git version 1.9.1
N'oubliez pas de sauvegarder toutes les modifications que vous rappelez-vous, juste au cas où cette solution ne fonctionne pas et une approche plus radicale est nécessaire.
find .git/objects/ -size 0 -exec rm -f {} \;
fonctionne pour moi 😉git symbolic-ref HEAD refs/heads/master.
après la suppression de la vide d'objets.git reset --hard
mais votre stratégie est le moyen le plus rapide, je pense. Merci!Mon ordinateur est tombé en panne alors que j'écrivais un message de commit. Après le redémarrage, l'arbre de travail a été comme je l'avais laissé et j'ai été en mesure de réussir à commettre de mes modifications.
Cependant, lorsque j'ai essayé d'exécuter
git status
j'ai euContrairement à la plupart des autres réponses, je n'étais pas en train de récupérer toutes les données. J'ai juste besoin de Git à arrêter de se plaindre à propos de l'objet vide de fichier.
Aperçu
L'objet "fichier" est git est haché représentation d'un fichier réel que vous vous souciez. Git pense qu'il devrait avoir une version cryptée de
some/file.whatever
stockées dans.git/object/xx/12345
, et la fixation de l'erreur s'est avéré être surtout une question de trouver le fichier "loose objet" était censé représenter.Détails
Options possibles semblait être
Méthode 1: Supprimer le fichier objet
La première chose que j'ai essayé était juste de déplacer le fichier d'objet
Qui n'ont pas de travail - git a commencé à se plaindre au sujet d'un lien brisé. À l'Approche 2.
Approche 2: Fixer le fichier
Linus Torvalds a un grand article de comment faire pour récupérer un fichier objet qui a résolu le problème pour moi. Les principales étapes sont résumées ici.
Cela vous indique que le fichier de l'objet vide est censé être un algorithme de hachage. Maintenant, vous pouvez le réparer.
Après avoir fait cela, j'ai vérifié
.git/objects/xx/12345
, il n'était plus vide, et git cessé de se plaindre.Essayer
Cela a fonctionné pour moi. Il caches quelque chose que vous n'avez pas commis et qui a obtenu de contourner le problème.
git stash
... fatale: Impossible de créer " /home/<utilisateur>/.git/index.lock': erreur d'Entrée/sortietouch .git/a
touch: ne peut pas toucher".git/a’: erreur d'Entrée/sortiesudo touch /home/guest/.git/a
PAS d'ERREURgit stash
Pas de changements pour enregistrergit status
... rien à commettre, répertoire de travail propreUn la collecte des ordures fixe mon problème:
Prend un certain temps, mais tous les lâches de l'objet et/ou corrompus indice a été corrigé.
Que je vient de vivre ce - ma machine s'est écrasé pendant la rédaction du repo Git, et il est devenu corrompu. J'ai corrigé comme suit.
J'ai commencé par chercher à combien s'engage je n'avais pas poussé à la distance repo, donc:
Si vous n'utilisez pas cet outil, il est très pratique disponible sur tous les systèmes d'exploitation pour autant que je sais. Ceci indique que ma télécommande manquait deux commits. J'ai donc cliqué sur l'étiquette indiquant la dernière distance commit (habituellement, c'est
/remotes/origin/master
) pour obtenir la valeur de hachage (le hash est de 40 caractères, mais pour des raisons de concision, je suis en utilisant 10 ici - c'est généralement de toute façon).Ici, il est:
Je puis cliquez sur suivant commit (c'est à dire le premier que la télécommande ne possède pas) et le haschisch:
J'utilise ensuite ces deux pour faire un patch pour ce commit:
J'ai ensuite fait de même avec les autres manquant de s'engager, c'est à dire que j'ai utilisé le hachage de la validation avant et le hachage de la livraison lui-même:
J'ai ensuite déménagé dans un nouveau répertoire, cloné le dépôt à partir de la télécommande:
J'ai ensuite passé le patch fichiers dans le nouveau dossier, et les a appliqués et engagés avec leurs exacte des messages de commit (ceux-ci peuvent être collées à partir de
git log
ou lagitk
fenêtre):Cette restauré choses pour moi (et notez qu'il y a probablement un moyen plus rapide de le faire pour un grand nombre de commits). Cependant, je tenais à voir si l'arbre dans le corrompu repo peut être réparé, et la réponse est qu'il peut. Avec un réparés pensions de titres disponibles en tant que ci-dessus, exécutez cette commande dans le cassé dossier:
Vous obtiendrez quelque chose comme ceci:
De faire la réparation, je voudrais faire cela dans le cassé dossier:
c'est à dire supprimer le fichier endommagé et le remplacer par une bonne. Vous pourriez avoir à faire ce à plusieurs reprises. Enfin, il y aura un point où vous pouvez exécuter
fsck
sans erreurs. Vous aurez probablement "bancales commit" et "bancales blob" lignes dans le rapport, ce sont une conséquence de votre rebases et l'amende dans ce dossier, et sont OK. Le garbage collector pour les supprimer en temps voulu.Donc (au moins dans mon cas) un arbre endommagé ne signifie pas unpushed commits sont perdus.
J'ai été faire un corrompu lâche erreur de l'objet en tant que bien.
J'ai réussi a résolu en allant dans le répertoire de la corruption de l'objet. J'ai vu que les utilisateurs affectés à cet objet a été pas mon git de l'utilisateur. Je ne sais pas comment c'est arrivé, mais j'ai couru un
chown git:git
sur ce fichier, puis a de nouveau fonctionné.Cela peut être une solution possible pour certaines questions des peuples, mais pas nécessaire de tous.
J'ai eu cette erreur après mon (windows) la machine a décidé de se réinitialiser.
Heureusement, ma télécommande repo a été jusqu'à date, donc j'ai juste fait une nouvelle git-clone..
J'ai suivi de nombreux autres étapes ici; Linus " description de la façon de regarder l'arbre git/objects et de trouver ce qu'il manque a été particulièrement utile. git-git récupérer les blob
Mais à la fin, pour moi, j'avais lâche/l'arbre des objets causée par une partielle de la défaillance d'un disque, et des objets de l'arborescence ne sont pas si facilement récupérées/ne sont pas couverts par cette doc.
En fin de compte, j'ai déplacé le conflit
objects/<ha>/<hash>
hors de la voie, et utiliségit unpack-objects
avec un pack de fichier à partir d'un raisonnablement à jour clone. Il a été en mesure de restaurer le manque des objets de l'arborescence.Encore m'a laissé avec beaucoup de pendre les gouttes, qui peut être un effet secondaire de déballage déjà archivés des choses, et de les traiter dans d'autres questions ici
En réponse @user1055643 manque la dernière étape:
.git
et copie du projet cloné, les pensions de fonctionner, mais pas de branches locales, ni les caches seront préservés.simplement l'exécution d'un
git prune
résolu ce problème pour moigit pull
prend un peu plus longtemps que d'habitude, j'imagine, parce que c'est le remplacement de certains objets déplacés ou quelque chose.Runnning
git stash; git stash pop
fixe mon problèmePour moi ce qui s'est passé en raison d'une panne de courant tout en faisant un
git push
.Les messages ressemblait à ceci:
J'ai essayé des choses comme
git fsck
mais cela n'a pas aidé.Depuis l'accident qui s'est passé au cours d'une
git push
, il est évident qu'elle est passé au cours de réécriture sur le client, ce qui se passe après que le serveur est mis à jour. J'ai regardé autour et a trouvé quec2388
dans mon cas était un objet commit, parce qu'il a été visé par des entrées dans.git/refs
. Donc je savais que je serais en mesure de trouverc2388
quand je regarde l'histoire (à travers une interface web ou de la deuxième clone).Sur le deuxième clone, j'ai fait un
git log -n 2 c2388
pour identifier le prédécesseur dec2388
. Ensuite, j'ai modifié manuellement.git/refs/heads/master
et.git/refs/remotes/origin/master
le prédécesseur dec2388
au lieu dec2388
.Ensuite, j'ai pu faire un
git fetch
.Le
git fetch
manqué un peu de temps pour que des conflits sur des objets vides. J'ai enlevé chacun de ces objets vides jusqu'à ce quegit fetch
réussi. Qui a guéri le référentiel.J'ai résolu de cette façon:
J'ai décidé de simplement copier les corrompus fichier de l'objet à partir de la sauvegarde clone de mon dépôt original. Cela a fonctionné tout aussi bien. (En passant: Si vous ne pouvez pas trouver l'objet dans .git/objects/par son nom, il a probablement été [emballé][pack] pour économiser de l'espace.)
J'ai eu ce même problème dans ma nu à distance repo git. Après beaucoup de dépannage, j'ai réalisé un de mes collègues avait fait un commit dans laquelle certains des fichiers .git/objects autorisations de 440 (r--r-----) au lieu de 444 (r--r--r--). Après avoir demandé à la collègue pour modifier les autorisations d'accès avec la commande "chmod 444 -R des objets" à l'intérieur de la nue-repo git, le problème était résolu.
Nous avons juste eu le cas ici. Il est arrivé que le problème était la propriété de la corruption de fichiers a la racine à la place de notre utilisateur normal. Ceci a été causé par un commit sur le serveur après que quelqu'un a fait un "sudo su --".
Tout d'abord, identifier votre fichier corrompu avec:
Vous devriez recevoir une réponse comme celle-ci:
Aller dans le dossier où le fichier corrompu est et faire un:
Vérifie la propriété de la corruption de fichier. Si c'est différent, il suffit de retourner à la racine de votre repo et faites un:
Espère que cela aide!
J'ai juste eu un problème de ce genre. Mon problème a été causé par une panne du système qui ont corrompu la plus récente s'engager (et donc aussi la branche master). Je n'avais pas poussé, et je voulais re-faire qui s'engagent. Dans mon cas particulier, j'ai été en mesure de traiter avec elle comme ceci:
.git/
:rsync -a .git/git-bak/
.git/logs/HEAD
, et de trouver la dernière ligne avec une pièce d'engager ID. Pour moi, c'était la deuxième plus récente s'engager. C'était une bonne chose, car j'avais encore le répertoire de travail de versions de ce fichier, et donc la version que je voulais.git branch temp <commit-id>
git reset master temp
pour déplacer la branche master pour le nouveau commit que vous avez fait dans l'étape 2.git checkout master
et vérifier qu'il regarde, à droite, avecgit log
.git branch -d temp
.git fsck --full
, et il devrait maintenant être plus sûr de supprimer tous les objets endommagés que fsck trouve.Que travaillé pour moi. Je pense que c'est un raisonnablement scénario commun, depuis le dernier commit est le plus susceptible d'être endommagé, mais si vous perdez un retour plus loin, vous pouvez probablement continuer à utiliser une méthode comme ceci, avec la prudence dans l'utilisation de
git cherrypick
, et le reflog dans.git/logs/HEAD
.Quand j'ai eu ce problème j'ai sauvegardé mes dernières modifications (que j'ai su que j'avais changé) puis supprimé ce fichier, il se plaint en .git/emplacement. Ensuite, j'ai fait un git pull. Prenez soin cependant, cela pourrait ne pas fonctionner pour vous.
Juste enlever .git dossier et l'ajouter à nouveau. Cette solution simple a fonctionné pour moi.
.git
, et copier de la clonned projet, les pensions de fonctionner, mais pas de branches locales, ni les caches seront préservés. Aussi, un ami de la suggestion, de supprimer votre réponse complètement pour arrêter de recevoir des bas-voix.