Git et méchante “erreur: impossible de verrouiller les infos / refs existantes fatales”

Après avoir cloné à partir du repository GIT distant (à bettercodes), j’ai apporté quelques modifications, engagé et essayé de pousser:

git push origin master 

Erreurs avec:

erreur: impossible de verrouiller les infos / références existantes
fatal: git-http-push a échoué

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

Ce que j’ai fait avant, 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

À «bettercodes», je n’ai pas access à 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:password@git.bettercodes.org/myproject/info/ error: cannot lock existing info/refs fatal: git-http-push failed 

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

Vous voulez essayer de faire:

 git gc --prune=now 

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

Pour moi cela a fonctionné:

git remote prune origin

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

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

  1. Copiez l’URL SSH git de votre télécommande existante. Vous pouvez l’imprimer sur le terminal en utilisant cette commande:

    git remote -v

qui imprimera quelque chose comme ceci:

  origin git@server-address.org:account-name/repo-name.git (fetch) origin git@server-address.org:account-name/repo-name.git (push) 
  1. Supprimez la télécommande de votre repository git local:

    git remote rm origin

  2. Ajoutez la télécommande à votre repo local:

    git remote add origin git@server-address.org:account-name/repo-name.git

J’ai corrigé cela en faisant ce qui 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 

Ceci en supposant que vos twigs locales et distantes sont alignées et que vous obtenez simplement l’erreur de référence comme étant non fatale.

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

  1. Emplacement:

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

      1. ssh vers votre repository 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 uniquement local:

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

         git update-server-info 
  2. Corrigez les permissions sur votre référentiel (distant ou / et local) si nécessaire. Dans mon cas, je devais chmod à 777 et chown à apache:apache

  3. Essayez de pousser à nouveau depuis le référentiel local:

     git push 

C’est comme ça que ça marche pour moi.

  1. Recherchez le fichier de locking Apache DAV sur votre serveur (par exemple / var / lock / apache2 / DAVlock)
  2. supprime-le
  3. recréez-le avec des permissions d’écriture pour le serveur Web
  4. redémarrer le serveur Web

Alternative encore plus rapide:

  1. Recherchez le fichier de locking Apache DAV sur votre serveur (par exemple / var / lock / apache2 / DAVlock)
  2. Videz le fichier: cat /dev/null > /var/lock/apache2/DAVlock
  3. redémarrer le serveur Web

Cela ressemble à un problème de permissions – est-il possible que vous ayez deux fenêtres ouvertes, exécutant avec des droits séparés? Peut-être vérifier la propriété du dossier .git.

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

J’ai eu ce problème parce que j’étais sur une twig qui avait un nom similaire à une twig en amont. c’est-à-dire que la twig en amont était appelée example-branch et ma twig locale était appelée example-branch/backend . La solution changeait le nom de ma twig locale comme suit:

 git branch -m  

Dans mon cas, une twig a été déplacée dans un sous-répertoire et le répertoire a été appelé en tant que twig. Git était confus par cela. Lorsque j’ai supprimé la twig locale (dans SourceTree juste avec le clic droit sur delete), tout fonctionnait comme d’habitude.

Mettre à 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 avoir à faire avec vous ne pas être en mesure de pousser via https. Je l’ai remis en place et j’ai essayé de pousser à nouveau:

 git config –global http.sslVerify true 

Vérifiez que vous (git process réellement) avez access au fichier .git/info/refs et que ce fichier n’est pas verrouillé par un autre processus.

Dans le cas de bettercodes.org, la solution est plus poétique – le seul problème peut être lié aux droits atsortingbués aux membres du projet. Les membres simples n’ont pas de droits d’écriture! Assurez-vous d’avoir les droits de modérateur ou d’administrateur. Cela doit être défini sur bettercodes.org aux parameters du projet par un administrateur, bien sûr.

J’ai vu cette erreur en essayant d’exécuter git filter-branch pour 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 n’a fonctionné. Finalement, j’ai décidé que je n’avais pas besoin de conserver mes tags aussi mal dans la nouvelle twig et que je courais juste:

 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 

La commande en cours d’exécution git update-ref -d refs/heads/origin/branch corrigée.