Git et méchant "erreur: impossible de verrouiller les informations / références existantes fatales"

361

Après le clonage à partir du référentiel git distant (à bettercodes), j'ai apporté quelques modifications, je me suis engagé et j'ai essayé de pousser:

git push origin master

Erreurs avec:

erreur: impossible de verrouiller les informations / références existantes
fatales: échec de git-http-push

Ce cas concerne le référentiel déjà existant.

Ce que j'ai fait auparavant, c'était:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. changer les données
  6. git commit

Chez 'bettercodes', je n'ai pas accès à git log.

J'utilise Windows. L'erreur détaillée était:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:[email protected]/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

J'ai cloné avant, puis changé le code et commis.

AnnD
la source
Pas de chance, encore la même erreur.
AnnD
Deux raisons possibles: a) Une autre instance de git est en cours d'exécution (tuer tous les processus git ou redémarrer) b) Le dossier .git a été créé en tant qu'administrateur (essayez la ligne de commande administrateur pour l'opération)
FractalSpace
Pour moi, j'ai résolu l'erreur en appelant git fetchavant git pull.
Levi Fuller
1
Cette erreur désagréable
RobW

Réponses:

688

Pour moi, cela a fonctionné:

git remote prune origin

Étant donné que cette réponse semble aider beaucoup de gens, j'ai creusé un peu dans ce qui se passe réellement ici. Cela supprimera les références aux branches distantes du dossier .git/refs/remotes/origin. Cela n'affectera donc pas vos succursales locales et cela ne changera rien à distance, mais cela mettra à jour les références locales que vous avez aux succursales distantes. Il semble que dans certains cas, ces références peuvent contenir des données que Git ne peut pas gérer correctement.

arno_v
la source
1
J'ai ajouté quelques informations de fond, mais je dois dire honnêtement que je ne sais pas exactement pourquoi et comment cela fonctionne :)
arno_v
1
git remote prune origin work for me. Mais j'ai supprimé toutes les références dans .git / refs / remotes / origin.
Isuru Madusanka
2
C'est exactement ce que gitsuggère de faire, mais j'étais réticent à le faire car la commande sonne comme si elle faisait quelque chose à la télécommande.
Compte à jeter
4
J'ai courugit gc --prune=now
Stanley Mohlala le
9
Ceci est le cmd git le plus SCARIEST que j'ai exécuté depuis un moment. (PS: cela a fonctionné)
Sam Thiru
457

Vous voulez essayer de faire:

git gc --prune=now

Voir https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

kiran.gilvaz
la source
--Prune = est-il maintenant le même que --prune = all? Si tel est le cas, la documentation vous avertit que vous risquez de perdre des objets non ancrés. S'il y a des objets non ancrés, vous devriez probablement essayer de les réconcilier avant l'élagage.
Assaf Israel
3
Épargnant de vie, merci. git pulla été bloqué avec le message d'erreur similaire.
Phil Brubaker
4
Cela a aidé à l'exception "git error: can't lock ref" lors de la récupération. Merci beaucoup!
Alexander
9
Cela a fonctionné pour moi. Mais j'ai dû continuer à exécuter la même commande chaque fois que j'utilise une gitcommande qui traite de la télécommande. git remote prune originrésolu le problème une fois pour toutes.
Keyur Golani
sauvé ma journée! Merci beaucoup :)
Abhishek Gautam
188

Cela m'est arrivé lorsque ma télécommande git (bitbucket.org) a changé son adresse IP. La solution rapide consistait à supprimer et à rajouter la télécommande, puis tout fonctionnait comme prévu. Si vous ne savez pas comment supprimer et rajouter une télécommande dans git, voici les étapes:

  1. Copiez l'URL git SSH de votre télécommande existante. Vous pouvez l'imprimer sur le terminal à l'aide de cette commande:

    git remote -v

