2010-02-10 4 views
45

ich ein Remote-Repository einrichten und ich kann neue Änderungen schieben, aber ich kann von ihm nicht holen, habe ich immer die (eher kryptischen) Fehlermeldung:git es abgelehnt in aktuellen Zweig holen

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 muss ich tun, um das Abrufen zu ermöglichen?

(Beachten Sie, dass dieser Remote-Repo nur als Backup-Repo verwendet wird, also sollte es eine exakte Kopie meines lokalen Repositorys sein. Ich kann wirklich nicht verstehen, warum ich darauf zugreifen, aber nicht davon abholen kann. ..)

Meine Config wie folgt aussieht:

[remote "origin"] 
    url = ssh://blablablah 
    fetch = +refs/*:refs/* 
    mirror = true 
+0

Können Sie Ihre Konfiguration für das Repository zeigen, in dem Sie sich befinden? –

+0

Mmh, wie kann ich diese Konfiguration sehen? Ich habe dieses Remote-Repository nur mit 'git remote add name server' eingerichtet, vielleicht mit der Option' --mirror'. –

+0

Oliver, die Konfiguration ist in '.git/config'. Im Besonderen spricht Charles über den Abschnitt "[remote ...]", glaube ich. –

Antwort

24

Was Sie versuchen, den Zweig zu holen zu tun ist, Sie workin auf. Das heißt, Sie sind auf dem Master-Zweig, und Sie versuchen, es zu aktualisieren. Das ist nicht möglich. Es ist üblicher, die remotes/* Zweige zu aktualisieren und sie dann in Ihre lokalen Zweige zu ziehen. Was Sie wollen, ist vielleicht

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

Das Setup-Repository in remotes/otherrepo/* geholt werden. git fetch otherrepo sollte den Trick tun. Alternativ können Sie Ihre .git/config manuell bearbeiten und fetch für die Fernbedienung auf etwas wie refs/heads/*:refs/remotes/otherrepo/* setzen.

+0

Danke! Ich verstehe nicht wirklich, was ich tue, aber nach deinem Rat geht es jetzt gut. Ich vermute, dass man explizit sagen muss, wo die entfernten Zweige im lokalen Repository landen werden; Ich hatte wahrscheinlich den entfernten Zweig, der meinen lokalen Zweig überlappt, obwohl ich nicht sicher bin, ob das Sinn macht. :-) Danke trotzdem! –

+1

Mehr oder weniger. Die Tatsache, dass entfernte Refs in "refs/remotes" sind, ist nur eine Konvention, aber Sie wollen wirklich nicht direkt in Ihren "refs/hrets/master" geholt werden. Vor allem, wenn Ihr "refs/heads/master" ausgecheckt ist. –

+0

@ MichaelKrelin-hacker was soll ich anstelle von "thehost" schreiben –

1

Ich hatte dieses Problem, als ich gedankenlos ein Repository geklont habe, anstatt es zu holen, so dass beide Repositories Meister waren. Wenn Sie keine Arbeit am Remote-Repository ausgeführt haben, können Sie die Dinge wie folgt mit den grundlegenden Git-Befehlen beheben: (1) Löschen Sie das Remote-Repository, (2) kopieren Sie das lokale Repository zu dem Remote-Repository, (3) löschen Sie das lokale ein, und dann (4) den lokalen Repository mit

git init; git fetch $REMOTE_GIT_REPOSITORY_URL 

dann git pull und git push bis die richtigen Dinge tun. Der Vorteil, git remote zu vermeiden, ist laut Michaels effizienterer und prinzipiellerer Antwort, dass Sie nicht über die Semantik des Nachverfolgens von Zweigen nachdenken müssen.

+0

Ein Klon ist ein Klon.Das "Master Repo" ist eine reine Konvention. Die Frage hier ist das Verhalten von "git fetch remote ref: ref", wenn HEAD auf ref gesetzt ist. – qneill

35

Falls jemand dies findet, weil er gezielt in den aktuellen Zweig abholen möchte, können Sie das Flag --update-head-ok verwenden. Von the docs:

-u
--update-Kopf-ok
standardmäßig git holen sich weigert, den Kopf zu aktualisieren, die auf den aktuellen Zweig entspricht. Dieses Flag deaktiviert die Überprüfung. Dies ist rein für den internen Gebrauch für Git Pull, um mit git fetch zu kommunizieren, und , es sei denn, Sie implementieren Ihr eigenes Porzellan, das Sie nicht verwenden sollen.

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

+1

Warum möchte Git in diesem Fall den Kopf nicht aktualisieren? Warum wollen sie nicht, dass du diese Flagge benutzt? –

+0

Ich bin auch neugierig, warum ist es okay für holen, um alle anderen Zweige außer dem aktuellen zu aktualisieren? – cdosborn

+0

Ich dachte, die Einschränkung war da, um Sie daran zu hindern, Arbeit zu verlieren, aber ich habe überprüft, dass selbst mit dem '-u'-Flag Non-Fast-Forward-Commits abgelehnt werden: '! [abgelehnt] master -> master (non-speed-forward) ' –

-1

Ich habe das gleiche Problem. Zuerst versuche ich, diese

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

git pull [remote_name] [branch_name] 

Hinweis wird die Änderungen abrufen und zusammenführen. Wenn Sie Terminal verwenden, öffnen Sie die Datei, und Sie müssen eine Nachricht senden. Mit dieser Nachricht werden Sie den letzten Commit durchführen. Probieren Sie diesen Befehl aus und Sie können die Anfrage schließlich ausführen.

git push [remote_name] [branch_name_local] 
0

dies auch dies sollte funktionieren, wenn Sie in Master Zweig sind und will spätestens bekommen versuchen, dieses

git pull Herkunft Master

0

Sind Sie Git tatsächlich eingeben Befehle in die Befehlszeile oder führen Sie die ausführbare Datei Git aus Ihrem eigenen Code aus?
Wenn Sie es aus Code ausführen, sind Sie sicher, dass Git versucht, in das richtige lokale Verzeichnis abzurufen?

Es gibt zwei Möglichkeiten, dies zu tun:

  1. Verwenden Sie die von Ihrer Programmiersprache zur Verfügung stehenden Optionen des richtigen Arbeitsverzeichnis zu setzen, bevor Git Ausführung
    (C# example, denn das ist, was ich bin Verwendung)

  2. Übergeben Sie immer the -C parameter an Git, um das Verzeichnis mit dem lokalen Repo anzugeben.


Ich habe ein Projekt, wo ich die Git ausführbare Datei von C# -Code aufrufen, und ich habe die gleiche Fehlermeldung wie in der Frage, wenn ich aus Versehen den -C parameter gesetzt vergessen zu.