git pull échoue «impossible de résoudre la référence» «impossible de mettre à jour la référence locale»

606

En utilisant git 1.6.4.2, lorsque j'ai essayé un, git pullj'obtiens cette erreur:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

J'ai essayé git remote prune origin, mais ça n'a pas aidé.

Gabrielle
la source

Réponses:

929

Essayez de nettoyer votre référentiel local avec:

$ git gc --prune=now
$ git remote prune origin

homme git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

man git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            
Vojtech Vitek
la source
96
Pourquoi ça marche? Quel est le problème qu'il résout?
Ikke
5
La deuxième commande a fonctionné pour moi. Apparemment, j'avais une référence cassée à une branche distante qui venait d'être créée. Je ne sais pas comment cela s'est produit, mais je suis content que ce soit une solution simple. Merci Vitek!
JGTaylor
1
Cela a parfaitement fonctionné! J'aimerais aussi une explication de ce que cela fait et pourquoi cela a fonctionné. Merci!
ArielSD
4
La git remote prune origincommande s'exécutera-t-elle sur ma copie de travail locale ou sur le référentiel distant?
user1438038
3
@ user1438038 Il ne doit supprimer aucune branche et ne mettre à jour que les références distantes dans votre copie de travail locale. Plus d'informations ici: stackoverflow.com/questions/20106712/…
Zengineer
606

Cela m'est arrivé aussi. Dans mon cas, la mauvaise référence était maître, et j'ai fait ce qui suit:

rm .git/refs/remotes/origin/master
git fetch

Cela a permis à git de restaurer le fichier ref. Après cela, tout s'est à nouveau déroulé comme prévu.

Michel Krämer
la source
1
J'ai fait la même chose et cela a résolu mon problème. Lorsque j'ai ouvert le fichier dans Notepad ++, il était clairement corrompu.
theMayer
83
assurez-vous de choisir le fichier qui vous pose problème au lieu de master
bia.migueis
6
@ bia.migueis: cela ne va pas endommager quoi que ce soit si vous supprimez accidentellement le maître également - il sera juste mis à jour la prochaine extraction aussi.
naught101
2
S'il s'agit d'un sous-module, il peut être légèrement délicat de trouver la référence. Vérifiez d'abord s'il .gits'agit d'un dossier en faisant ls -lasinon, consultez le contenu du .gitfichier pour trouver le dossier .git dans lequel se trouvent les références. .gitcontenu du fichier dans mon cas: gitdir: ../.git/modules/my-submodule-name
CCoder
1
Deux fois maintenant au cours de la dernière année, je suis revenu pour résoudre ce problème et encore une fois, c'est le seul correctif qui fonctionne réellement.
Ted
131

Cela a fait le travail pour moi:

git gc --prune=now
Bernd
la source
5
Cela a fonctionné. Merci d'avoir sauvé ma journée! @Bernd Une explication possible de la commande?
nashcheez
les documents de git gc sont ici
BigRon
1
A aussi fonctionné pour moi. N'a pas eu besoin de courirgit remote prune origin
Airwavezx
87

Pour moi, cela a fonctionné pour supprimer les fichiers qui génèrent des erreurs du dossier .git/refs/remotes/origin/.