qui imprimera quelque chose comme ceci:

 origin [email protected]:account-name/repo-name.git (fetch)
 origin [email protected]:account-name/repo-name.git (push)
  1. Retirez la télécommande de votre dépôt git local:

    git remote rm origin

  2. Ajoutez la télécommande à votre référentiel local:

    git remote add origin [email protected]:account-name/repo-name.git

johnnyclem
la source
8
J'ai essayé tout le reste, comme git gc, git prune, rm 'file with lock error', git update server info, etc. Seule cette réponse a fonctionné pour moi. Parfois, c'est comme un redémarrage de Windows, redémarrez et cela fonctionnera. Même chose ici, il suffit de retirer et d'ajouter à nouveau le dépôt, et tout se passe bien;)
Marquinho Peli
12
Après la procédure ci-dessus, j'ai également dû dire à git de suivre à nouveau la branche distante avec par exemple:git branch -u origin/master
fotinsky
Cela a fait exploser toutes mes informations de suivi à distance dans .git / config et n'a pas fonctionné.
ThomasMcLeod
Cela a également fonctionné pour moi. Tous les autres n'ont pas fonctionné.
dondrzzy
42

L'exécution de la commande l'a git update-ref -d refs/heads/origin/branchcorrigé.

akansh tayal
la source
4
Cette commande a également fait l'affaire pour moi, bien que ma référence de branche distante soit légèrement différente:git update-ref -d refs/remotes/origin/my_branch
ndeslandes
Cela a fonctionné pour moi, il semble que ce soit un problème de sensibilité à la casse. Il y avait deux branches avec le même nom qui ont été poussées à l'origine par un autre utilisateur de git, une avait toutes des minuscules et une qui était une casse de titre.
th3uiguy
24

J'ai corrigé cela en procédant comme suit

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Cela en supposant que vos branches locales et distantes sont alignées et que vous obtenez simplement l'erreur refs comme non fatale.

FrankMonza
la source
12

J'ai eu ce problème parce que j'étais sur une branche qui avait un nom similaire à une branche en amont. c'est-à-dire que la branche en amont a été appelée example-branchet ma branche locale a été appelée example-branch/backend. La solution consistait à changer le nom de ma succursale locale comme suit:

git branch -m <new name goes here>
George Armstrong
la source
12

Ce qui a fonctionné pour moi, c'est:

  1. Retirer .git/logs/refs/remotes/origin/branch
  2. Retirer .git/refs/remotes/origin/branch
  3. Courir git gc --prune=now
emirc
la source
1
A fonctionné comme un charme. Si quelqu'un est confronté à un problème avec la branche de nom de fichier / dossier, il se réfère en fait à tous les fichiers / dossiers de nom de branche. J'espère que ça aide!
Ankit Kesharwani
11

Ceci est probablement résolu maintenant. Mais voici ce qui a fonctionné pour moi.

  1. Emplacement:

    • Si le référentiel verrouillé se trouve côté serveur:

      1. ssh dans votre dépôt git sur le serveur.
      2. Connectez-vous en tant qu'utilisateur autorisé à modifier le référentiel et accédez au référentiel sur votre serveur.
    • Si le référentiel verrouillé est local uniquement:

      1. Ouvrez la console git et accédez au répertoire du référentiel.
      2. Exécutez cette commande:

        git update-server-info
        
  2. Corrigez les autorisations sur votre référentiel (distant ou / et local) si vous le devez. J'ai eu dans mon cas chmodà 777et chownàapache:apache

  3. Essayez de pousser à nouveau à partir du référentiel local:

    git push
    
WolfTail
la source
7

Voilà comment cela fonctionne pour moi.

  1. recherchez le fichier de verrouillage Apache DAV sur votre serveur (par exemple / var / lock / apache2 / DAVlock)
  2. supprime-le
  3. recréer avec des autorisations d'écriture pour le serveur web
  4. redémarrez le serveur web

