Git Pull schlägt fehl "Referenz kann nicht aufgelöst werden" "Lokale Referenz kann nicht aktualisiert werden"

606

Wenn ich mit git 1.6.4.2 a ausprobiere, erhalte git pullich folgenden Fehler:

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)

Ich habe es versucht git remote prune origin, aber es hat nicht geholfen.

Gabrielle
quelle

Antworten:

929

Bereinigen Sie Ihr lokales Repository mit:

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

Mann 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.

Mann 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
quelle
96
Warum funktioniert das? Was ist das Problem, das es behebt?
Ikke
5
Der zweite Befehl hat bei mir funktioniert. Anscheinend hatte ich einen fehlerhaften Verweis auf einen Remote-Zweig, der gerade erstellt wurde. Ich bin mir nicht sicher, wie es passiert ist, aber ich bin froh, dass es eine einfache Lösung war. Danke Vitek!
JGTaylor
1
Das hat perfekt funktioniert! Ich würde auch gerne erklären, was dies bewirkt und warum dies funktioniert. Vielen Dank!
ArielSD
4
Wird der git remote prune originBefehl auf meiner lokalen Arbeitskopie oder im Remote-Repository ausgeführt?
user1438038
3
@ user1438038 Es sollten keine Zweige entfernt und nur Remote-Referenzen in Ihrer lokalen Arbeitskopie aktualisiert werden. Weitere Infos hier: stackoverflow.com/questions/20106712/…
Zengineer
606

Ist mir auch passiert. In meinem Fall war der schlechte Schiedsrichter Meister, und ich habe Folgendes getan:

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

Dadurch konnte git die Referenzdatei wiederherstellen. Danach funktionierte alles wieder wie erwartet.

Michel Krämer
quelle
1
Ich habe das Gleiche getan und es hat mein Problem gelöst. Als ich die Datei in Notepad ++ öffnete, war sie eindeutig beschädigt.
theMayer
83
Stellen
6
@ bia.migueis: Es wird nichts beschädigen, wenn Sie versehentlich auch den Master entfernen - es wird auch beim nächsten Abruf aktualisiert.
naught101
2
Wenn es sich um ein Submodul handelt, kann es etwas schwierig sein, die Referenz zu finden. Überprüfen Sie zunächst, ob .gites sich um einen Ordner handelt. ls -laWenn nicht, überprüfen Sie den Inhalt der .gitDateidatei, um den tatsächlichen .git-Ordner zu finden, in dem sich die Refs befinden. .gitDateiinhalt in meinem Fall: gitdir: ../.git/modules/my-submodule-name
CCoder
1
Im vergangenen Jahr bin ich zweimal zurückgekommen, um dies zu beheben, und wieder ist dies die einzige Lösung, die tatsächlich funktioniert.
Ted
131

Das hat den Job für mich gemacht:

git gc --prune=now
Bernd
quelle
5
Das hat funktioniert. Danke, dass du meinen Tag gerettet hast! @Bernd Irgendeine mögliche Erklärung des Befehls?
Nashcheez
Git GC-Dokumente sind hier
BigRon
1
Hat auch für mich gearbeitet. Musste nicht laufengit remote prune origin
Airwavezx
87

Bei mir hat es funktioniert, die Dateien, die Fehler auslösen, aus dem Ordner zu entfernen .git/refs/remotes/origin/.

