Wie documented und discussed woanders, git fetch
weigert sich, den aktuellen Zweig abzurufen, wenn Sie die Option -u
nicht angeben.Äquivalent von updateInstext für git fetch -u
Dieses Verhalten ist in den meisten Fällen sinnvoll und offensichtlich der richtige Standardwert. Es ist jedoch nicht das Verhalten, das ich will. Stattdessen möchte ich etwas wie das, was die Konfigurationsoption receive.denyCurrentBranch=updateInstead
tut: Wenn die aktuelle funktionierende Struktur und der Index HEAD
übereinstimmen, dann erlauben Sie den Arbeitsbaum holen und aktualisieren; Andernfalls verweigern Sie den Abruf mit einer ähnlichen Nachricht wie die Standardeinstellung. Gibt es eine Möglichkeit, dies zu tun, ohne meinen eigenen Porzellan-Befehl mit git fetch -u
zu schreiben?
Der Grund, warum ich dies will, falls eine bessere Workflow zur Verfügung steht, ist, dass ich auf einer Reihe von Projekten in separatem Git-Repositories gespeichert arbeitete. Die meisten von ihnen sind nur auf dem lokalen Zweig dev
, der die dev/master
Remote-Zweig als seine Upstream hat. Wenn ich tatsächlich Entwicklung mache, mache ich es in einem Zweig, der nach dem Feature benannt ist, an dem ich arbeite, nicht an dem Zweig dev
. Ich möchte alle Remote-Zweige verfügbar, also muss ich eine git fetch --all -p
regelmäßig tun, und ich muss zusätzlich eine git pull
in den Projekten, die ich nicht bauen, so dass sie den neuesten Code haben. Da es viele Projekte gibt, ist der einfachste Weg, sie einfach in Bash zu durchlaufen und git fetch --all -p; git pull
auf allen auszuführen. Leider läuft das auch git pull
auf den Projekten, an denen ich gerade Änderungen mache, und das könnte zu Konflikten führen, anstatt nur die neuesten Abhängigkeiten zu bekommen.
Stattdessen möchte ich die Projekte, an denen ich gerade nicht arbeite, den Arbeitsbaum automatisch aktualisieren lassen; dann muss ich nur git pull
auf Repositories ausführen, an denen ich gerade arbeite. Auf diese Weise kann ich es nur ausführen, wenn es angemessen ist, und keine Sorgen über Merge-Konflikte, wenn ich nur gegen die neueste Quelle der abhängigen Projekte erstellen möchte.
'git fetch' selbst aktualisiert nie den Index und den Arbeitsbaum. Ich denke, du musst wahrscheinlich dein eigenes Porzellan hier schreiben. Beachten Sie, dass 'git-sh-setup' eine Möglichkeit bietet, zu testen, ob der Index und der Arbeitsbaum" sauber "sind (stimmen mit dem' HEAD'-Commit überein), einschließlich Submodulen, ohne die Ausgabe von 'git status' analysieren zu müssen. Beachten Sie auch, dass 'git pull' nur' git fetch && git merge' ist, mehr oder weniger, also können Sie statt 'git pull' testen, dann vielleicht' git merge' ausführen. – torek
@torek Ich habe vorher noch keine eigenen Git Befehle geschrieben; Gibt es irgendwo einen guten Leitfaden? –
Es gibt viele * schlechte * :-) Ich bin mir nicht wirklich sicher, dass es gute gibt. Viele Teile von Git werden jedoch als Shell-Skripte geschrieben. Führen Sie 'git --exec-path' aus und suchen Sie in der resultierenden Position. Dort finden Sie' stash' und 'filter-branch' als Beispiele für große Shell-Skripte. Ich füge hinzu, dass, wenn Sie ein Skript mit dem Namen 'git-foo' schreiben und es irgendwo in Ihren' $ PATH' setzen, 'git foo' Ihr Skript ausführen wird (mit' git --exec-path' an der Vorderseite von hinzugefügt) '$ PATH', so dass Sie zB' .git-sh-setup' können. – torek