Git und böser "Fehler: Vorhandene Informationen / Refs können nicht gesperrt werden fatal"


361

Nach dem Klonen aus dem Remote-Git-Repository (bei Bettercodes) habe ich einige Änderungen vorgenommen, festgeschrieben und versucht zu pushen:

git push origin master

Fehler mit:

Fehler: Vorhandene Informationen / Refs können nicht gesperrt werden
schwerwiegend: Git-http-Push fehlgeschlagen

Dieser Fall betrifft bereits vorhandenes Repository.

Was ich vorher getan habe, war:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. Daten ändern
  6. git commit

Bei 'bettercodes' habe ich keinen Zugriff auf das Git-Protokoll.

Ich benutze Windows. Der detaillierte Fehler war:

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

Ich habe vorher geklont, dann den Code geändert und festgeschrieben.


Kein Glück, wieder der gleiche Fehler.
AnnD

Zwei mögliche Gründe: a) Eine andere Instanz von Git wird ausgeführt (alle Git-Prozesse
beenden

Für mich entschlossen ich den Fehler durch den Aufruf git fetchvor git pull.
Levi Fuller

1
Dieser Fehler böse
RobW

Antworten:


684

Bei mir hat das geklappt:

git remote prune origin

Da diese Antwort vielen Menschen zu helfen scheint, habe ich mich ein wenig mit dem befasst, was hier tatsächlich passiert. Dadurch werden Verweise auf entfernte Zweige im Ordner entfernt .git/refs/remotes/origin. Dies wirkt sich also nicht auf Ihre lokalen Zweige aus und ändert nichts an entfernten Standorten. Es aktualisiert jedoch die lokalen Verweise, die Sie auf entfernte Zweigstellen haben. In einigen Fällen können diese Referenzen Daten enthalten, die Git nicht richtig verarbeiten kann.


1
Ich habe einige Hintergrundinformationen hinzugefügt, aber ich muss ehrlich sagen, dass ich nicht genau weiß, warum und wie das funktioniert :)
arno_v

1
Git Remote Prune Origin Arbeit für mich. Aber ich habe alle Verweise in .git / refs / remotes / origin gelöscht.
Isuru Madusanka

2
Dies ist genau das, was dies gitvorschlägt, aber ich wollte es nicht tun, da der Befehl so klingt, als würde er etwas mit der Fernbedienung tun.
Wegwerfen Konto

4
Ich liefgit gc --prune=now
Stanley Mohlala

9
Dies ist das SCARIEST git cmd, das ich seit einiger Zeit ausgeführt habe. (PS: es hat funktioniert)
Sa Thiru

456

Sie möchten versuchen:

git gc --prune=now

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


Ist --prune = jetzt dasselbe wie --prune = all? In diesem Fall warnt die Dokumentation, dass Sie möglicherweise nicht verankerte Objekte verlieren. Wenn es nicht verankerte Objekte gibt, sollten Sie wahrscheinlich versuchen, diese vor dem Beschneiden abzustimmen.
Assaf Israel

3
Lebensretter, danke. git pullwar mit der ähnlichen Fehlermeldung stecken.
Phil Brubaker

4
Es half bei der Ausnahme "Git-Fehler: Ref kann nicht gesperrt werden" beim Abrufen. Vielen Dank!
Alexander

9
Das hat bei mir funktioniert. Aber dann musste ich jedes Mal den gleichen Befehl ausführen, wenn ich einen gitBefehl verwende, der sich mit Remote befasst. git remote prune originDas Problem wurde ein für alle Mal behoben.
Keyur Golani

hat meinen Tag gerettet! Vielen Dank :)
Abhishek Gautam

188

Dies passierte mir, als meine Git-Fernbedienung (bitbucket.org) ihre IP-Adresse änderte. Die schnelle Lösung bestand darin, die Fernbedienung zu entfernen und erneut hinzuzufügen. Dann funktionierte alles wie erwartet. Wenn Sie nicht mit dem Entfernen und erneuten Hinzufügen einer Fernbedienung in Git vertraut sind, gehen Sie wie folgt vor:

  1. Kopieren Sie die SSH-Git-URL Ihrer vorhandenen Fernbedienung. Sie können es mit diesem Befehl auf dem Terminal drucken:

    git remote -v