Brian van Rooijen
quelle
das hat es geschafft! Aber wissen Sie aus Neugier, warum dieser Fehler aufgetreten ist? (Alles hat gut funktioniert und dann tauchte eines Tages plötzlich dieser Fehler auf). Und wissen Sie auch, wie das Löschen der Datei das Problem gelöst hat?
Shreyans
Gut zu hören, dass dies auch für Sie behoben wurde. Um ehrlich zu sein, habe ich keine Ahnung, was den Fehler verursacht hat. Mein Gedanke war, dass eine der Dateien im Ordner nicht mehr synchron war. Da keine der anderen Korrekturen, die ich gefunden habe, für mich funktioniert hat, habe ich dies als letzten Ausweg verwendet.
Brian van Rooijen
Hat super funktioniert! Beachten Sie, dass Sie alle Dateien löschen müssen, die das Problem verursacht haben (basierend auf dem Fehlerbericht, den Sie erhalten), als ob Sie nur eine löschen und versuchen, sie abzurufen.
Rayee Roded
1
Eine der möglichen Ursachen kann der Systemabsturz sein, wie ich in meiner Antwort beschrieben habe . Viele Git-GUI-Anwendungen führen Git regelmäßig auf Ihrem Repo aus (um den Status zu aktualisieren). Wenn Ihr System abstürzt, während Git mit den Referenzen manipuliert, werden sie möglicherweise mit NULLs neu geschrieben.
David Ferenczy Rogožan
53

Versuch es:

git gc --prune=now

git remote prune origin

git pull
Annelorayne
quelle
26
Dies könnte zwar die Frage der Autoren beantworten, es fehlen jedoch einige erklärende Wörter und / oder Links zur Dokumentation. Rohcode-Schnipsel sind ohne einige Ausdrücke nicht sehr hilfreich. Möglicherweise ist es auch sehr hilfreich , eine gute Antwort zu schreiben . Bitte bearbeiten Sie Ihre Antwort.
Roy Scheffers
Genau der Punkt. Es reicht nicht aus, den Code zu korrigieren, und das war's. Ich hoffe, es gibt eine Erklärung
Musikero31
1
git gc --prune = aktualisiert jetzt das lokale Repository, während unnötige Dateien gelöscht werden. Es funktioniert gut für mich.
Vasyl Gutnyk
44

Führen Sie die folgenden Befehle aus:

rm .git/refs/remotes/origin/master

git fetch

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

Nur für den Fall, wenn Sie wissen müssen, was ist .git/refs/remotes/origin/master, lesen Sie den Abschnitt " Fernbedienungen " in Git-Referenzen .

Matias Sebastiao
quelle
1
Können Sie erklären, was .git / refs / remotes / origin / branchName ist? Diese Lösung hat bei mir
funktioniert
44

Ich möchte nur hinzufügen, wie es passieren kann, dass eine Referenz bricht.

Mögliche Grundursache

Auf meinem System (Windows 7 64-Bit), wenn ein BSOD passiert , einige der gespeicherten Referenzdateien (zur Zeit höchstwahrscheinlich geöffnet / werden geschrieben in , wenn BSOD geschehen) mit überschrieben NULLZeichen (ASCII 0) gewonnen .

Wie bereits erwähnt, reicht es zur Behebung aus, nur diese ungültigen Referenzdateien zu löschen und das Repository erneut abzurufen oder abzurufen.

Beispiel

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

Lösung: Löschen Sie die Datei%repo_root%/.git/refs/remotes/origin/some/branch

David Ferenczy Rogožan
quelle
1
Gleiches Szenario unter Windows 10 64-Bit - Arbeiten in einem Git-Repo, wenn BSOD auftritt. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Der Versuch git pullnach dem Löschen der ersten zurückgegebenen Datei fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Nach dem Löschen war die zweite Datei git pull origin mastererfolgreich.
cjmcdonn
39

Ich hatte das gleiche Problem und löste es, indem ich zu der Datei ging, in der es fehlerhaft war:

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

Diese Datei war voller Nullen, ich habe sie durch die neueste Referenz von github ersetzt.

Noel Tock
quelle
2
Hatte das gleiche Problem, aber die Datei .git/refs/remotes/origin/masterwar nur leer. Das Problem wurde durch Entfernen behoben.
Zinovyev
38

In meinem Fall wurde das Problem behoben, nachdem ich alle entfernten Referenzdateien im Verzeichnis gelöscht habe .git .