Brian van Rooijen
la source
ça y est! Mais juste par curiosité, savez-vous pourquoi cette erreur est survenue? (tout fonctionnait bien, puis soudain, un jour, cette erreur est survenue). Et savez-vous également comment la suppression du fichier l'a résolu?
Shreyans le
Bon d'entendre cela l'a également corrigé pour vous. Pour être honnête, je n'ai aucune idée de la cause de l'erreur. Je pensais que l'un des fichiers du dossier n'était plus synchronisé. Comme aucun des autres correctifs que j'ai trouvés ne fonctionnait pour moi, j'ai utilisé cela en dernier recours.
Brian van Rooijen
Fonctionne très bien! Notez que vous devez supprimer tous les fichiers à l'origine du problème (en fonction du rapport d'erreur que vous obtenez), comme si vous n'en supprimiez qu'un et essayez de le retirer.
Rayee Roded
1
L'une des causes possibles peut être la panne du système, comme je l'ai décrit dans ma réponse . De nombreuses applications Git GUI exécutent périodiquement Git sur votre référentiel (pour actualiser l'état) et si votre système se bloque pendant que Git manipule avec les références, elles peuvent finir par être réécrites avec NULLs.
David Ferenczy Rogožan du
53

Essayez-le:

git gc --prune=now

git remote prune origin

git pull
annelorayne
la source
26
Bien que cela puisse répondre à la question des auteurs, il manque quelques mots explicatifs et / ou des liens vers la documentation. Les extraits de code brut ne sont pas très utiles sans quelques phrases autour d'eux. Vous pouvez également trouver comment rédiger une bonne réponse très utile. Veuillez modifier votre réponse.
Roy Scheffers
Exactement le point. Il ne suffit pas de corriger le code et c'est tout. J'espère qu'il y a une explication
Musikero31
1
git gc --prune = met à jour le référentiel local tout en supprimant les fichiers inutiles. Cela fonctionne bien pour moi.
Vasyl Gutnyk
45

Exécutez les commandes suivantes:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

Au cas où, si vous avez besoin de savoir ce que c'est .git/refs/remotes/origin/master, vous devriez lire la section Télécommandes dans les références Git .

Matias Sebastiao
la source
1
Pouvez-vous expliquer ce qu'est .git / refs / remotes / origin / branchName? Cette solution a fonctionné pour moi
caitcoo0odes
44

Je voudrais juste ajouter comment il peut arriver qu'une référence se casse.

Cause racine possible

Sur mon système (Windows 7 64 bits), lorsqu'un BSOD se produit , certains des fichiers de référence stockés (très probablement actuellement ouverts / en cours d'écriture lorsque BSOD s'est produit) sont remplacés par des NULLcaractères (ASCII 0).

Comme d'autres l'ont mentionné, pour le corriger, il suffit de supprimer ces fichiers de référence invalides et de récupérer ou de ré-extraire le référentiel.

Exemple

Erreur: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Solution: supprimez le fichier%repo_root%/.git/refs/remotes/origin/some/branch

David Ferenczy Rogožan
la source
1
Même scénario sur Windows 10 64 bits - travailler dans un dépôt git lorsque BSOD se produit. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Essayer de git pullsupprimer le premier fichier renvoyé fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Après la suppression du deuxième fichier git pull origin mastera réussi.
cjmcdonn
39

J'ai eu ce même problème et l'ai résolu en allant dans le fichier sur lequel il faisait une erreur:

\repo\.git\refs\remotes\origin\master

Ce fichier était plein de null, je l'ai remplacé par la dernière référence de github.

Noel Tock
la source
2
Eu le même problème, mais le fichier .git/refs/remotes/origin/masterétait juste vide. Résolu le problème en le supprimant.
zinovyev
38

Dans mon cas, le problème a été résolu après avoir supprimé tous les fichiers de référence de suppression sous le répertoire .git.

Si vous regardez le message, il vous dira quels fichiers vous devez supprimer (spécifiquement).

Les fichiers à supprimer se trouvent sous .git/refs/remotes.

Je viens de supprimer tous les fichiers et d'exécuter gc prune

git gc --prune=now

Après cela, tout fonctionne très bien.

Uri Shtand
la source
Dans mon cas, je viens de supprimer .git / refs / remotes, puis de mettre à jour et de pousser le serveur et cela a fonctionné.
Faraz Ahmed
Merci Uri. Dans mon cas, je viens de supprimer des fichiers sous refs / remotes / origin / feature et je l'ai simplement fait - git pull
Deepboy
26

Explication : Il semble que vos branches de dépôt à distance (dans Github / bitbucket) aient été supprimées, bien que vos références locales n'aient pas été mises à jour et pointent vers des références inexistantes.

Afin de résoudre ce problème:

git fetch --prune
git fetch --all
git pull

Pour une lecture supplémentaire - Référence de la documentation Github :

git-fetch - Télécharger des objets et des références depuis un autre référentiel

--all Récupère toutes les télécommandes.

--prune Après l'extraction, supprimez toutes les branches de suivi à distance qui n'existent plus sur la télécommande.

avivamg
la source
1
Cela a fonctionné pour moi
Onengiye Richard
1
Merci, ça a marché pour moi.
Sam
17

git fetch --prune corrigé cette erreur pour moi:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

Cela suppose cependant que la branche incriminée a été supprimée sur la télécommande.

marczych
la source
Votre exemple semble incomplet: il ne montre pas ce --pruneque je peux voir. Aussi proTip: supprimez les invites de mot de passe inutiles après avoir collé des exemples.
MarkHu
Vous avez absolument raison - j'ai laissé la sortie de la commande fetch mais je l'ai simplement mise dans l'exemple. Merci aussi pour le conseil sur la suppression de l'invite de mot de passe!
marczych
11

Si cette erreur «impossible de mettre à jour la référence locale» se reproduit, même après avoir appliqué la réponse de Vojtech Vitek ou de Michel Krämer, vous pouvez avoir une mauvaise référence sur votre référentiel local ET maître.

Dans ce cas, vous devez appliquer les deux fixations sans tirer ni pousser entre les deux ...

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Une résolution permanente pour moi n'a été obtenue qu'après avoir appliqué les deux correctifs avant de pousser / tirer.

Inyoka
la source
1
Merci pour cela. notez que j'ai remplacé 'master' par la branche qui échouait par exemple - rm .git / refs / remotes / origin / develop
Damien Sawyer
1
Merci pour votre réponse, vraiment aidé!
naffiq
1
Cela a fonctionné pour moi
parJeevan
10

Pour répondre à cette question très brièvement, ce problème survient lorsque votre section locale a des informations sur la télécommande et que quelqu'un change quelque chose qui rend la télécommande et vos modifications non synchronisées.

J'obtenais ce problème parce que quelqu'un a supprimé la branche distante et a de nouveau créé avec le même nom.

Pour résoudre ces problèmes, effectuez une extraction ou une récupération à distance.

git remote prune origin

ou si vous utilisez une interface graphique, effectuez une récupération à distance.

entrez la description de l'image ici

Abhijeet Kamble
la source
3

J'ai pu travailler avec

git remote update --prune
user1238353
la source
3

Essaye ça:

git pull origin Branch_Name

Branch_Name, la branche sur laquelle vous vous trouvez actuellement.

Si vous ne faites qu'un git pull , il extrait également tous les autres noms de branche créés.

C'est la raison pour laquelle vous obtenez ceci:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)
user3832506
la source
2

Pour moi, j'avais une branche locale nommée feature/phase2et la branche distante a été nommée feature/phase2/data-model. Le conflit de nommage a été la cause du problème, j'ai donc supprimé ma branche locale (vous pouvez la renommer si elle contient tout ce que vous devez conserver)

Nathan Wallace
la source
Même problème ici - le nôtre était également un problème de nommage de cas Mac / PC, ce qui le rendait difficile à repérer (un nom était en majuscule, l'autre non - et cela fonctionnait sur PC, mais pas Mac)
rocksteady
2

Si git gc --prune=nowça ne vous aide pas. (pas de chance comme moi)

Ce que j'ai fait, c'est de supprimer le projet en local et de recloner à nouveau l'ensemble du projet.

Eric Chen
la source
Il s'agit d'une approche "J'ai reçu un message d'erreur, j'ai donc acheté un nouvel ordinateur", dont je ne m'attendais pas à obtenir des votes positifs sur ce site.
Stephan Vierkant
2

J'utilise Tower et pour une raison quelconque, mon nom de dossier était .git/refs/remotes/origin/Github. Le changer en minuscule a .git/refs/remotes/origin/githubrésolu le problème.

split19
la source
1

J'ai eu le même problème. je suis les étapes suivantes

1) Basculez votre succursale ayant un problème vers une autre succursale

2) supprimer cette branche

