2017-06-01 4 views
0

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.

+0

'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

+0

@torek Ich habe vorher noch keine eigenen Git Befehle geschrieben; Gibt es irgendwo einen guten Leitfaden? –

+0

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

Antwort

1

Ich brauche zusätzlich eine git pull in den Projekten zu tun, bauen Ich bin nicht, so dass sie das haben letzter Code ... Leider läuft das auch git pull auf den Projekten, die ich gerade Änderungen am

bin

Sie können 01 ausführen, die sofort fehlschlägt, wenn einige lokale Commits vorliegen.

+0

Ich hätte eigentlich selbst darüber nachdenken sollen und weiß nicht, warum ich das nicht getan habe. Es tut immer noch nicht genau das, wonach ich gefragt habe, aber es ist nahe genug und ich denke, es macht das, was ich eigentlich will. –

+0

Es war nicht ganz so einfach - ich benutze standardmäßig pull-with-rebase, weil das Rebasing dort erwartet wird, wo ich arbeite, und ich '-c rebase.autoStash = no' zur Befehlszeile hinzufügen musste - aber jetzt funktioniert es genau wie ich wollte, und ich kann einen Alias ​​machen, der den Abruf und das zur gleichen Zeit macht. –

0

können Sie beginnen git Haken zu verwenden, und führen Sie

git fetch -a 

jederzeit es notwendig ist,

+0

Keiner der Hooks scheint auf Abruf ausgeführt zu werden, es sei denn, diejenigen, die auf Remote-Push ausgeführt werden, laufen auch lokal, aber ich sehe das nirgendwo dokumentiert. –

Verwandte Themen