web-dev-qa-db-fra.com

Comment puis-je récupérer mon référentiel Git pour une erreur "arborescence manquante"?

Nous utilisons Gerrit pour notre référentiel Git. Sur un projet en activité depuis plusieurs mois, nous sommes soudainement dans l’impossibilité de faire avancer les changements. Lorsque nous exécutons git Push, l'erreur suivante apparaît:

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

L'exécution de git fsck --full donne:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a  
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27  
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff  
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2  
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f  
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df  
dangling tree 5377d7f7111d340854c3ee0946667c202227e603  
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1  
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819  
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94  
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d  

Tous nos développeurs rencontrent la même erreur lorsqu'ils essaient de pousser. Jusqu'à présent, nous avons essayé de réinitialiser le dépôt gerrit (git init --bare ...) et de le pousser à la hauteur. Nous avons également essayé de créer un nouveau projet gerrit avec un dépôt séparé. En fin de compte, nous continuons à avoir la même erreur.

Quelqu'un a-t-il une idée de ce que serait la cause ou de la façon de le récupérer?

27
Justin Guertin

Utilisez git Push --no-thin au lieu de git Push

D'après les documents Git: 

Un transfert léger réduit considérablement la quantité de données envoyées lorsque l'expéditeur et le destinataire partagent plusieurs objets communs. La valeur par défaut est --thin.

38
Filip

Je reçois cette même erreur sur mon git tortiuse. J'ai enfin la cause première de cette erreur.

Les étapes qui causent cette erreur;

  • Créer une nouvelle branche sur la tête.
  • Faire des modifications sur les nouvelles branches
  • Quelqu'un fait aussi des modifications sur la branche principale
  • Essayez de pousser votre branche

Cette erreur se produira si une branche locale est créée et non poussée jusqu'à ce que des modifications soient apportées à la branche principale. C'est une chose normale, car la branche principale distante ne sait rien de votre branche locale jusqu'à ce qu'une action Push soit effectuée.

Pour résoudre cette erreur, changez de branche et obtenez une action de traction complète. Puis changez de branche et essayez un Push.

13
erencan

Sauvegardez-le ... Sauvegardez-le tout de suite avant d'essayer quoi que ce soit.

Cela semble malheureux. Il est également regrettable que vous n'ayez pas l'impression d'avoir une sauvegarde régulière. Cependant, il y a de bonnes nouvelles à obtenir: je parie que vos développeurs ont ce fichier, même s'il se trouve peut-être dans un fichier pack. Essayez ce qui suit dans le répertoire .git de quelqu'un d'autre. Notez que git utilise les deux premiers caractères du hachage pour le nom du répertoire.

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9

Si cela se produit, copiez ce fichier dans le même chemin relatif sur votre serveur et la vie devrait bien se dérouler. Si non, alors essayez ceci:

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

Cela ne vous indiquera pas le fichier de pack (vous pouvez rapidement écrire un script ou le faire manuellement), mais il vous le dira. Trouvez le bon fichier de pack et développez-le ...

git unpack-objects $FILE

À partir de là, copiez le fichier dans le même chemin relatif sur votre serveur. Si cela ne résout pas le problème, des travaux supplémentaires sont nécessaires. L'échange d'un référentiel mis à jour et suffisamment développé par un développeur peut résoudre certains problèmes. Vous pouvez également explorer https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F , ou publier des commentaires de mise à jour et attendre que je revienne sur ce point.

8
Jeff Ferland

Lorsque nous obtenons cela, je peux presque toujours le résoudre avec un git gc:

git gc --aggressive --Prune=now

sauvegardez votre git repo en premier!

7
mtmattek

Sinon sur la branche principale, vous pouvez simplement supprimer la branche distante en:

git Push --delete Origin <branch_name>

Et puis repoussez votre branche vers la télécommande:

git Push -u Origin <branch_name>
3

Essayez un git pull --rebase.

J'ai sauvé le diff (git show > ~/mychanges.txt, a sorti le message de validation en haut du fichier). L'extrait d'une nouvelle branche (git checkout -b newbranch) a appliqué les modifications (git apply ~/mychanges.txt), puis un git pull --rebase. Ensuite, tout a fonctionné.

3
Rose Perrone

J'ai eu le même problème. Pour résoudre ce problème, j’ai utilisé git fetch, puis j’ai poussé à nouveau et cela a très bien fonctionné.

2
Yassine Younes

Essayez de mettre à jour votre version de git, nous avons rencontré des problèmes avec la version 1.9.0. 

1
marcbest

Cela se produit généralement lorsque le moment de la validation et du Push est différent, ce qui crée finalement une discordance entre les deux arbres. Avec une branche distante en amont et une branche locale foo

Tout d’abord, jetez tous les changements non engagés en utilisant

git reset --hard foo

Suivez ensuite la branche distante en utilisant

git branch --set-upstream-to=upstream/foo

Et enfin

git pull
1
Shubham Vatsal

Techniquement, cette réponse est un peu tardive, mais ce qui a fonctionné pour moi a été de créer un correctif pour l'ensemble de modifications que j'essayais de pousser, de recloner le référentiel vers un autre emplacement de disque, d'appliquer le correctif, de réengager et de pousser. 

0
avgvstvs

La solution rapide est Fetch -> Rebase -> Commit puis Push.

0
Nagaraju