Warnung: Remote-HEAD bezieht sich auf eine nicht vorhandene Referenz, die nicht ausgecheckt werden kann

86

Dies scheint ein beliebter Fehler aus verschiedenen Gründen zu sein.

Ich habe ein einfaches Bare-Git-Repo namens "kiflea.git", ich klone es so:

git clone git://kipdola.be/kiflea.git

Dann sagt mir git: warning: remote HEAD refers to nonexistent ref, unable to checkout.

Und ja, es gibt keine versionierten Dateien in der Karte, außer dem .git-Verzeichnis. Das einzige, was ich tun muss, ist:

cd kiflea
git checkout master

Und es funktioniert, alle Dateien sind da. Aber ich dachte, das Klonen eines Repos überprüft automatisch den Master. Was ist also genau los und wie kann ich das beheben?

Ich habe festgestellt, dass dies nach dem git checkout masterAusführen zu meiner lokalen .git-Konfigurationsdatei hinzugefügt wird:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Es ist wahrscheinlich interessant zu wissen, dass dieses Git-Repository in einer fernen Vergangenheit ein SVN-Repository war.

Ps: Wenn Sie mit gitweb das nackte Repository durchsuchen, gibt es dort eindeutig einen masterZweig: http://kipdola.be/gitweb/?p=kiflea.git;a=summary

Skerit
quelle
2
Was git ls-remote originzeigt dir?
CB Bailey
Es ist das gleiche vor oder nach dem checkout masterBit:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
Skerit
1
Es sieht so aus, als hätte das Remote-Repository seine verloren (oder nie gehabt) HEAD. Haben Sie direkten Zugriff darauf? Wenn ja, siehe hier
CB Bailey
1
Wenn Sie ein Repository klonen und den Zweig nicht angeben, wird versucht, den Remote-Kopf zu verwenden. Wie unten in den Antworten erläutert, können Sie nicht direkt beeinflussen, welcher Zweig. Wenn Sie jedoch beim Klonen einen anderen Zweig auschecken, vermeiden Sie diese Überprüfung. In Ihrem Fall scheint es, dass Master existiert, aber entfernte git clone -b master <url> <dir>
Kopfpunkte

Antworten:

125

Dies warning: remote HEAD refers to nonexistent ref, unable to checkout.bedeutet, dass das entfernte (nackte) Repository in der aufgerufenen Datei eine Verzweigungsreferenz enthält HEAD, die keiner veröffentlichten Verzweigung im selben Repository entspricht.

Beachten Sie, dass die Warnung nur bedeutet, dass git nicht ausgecheckt hat. Das geklonte Repository ist ansonsten in Ordnung. Tun git branch -aSie dies einfach , um mögliche Zweige zu sehen und git checkout the-branch-you-wantdas Problem zu umgehen.

Dies geschieht normalerweise, weil der Standardinhalt für diese Datei ( .git/HEADoder einfach HEADfür nackte Repositorys) lautet ref: refs/heads/master, dass jemand, der in clonedieses Repository geht, standardmäßig den Zweig klonen sollte refs/heads/master. Standardmäßig erstellt Git einen lokalen Zweig ohne das refs/heads/Präfix ( masterdh standardmäßig). Versuchen Sie es git help symbolic-refmit weiteren Informationen.

Das Problem in dieser Situation ist, dass Git keine Methode zum Ändern von symbolischen Remote- Refs bereitstellt, sodass Sie entweder etwas verwenden, das der Git-Hosting-Anbieter implementiert hat (z. B. Einstellungen - Standardzweig in GitHub, wenn Sie über Administratorrechte verfügen) oder den Zweignamen verwenden müssen masterals Standardzweig (da dies der Standardwert für diese symbolische Referenz ist).