Wenn Sie sich die Nachricht ansehen, erfahren Sie, welche Dateien Sie (speziell) löschen müssen.

Die zu löschenden Dateien befinden sich unter .git/refs/remotes .

Ich habe gerade alle Dateien dort gelöscht und gc prune ausgeführt

git gc --prune=now

Danach funktioniert alles einwandfrei.

Uri Shtand
quelle
In meinem Fall lösche ich einfach .git / refs / remotes und aktualisiere und schiebe den Server und es hat funktioniert.
Faraz Ahmed
Danke Uri. In meinem Fall habe ich gerade Dateien unter refs / remotes / origin / feature gelöscht und einfach - git pull
Deepboy
26

Erläuterung : Es scheint, dass Ihre Remote-Repo-Zweige (in Github / Bitbucket) entfernt wurden, obwohl Ihre lokalen Referenzen nicht aktualisiert wurden und auf nicht vorhandene Referenzen verweisen.

Um dieses Problem zu lösen:

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

Für zusätzliche Lektüre - Referenz aus der Github-Dokumentation :

git-fetch - Laden Sie Objekte und Refs aus einem anderen Repository herunter

--all Holt alle Fernbedienungen.

--prune Entfernen Sie nach dem Abrufen alle auf der Fernbedienung nicht mehr vorhandenen Fernverfolgungszweige .

avivamg
quelle
1
Das hat bei mir
funktioniert
1
Danke, es hat bei mir funktioniert.
Sam
17

git fetch --prune Dieser Fehler wurde für mich behoben:

[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

Dies setzt jedoch voraus, dass der fehlerhafte Zweig auf der Fernbedienung gelöscht wurde.

Marczych
quelle
Ihr Beispiel scheint unvollständig zu sein: Es zeigt nicht das --prune, was ich sehen kann. Auch proTip: Entfernen Sie nach dem Einfügen von Beispielen unbrauchbare Passwortabfragen.
MarkHu
Sie haben absolut Recht - ich habe die Ausgabe des Abrufbefehls weggelassen, aber ich habe sie nur in das Beispiel eingefügt. Vielen Dank für den Tipp zum Entfernen der Passwortabfrage!
Marczych
11

Wenn dieser Fehler "Lokale Referenz kann nicht aktualisiert werden" erneut auftritt, haben Sie möglicherweise eine schlechte Referenz in Ihrem lokalen UND-Master-Repository , selbst nachdem Sie entweder die Antwort von Vojtech Vitek oder Michel Krämer angewendet haben.

In diesem Fall sollten Sie beide Fixes anwenden, ohne dazwischen zu ziehen oder zu drücken ...

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

Eine dauerhafte Lösung wurde für mich erst erreicht, nachdem beide Fixes vor dem Drücken / Ziehen angewendet wurden.

Inyoka
quelle
1
Danke dafür. Beachten Sie, dass ich 'master' durch den fehlgeschlagenen Zweig ersetzt habe, z. B. - rm .git / refs / remotes / origin / development
Damien Sawyer
1
Vielen Dank für Ihre Antwort, wirklich geholfen!
Naffiq
1
Das hat bei mir
funktioniert
10

Um dies in Kürze zu beantworten, tritt dieses Problem auf, wenn Ihr lokaler Benutzer einige Informationen über die Fernbedienung hat und jemand etwas ändert, wodurch die Fernbedienung und Ihre Änderungen unsynchronisiert werden.

Ich habe dieses Problem erhalten, weil jemand den Remote-Zweig gelöscht und erneut mit demselben Namen erstellt hat.

Um solche Probleme zu beheben, ziehen oder holen Sie von der Fernbedienung.

git remote prune origin

oder wenn Sie eine GUI verwenden, führen Sie einen Abruf von der Fernbedienung durch.

Geben Sie hier die Bildbeschreibung ein

Abhijeet Kamble
quelle
3

Ich konnte damit arbeiten

git remote update --prune
user1238353
quelle
3

Versuche dies:

git pull origin Branch_Name

Branch_Name, der Zweig, in dem Sie sich gerade befinden.

Wenn Sie nur eine git pull ausführen, werden auch alle anderen erstellten Zweigstellennamen abgerufen.

Ist der Grund, warum Sie dies bekommen:

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

Für mich hatte ich einen lokalen Zweig namens feature/phase2und der entfernte Zweig wurde benannt feature/phase2/data-model. Der Namenskonflikt war die Ursache des Problems, daher habe ich meinen lokalen Zweig gelöscht (Sie können ihn umbenennen, wenn er etwas enthält, das Sie behalten müssen).

Nathan Wallace
quelle
Das gleiche Problem hier - unser Problem war auch ein Problem bei der Benennung von Mac / PC-Gehäusen, das es schwierig machte, es zu erkennen (ein Name wurde groß geschrieben, der andere nicht - und es funktionierte auf dem PC, aber nicht auf dem Mac)
rocksteady
2

Wenn es git gc --prune=nowdir nicht hilft. (Pech wie ich)

Ich habe das Projekt lokal entfernt und das gesamte Projekt erneut geklont.

Eric Chen
quelle
Dies ist ein "Ich habe eine Fehlermeldung erhalten, also habe ich mir einen neuen Computer gekauft" -Ansatz, von dem ich nicht erwartet hatte, dass er auf dieser Website Upvotes erhält.
Stephan Vierkant
2

Ich benutze Tower und aus irgendeinem Grund war mein Ordnername .git/refs/remotes/origin/Github. Durch Ändern in Kleinbuchstaben wurde .git/refs/remotes/origin/githubdas Problem behoben.

split19
quelle
1

Ich hatte das gleiche Problem. Ich folge folgenden Schritten

1) Wechseln Sie Ihren Zweig, der ein Problem hat, zu einem anderen Zweig