das wird so etwas ausdrucken:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. Entfernen Sie die Fernbedienung von Ihrem lokalen Git-Repo:

    git remote rm origin

  2. Fügen Sie die Fernbedienung wieder zu Ihrem lokalen Repo hinzu:

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


8
Ich habe alles andere ausprobiert, wie git gc, git prune, rm 'Datei mit Sperrfehler', git Update Server-Informationen usw. Nur diese Antwort hat bei mir funktioniert. Manchmal ist es wie ein Windows-Neustart, ein Neustart und es wird funktionieren. Gleich hier, einfach entfernen und das Repo wieder hinzufügen, und alles geht gut;)
Marquinho Peli

12
Nach dem oben beschriebenen Verfahren musste ich git auch git branch -u origin/master
anweisen,

Dies hat alle meine Remote-Tracking-Informationen in .git / config weggeblasen und hat nicht wirklich funktioniert.
Thomas McLeod

Das hat auch bei mir funktioniert. Alle anderen haben nicht funktioniert.
Dondrzzy

42

Durch Ausführen des Befehls wurde das Problem git update-ref -d refs/heads/origin/branchbehoben.


4
Dieser Befehl hat auch für mich den Trick getan, obwohl meine Remote-Zweigstelle etwas anders war:git update-ref -d refs/remotes/origin/my_branch
Ndeslandes

Dies hat bei mir funktioniert, es scheint, dass dies ein Problem mit der Groß- und Kleinschreibung war. Es gab zwei Zweige mit demselben Namen, die von einem anderen Git-Benutzer zum Ursprung gebracht wurden, einer hatte alle Kleinbuchstaben und einer Titel.
th3uiguy

24

Ich habe dies behoben, indem ich Folgendes getan habe

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

Dies setzt voraus, dass Ihre lokalen und Remote-Zweige ausgerichtet sind und Sie nur den Refs-Fehler als nicht schwerwiegend erhalten.


12

Ich hatte dieses Problem, weil ich mich in einem Zweig befand, der einen ähnlichen Namen wie ein vorgelagerter Zweig hatte. dh die vorgelagerte Niederlassung wurde angerufen example-branchund meine lokale Niederlassung wurde angerufen example-branch/backend. Die Lösung bestand darin, den Namen meiner lokalen Niederlassung folgendermaßen zu ändern:

git branch -m <new name goes here>

11

Dies ist wahrscheinlich inzwischen behoben. Aber hier ist, was für mich funktioniert hat.

  1. Standort:

    • Wenn sich das gesperrte Repository auf der Serverseite befindet:

      1. ssh zu Ihrem Git-Repository auf dem Server.
      2. Melden Sie sich als Benutzer an, der über Berechtigungen zum Ändern des Repositorys verfügt, und navigieren Sie zum Repository auf Ihrem Server.
    • Wenn das gesperrte Repository nur lokal ist:

      1. Öffnen Sie die Git-Konsole und navigieren Sie zum Repository-Verzeichnis.
      2. Führen Sie diesen Befehl aus:

        git update-server-info
        
  2. Korrigieren Sie die Berechtigungen für Ihr (Remote- oder / und lokales) Repository, falls erforderlich. In meinem Fall musste ich chmodauf 777und chownzuapache:apache

  3. Versuchen Sie erneut, aus dem lokalen Repository zu pushen:

    git push
    

11

Was für mich funktioniert hat war:

  1. Entfernen .git/logs/refs/remotes/origin/branch
  2. Entfernen .git/refs/remotes/origin/branch
  3. Lauf git gc --prune=now

1
Lief wie am Schnürchen. Wenn jemand Probleme mit dem Zweig des Datei- / Ordnernamens hat, bezieht er sich tatsächlich auf alle Filialnamensdateien / -ordner. Ich hoffe das hilft!
Ankit Kesharwani

7

So funktioniert es bei mir.

  1. Suchen Sie die Apache DAV-Sperrdatei auf Ihrem Server (z. B. / var / lock / apache2 / DAVlock).
  2. Lösche es
  3. Erstellen Sie es mit Schreibberechtigungen für den Webserver neu
  4. Starten Sie den Webserver neu