Wenn Sie Shell-Zugriff auf Ihr Remote-Git-Repo haben, können Sie einfach angeben, cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZwo XYZsich der Filialname befindet, den Sie standardmäßig verwenden möchten.

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, ein neues Remote-Bare-Repo ohne Commits zu erstellen und dann zu tun, git push name-of-the-remote my-special-branch-namewas dazu führt, dass das Bare-Repository einen einzelnen Zweig enthält my-special-branch-name, die HEADsymbolische Referenz jedoch weiterhin den Standardwert enthält, auf den verwiesen wird master. Als Ergebnis erhalten Sie die oben genannte Warnung.

Mikko Rantalainen
quelle
20
Beachten Sie, dass die Warnung nur bedeutet, dass Git dies nicht getan hat checkout. Das geklonte Repository ist ansonsten in Ordnung. Tun Sie dies git branch -a, um mögliche Zweige zu sehen und git checkout the-branch-you-wantdas Problem zu "beheben".
Mikko Rantalainen
2
Zumindest kann man die Verwendung des Remote-Kopfes bei der Verwendung vermeiden git clone -b master(oder wie auch immer der Name des vorhandenen Zweigs lautet).
eckes
Ich habe genau das getan, was Sie im letzten Absatz geschrieben haben. Es gibt Dateien in der Verzweigung im Bare Repo (innerhalb von Gitlab), aber der Klon scheint leer zu sein. {git branch -a} zeigt nichts. {git clone -b my-special-branch-name <url>} scheint auch nicht zu funktionieren (Remote-Ende aufgelegt).
Ed Randall
Ich "reparierte" es, indem ich refs / remotes / my-special-branch-name in refs / Heads kopierte und HEAD entsprechend bearbeitete (im nackten Gitlab-Repo). Ich konnte dann erfolgreich mit -b my-special-branch-name klonen. Aber wie kann man das leere Repo nach dem Zyklus "init" / "push" richtig konfigurieren, damit Klon -b bitte nicht auf ein Problem stößt?
Ed Randall
1
@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZwo XYZist der Standardzweigname, den Sie verwenden möchten, wenn git clonedies ohne das -bFlag erfolgt. Wenn Sie ein anderes Problem haben, stellen Sie bitte eine neue Frage, anstatt Fragen als Kommentare hinzuzufügen.
Mikko Rantalainen
10

Ich hatte das gleiche Problem, weil ich den masterZweig nicht mehr verwendete und er sowohl in meinem lokalen als auch in meinem Remote-Repository verloren ging.

Das Remote-Repository hatte noch das HEADSet auf master, ich habe es in einen der Remote-Zweige geändert, die ich tatsächlich verwende, und alles funktioniert einwandfrei.

Wenn Sie auf Ihr Remote-Repository zugreifen können:

  • Geh zu deinem remote_repo.git;
  • HEADDatei bearbeiten
  • Wechseln Sie ref: refs/heads/masterzuref: refs/heads/your_branch
Marco Bonifazi
quelle
Beide Bedingungen sind möglich, der Master wurde entfernt und der HEAD zeigt immer noch darauf oder HEAD wurde in einen Zweig geändert, der anschließend entfernt wurde. Ich denke (seit dem Auschecken der Meisterwerke) ist die zweite Option unser Fall. @MarcoBonifazi In diesem Fall ist die „Veränderung“ wäre zu ersetzen broken_branchmit refs/heads/master.
eckes
2
Gibt es eine "richtige" Möglichkeit, den HEAD-Zweig so einzustellen, ohne die Dateien bearbeiten zu müssen?
Ed Randall
@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZwo XYZist der Standardzweigname, den Sie verwenden möchten, wenn git clonedies ohne das -bFlag erfolgt, wie ich in einem anderen Kommentar sagte.
Mikko Rantalainen
7

Ja, dies hängt damit zusammen, dass Ihr Git-Klon versucht, einen anderen Zweig als den Master auszuchecken. Mach das einfach

git clone user@git-server:project_name.git -b branch_name /some/folder

Auf diese Weise können Sie den genauen Zweig über seinen Zweignamen klonen.

pal4life
quelle
2

Obwohl dieser Fehler angezeigt wurde - mein Projekt war immer noch mit dem entsprechenden Repository verbunden -, führte ich den git branchBefehl aus und sah die entsprechenden Zweige - dann lief ich git checkout *branchnameund BOOM - alles war in Ordnung.