3) commander à nouveau.

Remarque: - Vous pouvez cacher vos modifications non validées et les remettre à nouveau.

user2619659
la source
1

J'ai utilisé git prune originet cela a fait le travail.

TheFakeCake
la source
0

J'ai eu le même problème avec la mise à jour du compositeur. Mais pour moi, cela n'a fonctionné qu'après avoir vidé le cache du composeur et après avoir supprimé le contenu du dossier du fournisseur:

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package
propriétaire
la source
0

Vous avez ce problème lorsque vous essayez de cloner à partir d'un git bundlefichier créé, aucune des autres réponses n'a fonctionné parce que je ne pouvais pas cloner le dépôt (il git gcétait donc hors de question de supprimer / modifier des fichiers).

Il y avait cependant une autre façon de résoudre ce problème - le fichier source d'un .bundlefichier commençait par:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

La simple suppression de la quatrième ligne avec vim a résolu le problème.

Krzysztof Bociurko
la source
0

J'ai eu ce problème lors de l'utilisation de SourceTree. J'ai essayé de tirer à nouveau et cela a fonctionné. Je pense que je faisais de la sorcellerie (paiement) trop vite :).

Ma situation est un peu différente de celle de l'affiche car mon référentiel a été relativement coopératif, sans aucune corruption apparente.