2) Löschen Sie diesen Zweig

3) erneut auschecken.

Hinweis: - Sie können nicht festgeschriebene Änderungen aufbewahren und wieder zurücksetzen.

user2619659
quelle
1

Ich habe verwendet git prune originund das hat die Arbeit gemacht.

TheFakeCake
quelle
0

Ich hatte das gleiche Problem mit dem Composer-Update. Aber für mich hat es erst funktioniert, nachdem ich den Composer-Cache geleert und den Inhalt des Vendor-Ordners gelöscht habe:

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package
Ownking
quelle
0

Beim Versuch, aus einer git bundleerstellten Datei zu klonen, trat dieses Problem auf. Keine der anderen Antworten funktionierte, da ich das Repo nicht klonen konnte (daher kam das git gcEntfernen / Bearbeiten von Dateien nicht in Frage).

Es gab jedoch eine andere Möglichkeit, dies zu beheben - die Quelldatei einer .bundleDatei begann mit:

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

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

Durch einfaches Entfernen der vierten Zeile mit vim wurde das Problem behoben.

Krzysztof Bociurko
quelle
0

Ich hatte dieses Problem bei der Verwendung von SourceTree. Ich versuchte erneut zu ziehen und es funktionierte. Ich glaube, ich habe zu schnell Zweige (Kasse) verhext :).

Meine Situation unterscheidet sich ein wenig von der des Posters, da mein Repository relativ kooperativ war und keine offensichtliche Korruption aufwies.

Pysis
quelle
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
quelle
0

Beim Löschen und Erstellen des Repositorys mit demselben Namen trat dasselbe Problem auf. Es hat nur funktioniert, wenn ich die Remote-URL wie unten zurückgesetzt habe.

git remote set-url origin [GIT_REPO_URL]

Überprüfen Sie die Remote-URL:

git remote -v

Jetzt sollten alle Befehle wie gewohnt funktionieren.

Ricky Boy
quelle
0

Bin gerade auf das Problem gestoßen.