adswebwork
quelle
Ja, @Mikko hat es erklärt, was der Grund ist. Wenn Sie die Kaufabwicklung überspringen möchten, können Sie die Option -b verwenden. (Aber es ist besser, Ihr Remote-Repo auf lange Sicht zu reparieren!)
eckes
1

Mit Ihrem Remote-Repository stimmt definitiv etwas nicht. Möglicherweise können Sie das Problem beheben, indem Sie einen neuen Klon des Repositorys erstellen. Möglicherweise funktioniert auch das Übertragen eines neuen Commits an den Hauptzweig.

Jason Axelson
quelle
Ich denke du meintest: "git push -u origin HEAD: HEAD" Es hat nichts für mich
gelöst
1

Ich würde vermuten, dass es der führende *im Festschreibungsprotokoll ist, der den Remote-Server irgendwie zum Narren hält.

Ich kann die Weboberfläche des Repos mithilfe einiger Menülinks durchsuchen, andere schlagen jedoch mit einem 404 - Unknown commit objectoder einem ähnlichen Fehler fehl , insbesondere auf der Zusammenfassungsseite.

Überprüfen Sie, ob Sie diese letzte Festschreibungsnachricht ändern können, und erzwingen Sie dann das Push-Update, um festzustellen, ob dies das Problem behebt. Möglicherweise liegt ein Fehler im Server-Dämon vor. Wenn es das Problem behebt, lohnt es sich, über die Git-Liste [email protected] zu berichten (nur Nur-Text-Nachrichten).

Philip Oakley
quelle
1

Ich hatte das gleiche Problem beim Erstellen eines nackten Repos.

Ich habe es gelöst, indem ich nur das Repo geklont, einen lokalen Master-Zweig erstellt und dann den Master auf das Remote-Repo verschoben habe.

1) Klonen Sie das Repo

$ git.exe clone --progress -v "the remote path" "my local path"

2) Erstellen Sie lokal einen Hauptzweig.

   $ git checkout -b master

3) etwas in der lokalen Niederlassung festschreiben

$ git add readme.md 
$ git commit –m “Added readme”

4) Schieben Sie den lokalen Master auf die Fernbedienung

   $ git push origin master
Corrado
quelle
0

Wenn tatsächlich kein Hauptzweig verfügbar ist, überprüfen Sie Folgendes: Wenn sich im Ordner ".git" eine Datei mit dem Namen "Packed-Refs" befindet, öffnen Sie diese und Sie können alle aufgelisteten Referenzen finden.

So etwas wie unten;

# pack-refs with: peeled fully-peeled 
e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
^cfae4f034e82591afdf4e5ed72279297d0eee618
6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
^c32f7fa495d4b44652f46c065fcd19c3acd237a6
72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
^50992e805e758e2231f28ec2127b57a1a9fd0ddc
0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1

Dann benutze;

git checkout refs/tags/xxxx

Oder

git checkout 'HASH value'

um die gewünschte Version auszuchecken. Vielen Dank.

Samantha
quelle
0

Ich schien es zu beheben mit:

git checkout -b  master
git push

Dadurch wurde der Standardmaster erstellt, und dann konnte ich meine anderen Zweige auschecken

brendan
quelle
0

In meinem Fall war das Repo leer.

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 
László Tóth
quelle
0

Bei Gitlab wird sogar angezeigt, dass Sie sich in einem Standardzweig befinden (z. B. master), in dem Sie sich möglicherweise nicht befinden. Wenn Sie ihn erneut einstellen, beheben Sie ihn wie folgt:

  1. Erstellen Sie möglicherweise einen neuen Zweig asd
  2. Einstellungen> Repository> Standardzweig, der den Standardzweig anzeigt master
  3. Stellen Sie es auf asd
  4. Stellen Sie es wieder auf master
  5. asdZweig löschen

Fertig, jetzt ist Ihr Standardzweig master

Ng Sek Long
quelle