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?
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.
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;
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.
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.
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!
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>
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é.
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é.
Essayez de mettre à jour votre version de git, nous avons rencontré des problèmes avec la version 1.9.0.
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
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.
La solution rapide est Fetch -> Rebase -> Commit puis Push.