Git weigert sich, in den aktuellen Zweig zu holen

74

Ich habe ein Remote-Repository eingerichtet und kann neue Änderungen daran vornehmen, aber ich kann nicht daraus abrufen. Ich erhalte immer die (eher kryptische) Fehlermeldung:

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
fatal: The remote end hung up unexpectedly

Was heißt das? Was soll ich tun, um das Abrufen zu aktivieren?

(Beachten Sie, dass dieses Remote-Repo nur als Backup-Repo verwendet wird, daher sollte es so ziemlich eine exakte Kopie meines lokalen Repositorys sein. Ich kann wirklich nicht verstehen, warum ich darauf pushen, aber nicht abrufen kann ...)

Meine Konfiguration sieht aus wie:

[remote "origin"]
    url = ssh://blablablah
    fetch = +refs/*:refs/*
    mirror = true
Olivier Verdier
quelle
Können Sie Ihre Konfiguration für das Repository anzeigen, in das Sie abrufen?
CB Bailey
Mmh, wie kann ich diese Konfiguration sehen? Ich habe dieses Remote-Repository nur git remote add name servermit der --mirrorOption eingerichtet.
Olivier Verdier
Oliver, die Konfiguration ist in .git/config. Insbesondere spricht Charles über den [remote …]Abschnitt, glaube ich.
Michael Krelin - Hacker
Meine Konfiguration sieht folgendermaßen aus: [remote "origin"] url = ssh: // blablablah fetch = + refs / *: refs / * mirror = true
Olivier Verdier
Sie sollten nicht in das Repository rufen, an dem Sie arbeiten. Was Sie wollen, ist das Entfernen des Spiegels und im Grunde genommen meinen Ratschlägen in der Antwort folgen.
Michael Krelin - Hacker

Antworten:

41

Sie versuchen, den Zweig abzurufen, an dem Sie arbeiten. Das heißt, Sie befinden sich im Hauptzweig und versuchen, ihn zu aktualisieren. Das ist doch nicht möglich. Es ist üblicher, die remotes/*Zweige zu aktualisieren und sie dann in Ihre lokalen zu ziehen. Was Sie wollen, ist vielleicht

git remote add otherrepo thehost:/the/path.git

Dadurch wird das Repository eingerichtet, in das abgerufen werden soll remotes/otherrepo/*. git fetch otherreposollte den Trick machen. Alternativ können Sie Ihre manuell bearbeiten .git/configund fetchfür die Fernbedienung auf so etwas einstellen refs/heads/*:refs/remotes/otherrepo/*.

Michael Krelin - Hacker
quelle
Vielen Dank! Ich verstehe nicht wirklich, was ich tue, aber nach Ihrem Rat funktioniert es jetzt gut. Ich vermute, dass man explizit sagen muss, wo die Remote-Zweige im lokalen Repository landen werden. Ich hatte wahrscheinlich eine Art Remote-Zweig, der meinen lokalen Zweig überlappte, obwohl ich nicht sicher bin, ob das Sinn macht. :-) Danke trotzdem!
Olivier Verdier
1
Mehr oder weniger. Die Tatsache, dass sich Remote-Refs in "Refs / Fernbedienungen" befinden, ist nur eine Konvention, aber Sie möchten wirklich nicht direkt in Ihre "Refs / Hreads / Master" holen. Besonders wenn Ihre "refs / Heads / Master" ausgecheckt sind.
Michael Krelin - Hacker
@ MichaelKrelin-Hacker, was soll ich anstelle von "thehost" schreiben
Punit Vara
Der Name des Hosts, auf dem sich Ihr Repository befindet. Grundsätzlich sollte das thehost:/the/path.gitTeil durch Ihre Repository-URL ersetzt werden.
Michael Krelin - Hacker
63

Falls jemand dies findet, weil er speziell in den aktuellen Zweig rufen möchte, können Sie das --update-head-okFlag verwenden. Aus den Dokumenten :

-u
--update-head-ok
Standardmäßig weigert sich git fetch, den Kopf zu aktualisieren, der dem aktuellen Zweig entspricht. Dieses Flag deaktiviert die Prüfung. Dies ist nur für den internen Gebrauch vorgesehen, damit Git Pull mit Git Fetch kommuniziert. Wenn Sie kein eigenes Porzellan implementieren, sollten Sie es nicht verwenden.

In einigen Fällen möchten wir unsere eigenen Porzellanbefehle implementieren, z. B. Automatisierung und Werkzeuge.

RobW
quelle
3
Warum will git in diesem Fall den Kopf nicht aktualisieren? Warum wollen sie nicht, dass du diese Flagge benutzt?
Chris Marisic
Ich bin auch neugierig, warum ist es für Fetch in Ordnung, alle anderen Zweige außer dem aktuellen zu aktualisieren?
cdosborn
3
Ich dachte, die Einschränkung sollte verhindern, dass Sie die Arbeit verlieren, aber ich habe überprüft, dass auch mit der -uFlagge nicht schnell vorgespannte Commits abgelehnt werden:! [rejected] master -> master (non-fast-forward)
Diomidis Spinellis
3
Für den Fall, dass Sie Ihren Meister einfach wegwerfen und auf den Meister des Ursprungs zeigen git fetch -fu origin master
möchten
Beachten Sie, dass dadurch der Kopf aktualisiert wird, nicht jedoch das Arbeitsverzeichnis. Verwenden Sie git reset --hardFolgendes, damit das Arbeitsverzeichnis mit dem Kopf übereinstimmt (Vorsicht, dies verwirft alle nicht gespeicherten Änderungen).
Erik Koopmans
5

Dies sollte auch funktionieren , wenn Sie in sind Master - Zweig und will spätestens bekommen versuchen , diese

Git Pull Origin Master

Sai
quelle
1

Ich hatte dieses Problem, als ich ein Repository gedankenlos geklont habe, anstatt es abzurufen, sodass beide Repositorys Master waren. Wenn Sie am Remote-Repository keine Arbeit geleistet haben, können Sie die Probleme mit den grundlegenden git-Befehlen wie folgt beheben: (1) Löschen des Remote-Repositorys, (2) Kopieren des lokalen Repositorys an den Ort, an dem sich das Remote-Repository befand, (3) Löschen des lokale, und dann (4) das lokale Repository mit einrichten

git init; git fetch $REMOTE_GIT_REPOSITORY_URL  

Dann git pullund git pushwerde die richtigen Dinge tun. Der Vorteil der Vermeidung git remotegemäß Michaels effizienterer und prinzipieller Antwort besteht darin, dass Sie nicht über die Semantik der Nachverfolgung von Zweigen nachdenken müssen.

Charles Stewart
quelle
Ein Klon ist ein Klon. Das "Master Repo" ist eine reine Konvention. Die Frage hier ist über das Verhalten von "git fetch remote ref: ref", wenn HEAD auf ref gesetzt ist.
Qneill
0

Ich habe das gleiche Problem. Zuerst versuche ich damit zu holen

git fetch [remote_name] [branch_name] 

Ich hatte das gleiche Problem, das Sie erwähnen. Danach habe ich diesen einfachen Befehl ausprobiert.

git pull [remote_name] [branch_name]

Note ruft die Änderungen ab und führt sie zusammen. Wenn Sie das Terminal verwenden, öffnen Sie die Datei und müssen eine Nachricht festschreiben. Mit dieser Nachricht pushen Sie das letzte Commit. Versuchen Sie diesen Befehl und schließlich können Sie die Anfrage pushen.

git push [remote_name] [branch_name_local] 
Hafiz Shehbaz Ali
quelle
0

Geben Sie tatsächlich Git-Befehle in die Befehlszeile ein oder führen Sie die ausführbare Git-Datei aus Ihrem eigenen Code aus?
Sind Sie sicher, dass Git versucht, in das richtige lokale Verzeichnis zu rufen, wenn Sie es über Code ausführen?

Es gibt zwei Möglichkeiten, dies zu tun:

  1. Verwenden Sie die von Ihrer Programmiersprache bereitgestellten Optionen, um das richtige Arbeitsverzeichnis festzulegen, bevor Sie Git ausführen
    ( C # -Beispiel , da ich dieses verwende).

  2. Übergeben Sie den -CParameter immer an Git, um das Verzeichnis mit dem lokalen Repo anzugeben.


Ich habe ein Projekt, in dem ich die ausführbare Git-Datei aus C # -Code aufrufe, und ich habe die gleiche Fehlermeldung wie in der Frage erhalten, als ich versehentlich vergessen habe, die zu setzen -C parameter.

Christian Specht
quelle
-1

Schwerwiegend: Weigert sich, in die aktuellen Zweigstellenreferenzen / Köpfe / BRANCHNAME des nicht bloßen Repositorys zu rufen

Ich habe einen Zweig branch lokal erstellten dann ausgeführt Befehl „ GIT stromauf Zug- / ID / Kopf fetch: Branchen “ und bekam fatal: Verweigern in Stromzweig refs / heads / branch von nicht-bare Repository zu holen

dann habe ich den zweig gelöscht und wieder das gleiche cmd aufgerufen es geht ganz gut.

Eigentlich habe ich Pull Request Branch ausgecheckt.

Stollen Sie Choudhary
quelle