393 votes

Erreur de git sur git pull (impossible de mettre à jour la référence locale)

Je n'ai que la branche master et j'obtiens cette erreur à chaque fois que j'essaie de "git pull" :

error: Couldn't set refs/remotes/origin/master
From /var/lib/git/xxx/project
 ! a0f80ea..49177a3  master     -> origin/master  (unable to update local ref)

et quand je fais "git pull origin master" j'obtiens :

error: Couldn't set ORIG_HEAD
fatal: Cannot update the ref 'ORIG_HEAD'.

J'ai cherché mais je n'ai pas trouvé pourquoi

2 votes

Où se trouve le référentiel local ? L'avez-vous créé sous un utilisateur différent de celui que vous utilisez pour exécuter le pull ? Cela ressemble à un problème d'autorisation de fichier.

0 votes

Oui, vous avez raison après avoir dit que le propriétaire des fichiers du projet était un autre utilisateur, maintenant ma question semble si stupide, mais vous m'avez donné la réponse, s'il vous plaît faites-en une réponse pour la choisir comme la meilleure ;)

0 votes

S'il vous plaît @tpg2114 ajouter ceci comme une réponse pour le choisir

701voto

Skip Jack Points 2050

Mon équipe et moi avons rencontré cette erreur, Impossible de mettre à jour la référence locale quand on fait une recherche dans SourceTree.

Mise à jour 2020 : Selon la réponse de @Edward Yang ci-dessous, le commentaire de @bryan sur cette réponse, et cette question/réponse vous devrez peut-être exécuter les deux git gc --prune=now y git remote prune origin . L'exécution de la première a toujours fonctionné pour moi, mais d'après les réponses des gens, je pense que les deux sont nécessaires pour traiter les différentes causes de l'erreur.

Nous avons utilisé :

git gc --prune=now

Cela supprime tous les objets de référence en double, ce qui devrait résoudre le problème.

Voici quelques liens où vous pouvez en apprendre davantage sur les références git et l'élagage. :

Conseil git de la semaine

Documentation sur git-prune

Références git

2 votes

Cela a fonctionné pour moi aussi, même message, Sourcetree sur Windows 7

2 votes

Je viens de commencer à avoir ce problème également. Merci beaucoup ! Ça a marché parfaitement !

37 votes

Peut avoir besoin de ces deux commandes : git gc --prune=now git remote prune origin de stackoverflow.com/questions/2998832/

353voto

Edward Yang Points 2021

J'ai résolu le problème comme suit :

git remote prune origin

9 votes

Eurêka ! Cela a effectivement fonctionné. Cela a quelque chose à voir avec les branches renommées à distance ou quelque chose comme ça. Je ne vais pas essayer de l'expliquer.

15 votes

Ça l'a fait pour moi, git gc --prune=now n'a rien fait

4 votes

Même chose. Cela fonctionne pour moi. git gc --prune=now n'a pas fonctionné pour moi.

81voto

T.Moez Points 421

Avec la commande en ligne gitbach, utilisez git update-ref pour mettre à jour la référence de votre branche locale :

$ git update-ref -d refs/remotes/origin/[locked branch name]

puis tirez en utilisant $ git pull

[locked branch name] est le nom de la branche dans laquelle l'erreur se produit en raison de la non-concordance des ID de commit.

41voto

Problème

Utilisateurs de Windows peuvent souvent avoir ce problème

git pull 

donne l'erreur : error: cannot lock ref unable to update local ref

Cause

Cause a) Il existe de multiples branches, dont les noms, du début jusqu'à une barre oblique (ou jusqu'à la fin), ne diffèrent que par les majuscules et les minuscules. .

Branch name clashing (upper/lower case)
#######################################

# Example 1)
#############################
feature/releasecandidate/fix123
feature/releaseCandidate/improveFeature789
------------------------
               ^
  Identical from beginning up to a slash (here the 2nd one)
  except for the marked letter, where the upper/lower case differs

# Example 2)
#############################
releaseBranch
releasebranch
-------------
       ^
  Identical from beginning to the end
  except for the marked letter

Cause b) C'est aussi un problème sous linux : Une branche est un préfixe d'une autre, avec une barre oblique de séparation. :

Prefix with slash-boundary
#######################################

# Example 1) - also a problem on linux
#############################
feature/release2021
feature/release2021/fixIssue07
                   ^
              slash boundary

# Example 2)
#############################
feature/release2022
feature/Release2022/fixIssue99
        ^          ^
  differing case   slash boundary
 (problem on 
   windows)

Solution

Retirer la cause (voir exact Cause ci-dessus).

# inspect your branches, to see if you have the upper/lower case problem
git ls-remote --heads YOUR-GIT-URL

Par exemple : créer une politique de nommage des branches, par exemple toutes les lettres en minuscules ; ou les lettres avant la dernière barre oblique en minuscules. Ou un crochet intelligent, qui détecte une violation. (mais attention : dans la cause a) le problème ne se pose que sous Windows, pas sous linux).

Contexte

Le problème est que Windows stocke ces branches (de l'exemple 1 et 2) dans le fichier .git dossier

# inspect the files/folders under
.git/refs/remotes/origin/

et en Cause a) Windows ne peut pas distinguer les différences entre les majuscules et les minuscules, donc git sur window devient fou.

En Cause b) vous ne pouvez pas avoir un dossier (par ex. feature/release2021/ ) avec le même nom qu'un fichier ( feature/release2021 ).

Solution de rechange

Une solution de contournement à court terme qui fonctionne souvent (jusqu'à ce que vous ayez éliminé la cause) est la suivante :

git pack-refs --all

# delete the contents of .git/refs/remotes/origin/*  
rm -rf .git/refs/remotes/origin/*

git pull; git pull; git pull   # all good? yes!

0 votes

Merci. C'est l'indice qui a finalement résolu le problème pour moi. Le référentiel sur lequel je travaillais a plusieurs années et il y a deux ans, quelqu'un a créé une branche appelée 'test'. La semaine dernière, une autre personne a créé une branche appelée 'Test/[nouvelle branche]'. Windows n'a pas pu créer un répertoire nommé 'Test' car la branche 'test' existe déjà. J'ai renommé la branche 'test' en Test/[quelque chose d'utile] et le problème a été résolu.

0 votes

Merci, cela ne se produit que sous Windows pour moi.

26voto

Babak Points 199

Essayez d'utiliser cette commande dans le dossier racine de votre dépôt git :

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

0 votes

Où se trouve ce dossier sous Windows ?

0 votes

Je l'ai trouvé. C'est le répertoire dans lequel tu as cloné

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X