Noch schnellere Alternative:

  1. Suchen Sie die Apache DAV-Sperrdatei auf Ihrem Server (z. B. / var / lock / apache2 / DAVlock).
  2. Leeren Sie die Datei: cat /dev/null > /var/lock/apache2/DAVlock
  3. Starten Sie den Webserver neu

Das war mein Problem. Danke für den Beitrag. Ich habe das Entfernen und die Berechtigungen auf einmal ausgeführt. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely

6

Dies klingt nach einem Berechtigungsproblem. Ist es möglich, dass zwei Fenster geöffnet waren und mit separaten Rechten ausgeführt wurden? Überprüfen Sie möglicherweise den Besitz des .git-Ordners.

Überprüfen Sie möglicherweise, ob eine ausstehende Dateisperre geöffnet ist, verwenden Sie möglicherweise lsof, um zu überprüfen, oder das Äquivalent für Ihr Betriebssystem.


3

In meinem Fall wurde ein Zweig in ein Unterverzeichnis verschoben und das Verzeichnis als Zweig aufgerufen. Git war davon verwirrt. Als ich den lokalen Zweig löschte (in SourceTree nur mit der rechten Maustaste auf Löschen), funktionierte alles wie gewohnt.


3

In meinem Fall habe ich nach Erhalt dieser Nachricht den Befehl zum Auschecken ausgeführt und die folgende Nachricht erhalten:

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

Nachdem ich diesen Befehl ausgeführt hatte, war ich wieder normal.


2

Aktualisieren:

Möglicherweise müssen Sie Ihre ~ / .netrc-Datei bearbeiten:

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

Ursprüngliche Antwort:

Warum hast du ssl deaktiviert? Ich denke, das hat möglicherweise damit zu tun, dass Sie nicht über https pushen können. Ich würde es zurücksetzen und versuchen, noch einmal zu pushen:

git config –global http.sslVerify true

1

Stellen Sie sicher, dass Sie (Git-Prozess tatsächlich) Zugriff auf die Datei haben .git/info/refsund diese Datei nicht von einem anderen Prozess gesperrt wird.


2
Wie überprüfen Sie das?
Iulian Onofrei

1

Ich hatte dieses Problem, als ich versuchte, einen neuen Feature-Zweig zu erstellen, der den Namen des alten Zweigs enthielt, z. B. origin - branch1, und ich wollte branch1-feature erstellen. Es war nicht möglich, aber branch1 / feature war es bereits.


1

In meinem Fall musste ich alte Tags, die auf der Fernbedienung entfernt wurden, manuell löschen.


1

In meinem Fall war es mit dem Filialnamen verbunden, den ich bereits erstellt hatte.

Um das Problem zu beheben, habe ich einen Zweig mit dem Namen erstellt, der mit Sicherheit nicht existieren sollte, wie:

git checkout -b some_unknown_branch

Dann habe ich alle meine anderen Zweige (nicht aktiv) gelöscht, weil sie nur unnötiger Müll waren.

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

und benannte dann meinen aktuellen Zweig mit dem Namen um, den ich beabsichtigt hatte, wie:

git checkout -m my_desired_branch_name

0

Im Fall von bettercodes.org ist die Lösung poetischer - das einzige Problem können die Rechte sein, die den Projektmitgliedern zugewiesen wurden. Einfache Mitglieder haben keine Schreibrechte! Bitte stellen Sie sicher, dass Sie über die Moderator- oder Administratorrechte verfügen. Dies muss natürlich von einem Administrator auf bettercodes.org in den Projekteinstellungen festgelegt werden.


0

Ich habe diesen Fehler gesehen, als ich versucht habe git filter-branch, viele Unterverzeichnisse in ein neues, separates Repository zu trennen (wie in dieser Antwort) ).

Ich habe alle oben genannten Lösungen ausprobiert und keine davon hat funktioniert. Schließlich entschied ich, dass ich meine Tags in der neuen Filiale nicht so schlecht aufbewahren musste und lief einfach:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.