Pysis
la source
0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push
Yordan Georgiev
la source
0

Face au même problème lorsque le référentiel a été supprimé et créé avec le même nom. Cela n'a fonctionné que lorsque j'ai réinitialisé l'URL à distance comme ci-dessous;

git remote set-url origin [GIT_REPO_URL]

Vérifiez l'URL distante:

git remote -v

Maintenant, toutes les commandes devraient fonctionner comme d'habitude.

Ricky Boy
la source
0

Je viens de rencontrer le problème aujourd'hui.

Méthode de dépannage: Avec SourceTree sur les serveurs Windows, vous pouvez essayer de l'exécuter en tant qu'administrateur. Cela résout mon problème de «impossible de mettre à jour la référence locale» sur Atlassian Source Tree 2.1.2.5 sur un serveur Windows Server 2012 R2 dans le domaine.

Si vous pouvez trop reproduire cette situation, cela prouve que le problème est dû à un problème d'autorisation. Il vaut mieux explorer et trouver la cause principale - probablement certains fichiers particuliers appartiennent à d'autres utilisateurs et autres - sinon il y a un effet secondaire indésirable: vous devrez exécuter SourceTree en tant qu'administrateur pour le reste de l'éternité.

Lionet Chen
la source
Eh bien, je ne recommanderais pas ça. Vous vous retrouverez avec encore plus de fichiers avec des autorisations incorrectes. Et vous devrez exécuter tout ce qui manipule avec les fichiers du référentiel en tant qu'administrateur. N'est-il pas préférable de simplement fixer les autorisations en premier lieu?
David Ferenczy Rogožan
Tu as raison. Mais ce n'est qu'après l'avoir fait fonctionner en tant qu'administrateur que j'ai compris que c'était le problème d'autorisation. C'était donc une étape dans ma procédure de diagnostic, pas une solution parfaite en soi.
Lionet Chen
Sûr. Mais de nombreux utilisateurs peuvent simplement considérer votre réponse comme une solution sans vraiment en connaître les conséquences. Peut-être mieux si vous ajoutez la fixation des autorisations comme solution suggérée.
David Ferenczy Rogožan
0

Notez un cas spécifique qui pourrait provoquer ce problème.

Un jour, j'ai poussé une branche nommée "fonctionnalité / sous-fonctionnalité", tout en ayant une branche "fonctionnalité" sur la télécommande.

Cette opération a bien fonctionné sans aucune erreur de mon côté, mais lorsque mes collègues ont récupéré et / ou tiré une branche, ils avaient tous exactement le même message d'erreur unable to update local ref,cannot lock ref 'refs/remotes/origin/feature/subfeature .

Cela a été résolu en supprimant feature branche sur remote ( git push --delete origin feature) puis en l'exécutant git remote prune originsur le référentiel de mes collègues, qui a généré des messages comprenant* [pruned] origin/feature .

Donc, je suppose que git fetchj'essayais de créer une subfeatureréférence dans le featuredossier sur git en interne (.git / ...), mais la création du dossier a échoué car il y avait featuredéjà une référence.

ik1ne
la source
0

Nous avons rencontré ce problème lorsqu'un développeur sur Mac a créé une branche avec un symbole supérieur à ">" dans le nom de la branche.

Cela a provoqué des problèmes dans TeamCity et sur les ordinateurs Windows locaux exécutant SourceTree. BitBucket l'a laissé passer sans aucun problème.

Pour résoudre, l'utilisateur a supprimé la branche et l'a recréée. Ce qui était agréable et facile.

dylanT
la source
-1

Eu le même msg mais avec un répertoire, a obtenu un msg échoué lors de la traction.

git --prone ne m'a pas aidé non plus. Il s'avère qu'un fichier portant le même nom qu'un répertoire a été créé à distance.

J'ai dû aller dans .git \ logs \ refs \ remotes \ origin et effacer le fichier de paramètres régionaux - puis tirer à nouveau, tout va bien.

Asaf Maoz
la source