Chaque fois que je tire de ma télécommande, j'obtiens l'erreur suivante sur la compression. Lorsque j'exécute la compression manuelle, j'obtiens la même chose:
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack
Quelqu'un sait-il quoi faire à ce sujet?
De cat-file j'obtiens ceci:
$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file
Et de git fsck je reçois ceci (je ne sais pas si c'est réellement lié):
$ 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 cela?
git
version-control
asgerhallas
la source
la source
Réponses:
On dirait que vous avez un objet d'arbre corrompu. Vous devrez obtenir cet objet de quelqu'un d'autre. Espérons qu'ils auront une version non corrompue.
Vous pouvez réellement le reconstruire si vous ne pouvez pas trouver une version valide de quelqu'un d'autre en devinant quels fichiers doivent y être. Vous voudrez peut-être voir si les dates et heures des objets correspondent. Ce pourraient être les blobs associés. Vous pouvez déduire la structure de l'objet arborescence de ces objets.
Jetez un œil aux screencasts Git de Scott Chacon concernant les internes git. Cela vous montrera comment git fonctionne sous le capot et comment faire ce travail de détective si vous êtes vraiment coincé et que vous ne pouvez pas obtenir cet objet de quelqu'un d'autre.
la source
git cat-file -t <SHA1>
vous dira le type. S'il n'est pas corrompu, vous pouvez alors le fairegit cat-file <type> <SHA1>
pour voir le contenu (je l'ai utilisé pour unblob
, je suppose qu'il vous montrera également le contenu d'autres types.)blob
. Cependant, quand j'ai suivi ces instructions, j'aigit status
répondufatal: unable to read <SHA1>
même si j'avais couru avec succèsgit hash-object -w <file>
(probablement parce que, selon ses instructions, j'avais déplacé ce fichier objet. Le renvoyer m'a juste 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 copie distante non corrompue du référentiel et gardera intacte votre copie de travail locale.
Mais il présente certains inconvénients:
Le correctif
Exécutez ces commandes à partir du répertoire parent au-dessus de votre référentiel (remplacez 'foo' par 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
Sous Windows, vous devrez utiliser:
copy
au lieu decp -R
rmdir /S
au lieu derm -rf
move
au lieu demv
Foo a maintenant son
.git
sous-répertoire d'origine, mais toutes les modifications locales sont toujours là.git status
,commit
,pull
,push
, Etc. travailler à nouveau comme ils le devraient.la source
.git
dossier.Votre meilleur pari est probablement de simplement re-cloner à partir du référentiel distant (par exemple. Github ou autre). Malheureusement, vous perdrez toutes les validations non poussées et les modifications cachées, mais votre copie de travail doit rester intacte.
Faites d'abord une copie de sauvegarde de vos fichiers locaux. Ensuite, faites-le depuis la racine de votre arbre de travail:
Validez ensuite tous les fichiers modifiés si nécessaire.
la source
master
par le nom de votre branche.working
quel , mais j'étais sur une autre branche quand il s'est corrompu et ces étapes ne m'ont pas donné de copie locale d'une branche autre que master (et oui j'avais essayé de remplacer master ci-dessusworking
mais cela n'a pas fonctionné). J'ai fini par faire les étapes ci-dessusmaster
, puis j'ai caché mes modifications et j'ai faitcheckout -b working origin/working
et sauté la cachette là-bas. Semble avoir fonctionné - merci!git status
cédaientfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. La suppression du sous-module du système de fichiers et le redémarrage du processus ont rétabli la normalité. S'assurer d'abord qu'il n'y a pas de changements non poussés dans les sous-modules est une bonne idée ...Travailler sur une machine virtuelle, dans mon ordinateur portable, la batterie est morte, a obtenu cette erreur;
J'ai réussi à faire fonctionner le repo avec seulement 2 commandes et sans perdre mon travail (fichiers modifiés / changements non validés)
Après cela, j'ai exécuté un
git status
, le repo allait bien et il y avait mes changements (en attente d'être engagé, faites-le maintenant ..).git version 1.9.1
N'oubliez pas de sauvegarder toutes les modifications dont vous vous souvenez, juste au cas où cette solution ne fonctionne pas et qu'une approche plus radicale est nécessaire.
la source
find .git/objects/ -size 0 -exec rm -f {} \;
travaille pour moi;)git symbolic-ref HEAD refs/heads/master.
après la suppression des objets vides.Mon ordinateur est tombé en panne pendant que j'écrivais un message de validation. Après le redémarrage, l'arborescence de travail était telle que je l'avais quittée et j'ai pu valider mes modifications avec succès.
Cependant, quand j'ai essayé de courir,
git status
j'aiContrairement à la plupart des autres réponses, je n'essayais pas de récupérer des données . J'avais juste besoin que Git arrête de se plaindre du fichier objet vide.
Aperçu
Le "fichier objet" est la représentation hachée de git d'un vrai fichier qui vous tient à cœur. Git pense qu'il devrait y avoir une version hachée de
some/file.whatever
stocké dans.git/object/xx/12345
, et corriger l'erreur s'est avéré être principalement une question de déterminer le fichier que "l'objet lâche" était censé représenter.Détails
Les options possibles semblaient être
Approche 1: supprimer le fichier objet
La première chose que j'ai essayée était simplement de déplacer le fichier objet
Cela n'a pas fonctionné - git a commencé à se plaindre d'un lien cassé. En approche 2.
Approche 2: corriger le fichier
Linus Torvalds a une excellente description de la façon de récupérer un fichier objet qui a résolu le problème pour moi. Les étapes clés sont résumées ici.
Cela vous indique de quel fichier l'objet vide est censé être un hachage. Vous pouvez maintenant le réparer.
Après avoir fait cela, j'ai vérifié
.git/objects/xx/12345
qu'il n'était plus vide et git a cessé de se plaindre.la source
Essayer
Cela a fonctionné pour moi. Il cache tout ce que vous n'avez pas commis et qui a contourné le problème.
la source
git stash
... fatal: impossible de créer 'touch .git/a
/ home / <user> /.git/index.lock': erreur d'entrée / sortie tactile: ne peut pas toucher '.git / a': erreur d'entrée / sortiesudo touch /home/guest/.git/a
NON ERREURgit stash
Non modifications locales à enregistrergit status
... rien à valider, répertoire de travail propreUne récupération de place a résolu mon problème:
Prend un certain temps, mais chaque objet lâche et / ou index corrompu a été corrigé.
la source
exécutant simplement un
git prune
problème résolu pour moila source
git pull
prend un peu plus de temps que d'habitude, je suppose parce qu'il remplace certains objets supprimés ou quelque chose.Je viens de vivre cela - ma machine s'est écrasée lors de l'écriture dans le référentiel Git, et elle est devenue corrompue. Je l'ai corrigé comme suit.
J'ai commencé par regarder combien de commits je n'avais pas poussés vers le référentiel distant, ainsi:
Si vous n'utilisez pas cet outil, il est très pratique - disponible sur tous les systèmes d'exploitation à ma connaissance. Cela a indiqué que ma télécommande manquait deux commits. J'ai donc cliqué sur l'étiquette indiquant la dernière validation à distance (généralement ce sera
/remotes/origin/master
) pour obtenir le hachage (le hachage fait 40 caractères, mais pour plus de concision, j'utilise 10 ici - cela fonctionne généralement de toute façon).C'est ici:
Je clique ensuite sur le commit suivant (c'est-à-dire le premier que la télécommande n'a pas) et j'y trouve le hachage:
J'utilise ensuite les deux pour créer un patch pour ce commit:
J'ai ensuite fait de même avec l'autre commit manquant, c'est-à-dire que j'ai utilisé le hachage du commit avant et le hash du commit lui-même:
J'ai ensuite déménagé dans un nouveau répertoire, cloné le référentiel depuis la télécommande:
J'ai ensuite déplacé les fichiers de correctifs dans le nouveau dossier, et les ai appliqués et validés avec leurs messages de validation exacts (ceux-ci peuvent être collés depuis
git log
ou dans lagitk
fenêtre):Cela a restauré les choses pour moi (et notez qu'il existe probablement un moyen plus rapide de le faire pour un grand nombre de commits). Cependant, j'étais impatient de voir si l'arbre du dépôt corrompu pouvait être réparé, et la réponse est oui. Avec un référentiel réparé disponible comme ci-dessus, exécutez cette commande dans le dossier cassé:
Vous obtiendrez quelque chose comme ceci:
Pour faire la réparation, je le ferais dans le dossier cassé:
c'est-à-dire supprimer le fichier corrompu et le remplacer par un bon. Vous devrez peut-être le faire plusieurs fois. Enfin, il y aura un point où vous pourrez exécuter
fsck
sans erreurs. Vous aurez probablement des lignes "commit pendant" et "blob pendantes" dans le rapport, elles sont la conséquence de vos rebases et modifications dans ce dossier, et elles sont OK. Le garbage collector les supprimera en temps voulu.Ainsi (au moins dans mon cas) un arbre corrompu ne signifie pas que les commits non poussés sont perdus.
la source
J'obtenais également une erreur d'objet lâche corrompu.
Je l'ai corrigé avec succès en allant dans le répertoire de l'objet corrompu. J'ai vu que les utilisateurs affectés à cet objet n'étaient pas mon utilisateur git. Je ne sais pas comment cela s'est produit, mais j'ai exécuté un
chown git:git
fichier sur ce fichier, puis cela a fonctionné à nouveau.Cela peut être une solution potentielle aux problèmes de certains peuples, mais pas nécessairement tous.
la source
J'ai eu cette erreur après que ma machine (Windows) ait décidé de se redémarrer. Heureusement, mon dépôt à distance était à jour, donc je viens de faire un nouveau git-clone ..
la source
Runnning a
git stash; git stash pop
résolu mon problèmela source
J'ai suivi bon nombre des autres étapes ici; La description de Linus sur la façon de regarder l'arbre / les objets git et de trouver ce qui manque était particulièrement utile.git-git récupère un blob corrompu
Mais à la fin, pour moi, j'avais des objets d'arbre lâches / corrompus causés par une défaillance partielle du disque, et les objets d'arbre ne sont pas si facilement récupérés / non couverts par ce document.
En fin de compte, j'ai déplacé le conflit
objects/<ha>/<hash>
et utiliségit unpack-objects
avec un fichier de pack à partir d'un clone raisonnablement à jour. Il a pu restaurer les objets d'arbre manquants.Il me reste encore beaucoup de taches qui pendent, ce qui peut être un effet secondaire du déballage des éléments précédemment archivés, et abordé dans d'autres questions ici
la source
En réponse à @ user1055643 manquant la dernière étape:
la source
.git
et copiez du projet cloné, le repo fonctionnera, mais aucune branche locale, ni stash ne sera conservé.Nous venons d'avoir le cas ici. Il est arrivé que le problème était la propriété du fichier corrompu était root au lieu de notre utilisateur normal. Cela était dû à une validation effectuée sur le serveur après que quelqu'un ait effectué un "sudo su -".
Tout d'abord, identifiez votre fichier corrompu avec:
Vous devriez recevoir une réponse comme celle-ci:
Allez dans le dossier où se trouve le fichier corrompu et faites:
Vérifiez la propriété du fichier corrompu. Si c'est différent, retournez à la racine de votre repo et faites un:
J'espère que ça aide!
la source
Pour moi, cela s'est produit en raison d'une panne de courant lors d'un
git push
.Les messages ressemblaient à ceci:
J'ai essayé des choses comme ça
git fsck
mais ça n'a pas aidé. Étant donné que le crash s'est produit pendant ungit push
, il s'est manifestement produit lors de la réécriture côté client qui se produit après la mise à jour du serveur. J'ai regardé autour de moi et j'ai pensé quec2388
dans mon cas, c'était un objet commit, car il était mentionné par des entrées dans.git/refs
. Je savais donc que je pourrais trouverc2388
quand je regarde l'histoire (via une interface Web ou un 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
être le prédécesseur dec2388
au lieu dec2388
. Ensuite, je pourrais faire ungit fetch
. L'git fetch
échec à plusieurs reprises pour des conflits sur des objets vides. J'ai retiré chacun de ces objets vides jusqu'à ce qu'ilgit fetch
réussisse. Cela a guéri le référentiel.la source
J'ai résolu ce problème: j'ai décidé de simplement copier le fichier objet non corrompu du clone de la sauvegarde vers mon référentiel d'origine. Cela a tout aussi bien fonctionné. (Au fait: 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.)
la source
J'ai eu ce même problème dans mon dépôt git distant à distance. Après de nombreux dépannages, j'ai compris qu'un de mes collègues avait fait un commit dans lequel certains fichiers en .git / objets avaient des autorisations de 440 (r - r -----) au lieu de 444 (r - r - r -). Après avoir demandé au collègue de modifier les autorisations avec des "objets chmod 444 -R" à l'intérieur du dépôt nu git, le problème a été résolu.
la source
J'ai juste eu un problème comme ça. Mon problème particulier a été causé par un plantage du système qui a corrompu le commit le plus récent (et donc aussi la branche master). Je n'avais pas poussé et je voulais refaire ce commit. Dans mon cas particulier, j'ai pu le gérer comme ceci:
.git/
:rsync -a .git/ git-bak/
.git/logs/HEAD
et recherchez la dernière ligne avec un ID de validation valide. Pour moi, c'était le deuxième engagement le plus récent. C'était bien, car j'avais toujours les versions du répertoire de travail du fichier, et donc toutes les versions que je voulais.git branch temp <commit-id>
git reset master temp
pour déplacer la branche principale vers le nouveau commit que vous avez fait à l'étape 2.git checkout master
et vérifiez qu'il semble bien avecgit log
.git branch -d temp
.git fsck --full
, et il devrait maintenant être sûr de supprimer tous les objets corrompus trouvés par fsck.Cela a fonctionné pour moi. Je soupçonne que c'est un scénario raisonnablement courant, car le commit le plus récent est le plus susceptible d'être corrompu, mais si vous en perdez un autre en arrière, vous pouvez probablement toujours utiliser une méthode comme celle-ci, avec une utilisation prudente de
git cherrypick
, et le reflog dans.git/logs/HEAD
.la source
Lorsque j'ai eu ce problème, j'ai sauvegardé mes modifications récentes (car je savais ce que j'avais changé), puis j'ai supprimé le fichier dont il se plaignait dans .git / location. Ensuite, j'ai fait un git pull. Attention cependant, cela pourrait ne pas fonctionner pour vous.
la source
J'ai rencontré cela une fois que mon système s'est écrasé. Voici ce que j'ai fait:
(Veuillez noter que vos validations corrompues sont perdues, mais les modifications sont conservées. Vous devrez peut-être recréer ces validations à la fin de cette procédure)
.git
dossier..git
dossier.la source
Supprimez simplement le dossier .git et ajoutez-le à nouveau. Cette solution simple a fonctionné pour moi.
la source
.git
et copiez du projet connecté, le repo fonctionnera, mais aucune branche locale, ni stash ne sera conservé. Aussi, une suggestion amicale, supprimez complètement votre réponse afin de ne plus recevoir de votes négatifs.