Alternative encore plus rapide:

  1. recherchez le fichier de verrouillage Apache DAV sur votre serveur (par exemple / var / lock / apache2 / DAVlock)
  2. Videz le fichier: cat /dev/null > /var/lock/apache2/DAVlock
  3. redémarrez le serveur web
schmunk
la source
C'était mon problème. Merci pour le post. J'ai exécuté la suppression et les autorisations en une seule fois. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

Cela ressemble à un problème d'autorisations - est-il possible que deux fenêtres soient ouvertes, exécutées avec des droits distincts? Vérifiez peut-être la propriété du dossier .git.

Vérifiez peut-être s'il y a un verrou de fichier en cours ouvert, utilisez peut-être lsof pour vérifier, ou l'équivalent pour votre système d'exploitation.

Josh
la source
3

Dans mon cas, une branche a été déplacée vers un sous-répertoire et le répertoire a été appelé comme branche. Git était confus par cela. Lorsque j'ai supprimé la branche locale (dans SourceTree avec un clic droit supprimer), tout a fonctionné comme d'habitude.

CodingYourLife
la source
3

Dans mon cas, après avoir reçu ce message, j'ai fait la commande de paiement et j'ai reçu ce message:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Après avoir exécuté cette commande, j'étais revenu à la normale.

Colin
la source
2

Mise à jour:

Vous devrez peut-être modifier votre fichier ~ / .netrc:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Réponse originale:

Pourquoi avez-vous désactivé SSL? Je pense que cela pourrait être dû au fait que vous ne pouvez pas pousser via https. Je le reculerais et j'essaierais de pousser encore:

git config –global http.sslVerify true
ralphtheninja
la source
1

Vérifiez que vous (processus git en fait) avez accès au fichier .git/info/refset que ce fichier n'est pas verrouillé par un autre processus.

Ivan Danilov
la source
2
Comment vérifiez-vous cela?
Iulian Onofrei
1

J'ai eu ce problème lorsque j'essayais de créer une nouvelle branche de fonctionnalité contenant le nom de l'ancienne branche, par exemple origin - branch1 et je voulais créer une branche1. Ce n'était pas possible, mais la fonction branch1 / était déjà.

user11464384
la source
1

Dans mon cas, j'ai dû supprimer manuellement les anciennes balises qui avaient été supprimées à distance.

joliejuly
la source
1

Dans mon cas, c'était lié au nom de la branche que j'avais déjà créé.

Pour résoudre le problème, j'ai créé une branche avec le nom qui ne devrait certainement pas exister, comme:

git checkout -b some_unknown_branch

Ensuite, j'ai effacé toutes mes autres branches (non actives) car elles n'étaient que des ordures inutiles.

git branch | grep -v \* | grep -v master | xargs git branch -D

puis renommé ma branche actuelle avec le nom que je voulais, comme:

git checkout -m my_desired_branch_name
Arsen Khachaturyan
la source
0

Dans le cas de bettercodes.org, la solution est plus poétique - le seul problème peut être dans les droits attribués aux membres du projet. Les membres simples n'ont pas de droits d'écriture! Veuillez vous assurer que vous disposez des droits de modérateur ou d'administrateur. Cela doit être défini sur bettercodes.org dans les paramètres du projet par un administrateur, bien sûr.

yman
la source
0

J'ai vu cette erreur lors de la tentative d'exécution git filter-branchpour détacher de nombreux sous-répertoires dans un nouveau référentiel séparé (comme dans cette réponse ).

J'ai essayé toutes les solutions ci-dessus et aucune d'entre elles n'a fonctionné. Finalement, j'ai décidé que je n'avais pas vraiment besoin de conserver mes balises dans la nouvelle branche et j'ai simplement exécuté:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
tessafyi
la source
0

Voici ce que j'ai fait pour me débarrasser de tous les problèmes de référence de verrouillage:

git gc --prune=now
git remote prune origin

C'est probablement ce que vous n'avez qu'à faire aussi.

aliibrahim
la source