Fehlerbehebungsmethode: Mit SourceTree auf Windows-Servern können Sie versuchen, es als Administrator auszuführen. Das behebt mein Problem, dass die lokale Referenz in Atlassian Source Tree 2.1.2.5 unter Windows Server 2012 R2 in der Domäne nicht aktualisiert werden kann.

Wenn Sie diese Situation auch replizieren können, zeigt dies, dass das Problem durch ein Berechtigungsproblem verursacht wird. Es ist besser, einen Drilldown durchzuführen und die Hauptursache zu finden - wahrscheinlich gehören einige bestimmte Dateien anderen Benutzern und dergleichen -, andernfalls gibt es einen unerwünschten Nebeneffekt: Sie müssen SourceTree für den Rest der Ewigkeit als Administrator ausführen.

Lionet Chen
quelle
Nun, ich würde das nicht empfehlen. Sie erhalten am Ende noch mehr Dateien mit falschen Berechtigungen. Und Sie müssen als Administrator alles ausführen, was mit Repository-Dateien manipuliert wird. Ist es nicht besser, die Berechtigungen einfach zu reparieren?
David Ferenczy Rogožan
Du hast recht. Aber erst nachdem ich es als Administrator zum Laufen gebracht hatte, hatte ich herausgefunden, dass es sich um das Berechtigungsproblem handelte. Dies war also ein Schritt in meinem Diagnoseverfahren, keine perfekte Lösung an sich.
Lionet Chen
Sicher. Viele Benutzer nehmen Ihre Antwort jedoch möglicherweise nur als Lösung, ohne die Konsequenzen wirklich zu kennen. Vielleicht besser, wenn Sie die Korrektur der Berechtigungen als Lösungsvorschlag hinzufügen.
David Ferenczy Rogožan
0

Schreiben Sie einen bestimmten Fall auf, der dieses Problem verursachen könnte.

Eines Tages habe ich einen Zweig mit dem Namen "feature / subfeature" gepusht, während ich den Zweig "feature" auf der Fernbedienung hatte.

Diese Operation funktionierte einwandfrei ohne Fehler auf meiner Seite, aber als meine Mitarbeiter einen Zweig holten und / oder zogen, hatten sie alle genau die gleiche Fehlermeldung unable to update local ref.cannot lock ref 'refs/remotes/origin/feature/subfeature .

Dies wurde gelöst, indem der featureZweig auf remote ( git push --delete origin feature) gelöscht und dann git remote prune originauf dem Repo meiner Mitarbeiter ausgeführt wurde, wodurch Nachrichten einschließlich generiert wurden* [pruned] origin/feature .

Ich vermute also, dass ich git fetchversucht habe, subfeatureref in einem featureOrdner auf git intern zu erstellen (.git / ...), aber das Erstellen eines Ordners ist fehlgeschlagen, weil featureref bereits vorhanden war.

ik1ne
quelle
0

Dieses Problem trat auf, als ein Entwickler auf einem Mac einen Zweig mit einem Symbol größer als ">" im Filialnamen erstellte.

Dies verursachte Probleme in TeamCity und auf lokalen Windows-basierten Computern, auf denen SourceTree ausgeführt wird. BitBucket ließ es ohne Probleme durch.

Um den Benutzer aufzulösen, wurde der Zweig entfernt und neu erstellt. Welches war schön und einfach.

dylanT
quelle
-1

Hatte die gleiche Nachricht, aber mit einem Verzeichnis, bekam eine fehlgeschlagene Nachricht beim Ziehen.

git --prone hat mir auch nicht geholfen. Es stellte sich heraus, dass eine Datei mit demselben Namen wie ein remote erstelltes Verzeichnis vorhanden war.

Musste zu .git \ logs \ refs \ remotes \ origin gehen und die Gebietsschemadatei löschen - dann erneut ziehen, alles gut.

Asaf Maoz
quelle