Ich habe oft mindestens 3 entfernte Niederlassungen: Master, Inszenierung und Produktion. Ich habe 3 lokale Zweige, die diese entfernten Zweige verfolgen.
Das Aktualisieren aller meiner lokalen Niederlassungen ist mühsam:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
Ich würde gerne in der Lage sein, einfach ein "Git Pull-All" zu machen, aber ich habe es nicht geschafft, es zum Laufen zu bringen. Es scheint ein "Fetch - All" zu machen und dann den aktuellen Arbeitszweig zu aktualisieren (schnell vorzuspulen oder zusammenzuführen), aber nicht die anderen lokalen Zweige.
Ich bin immer noch nicht in der Lage, manuell zu jedem lokalen Zweig zu wechseln und zu aktualisieren.
Antworten:
Das Verhalten, für das Sie beschreiben,
pull --all
ist genau wie erwartet, jedoch nicht unbedingt nützlich. Die Option wird an git fetch weitergegeben, der dann alle Refs von allen Fernbedienungen abruft, anstatt nur die benötigte.pull
führt dann den entsprechenden einzelnen Zweig zusammen (oder in Ihrem Fall neu).Wenn Sie andere Filialen auschecken möchten, müssen Sie sie auschecken. Und ja, das Zusammenführen (und erneutes Basieren) erfordert unbedingt einen Arbeitsbaum, sodass sie nicht ohne Auschecken der anderen Zweige durchgeführt werden können. Sie können Ihre beschriebenen Schritte in ein Skript / einen Alias einbinden, wenn Sie möchten. Ich würde jedoch empfehlen, die Befehle mit zu
&&
verknüpfen, damit bei einem Ausfall eines dieser Befehle nicht versucht wird, weiterzumachen.quelle
Ich benutze den
sync
Unterbefehl von Hub, um dies zu automatisieren. Ich habealias git=hub
in meinem.bash_profile
, also lautet der Befehl, den ich eingebe:Dadurch werden alle lokalen Zweige aktualisiert, die einen passenden Upstream-Zweig haben. Von der Manpage:
Es behandelt auch das Verstecken / Aufheben von nicht festgeschriebenen Änderungen im aktuellen Zweig.
Früher habe ich ein ähnliches Tool namens git-up verwendet , aber es wird nicht mehr gewartet und
git sync
macht fast genau das Gleiche.quelle
git config --global git-up.rebase.auto false
.Ich weiß, dass diese Frage fast 3 Jahre alt ist, aber ich habe mir dieselbe Frage gestellt und keine fertige Lösung gefunden. Also habe ich selbst ein benutzerdefiniertes Git-Befehls-Shell-Skript erstellt.
Hier geht es, das
git-ffwd-update
Skript macht folgendes ...git remote update
, um die letzten Umdrehungen abzurufengit remote show
, um eine Liste lokaler Zweige abzurufen, die einen entfernten Zweig verfolgen (z. B. Zweige, mit denen verwendet werden kanngit pull
).git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
wie vielen Commits sich der lokale Zweig hinter der Fernbedienung befindet (und umgekehrt).git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
Das Skript kann wie folgt aufgerufen werden:
Das vollständige Skript sollte als gespeichert werden
git-ffwd-update
und muss sich auf dem befindenPATH
.quelle
git branch
Aufruf verwendet werden. Ich habe das -l entfernt, um den Aufruf in zu ändern,git branch -f $LB -t $ARB >/dev/null;
und jetzt funktioniert das Skript wie es sollte.Es ist nicht so schwer zu automatisieren:
quelle
git rebase origin/$branch
zugit pull
, so dass es aus dem entsprechenden Tracking - Zweig (vermutlich auf Herkunft) holen wird und entweder merge oder Fütterungsmaterial , wie durch die Konfiguration bestimmt.fetch
. Habe bearbeitet; zusätzliche Funktionen / Korrekturen, was auch immer bis zum OP ist.pull
(oder überprüfenbranch.<branch>.rebase
) möchten , damit Sie nicht versehentlich einen Zweig neu gründen, der so eingerichtet ist, dass er normal gezogen wird (Zusammenführen).set -e
statt|| exit 1
, um den Interpreter beim ersten Fehler zu beenden.Dies ist immer noch nicht automatisch, da ich wünschte, es gäbe eine Option für - und es sollte überprüft werden, ob dies nur für Schnellvorlauf-Updates möglich ist (weshalb das manuelle Ausführen eines Pulls weitaus sicherer ist !!). aber Vorbehalte beiseite können Sie:
um die Position Ihrer lokalen Niederlassung zu aktualisieren, ohne sie überprüfen zu müssen.
Hinweis: Sie verlieren Ihre aktuelle Zweigposition und verschieben sie an die Stelle, an der sich der Zweig des Ursprungs befindet. Wenn Sie also zusammenführen müssen, gehen Daten verloren!
quelle
git fetch origin other-branch:other-branch
Hier gibt es viele Antworten, aber keine,
git-fetch
mit denen die lokale Referenz direkt aktualisiert wird. Dies ist viel einfacher als das Auschecken von Zweigen und sicherer alsgit-update-ref
.Hier
git-fetch
aktualisieren wir nicht aktuelle Zweige undgit pull --ff-only
für den aktuellen Zweig. Es:und hier ist es:
Aus der Manpage für
git-fetch
:Durch Angabe
git fetch <remote> <ref>:<ref>
(ohne+
) erhalten wir einen Abruf, der die lokale Referenz nur aktualisiert, wenn sie schnell weitergeleitet werden kann.Hinweis : Dies setzt voraus, dass die lokalen und Remote-Zweige den gleichen Namen haben (und dass Sie alle Zweige verfolgen möchten). Es sollten wirklich Informationen darüber verwendet werden, welche lokalen Zweige Sie haben und was sie für die Verfolgung eingerichtet sind.
quelle
c*n
Schritte ausführen (anstelle von 1), wobeic
einige Anzahl wiederholter Befehle undn
die Anzahl der Zweige angegeben sind.git branch -r | grep -v ' -> ' | while read remotebranch
umgit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
es zu Verzweigungen zu begrenzen bereits lokal ich habe. Außerdem habe ichgit fetch --prune
am Anfang ein hinzugefügt , um die Liste der Remote-Zweige zu aktualisieren, bevor etwas unternommen wird, wodurch einige Warnungen vermieden werden.Dieses Problem ist (noch) nicht gelöst, zumindest nicht einfach / ohne Skripterstellung: In diesem Beitrag auf der Git-Mailingliste von Junio C Hamano wird die Situation erläutert und eine einfache Lösung gefordert.
Der Hauptgrund ist, dass Sie dies nicht brauchen sollten:
Die Forderung nach einer Lösung bestand darin, eine Option oder ein externes Skript zu verwenden, um lokale Zweige, die jetzt auf Fernverfolgungszweige folgen, zu beschneiden , anstatt sie durch Schnellvorlauf auf dem neuesten Stand zu halten, wie es das Originalplakat verlangt.
Hinweis: Ab Git 2.10 gibt es keine solche Lösung. Beachten Sie, dass der
git remote prune
Unterbefehl und dasgit fetch --prune
Entfernen des Remote-Tracking-Zweigs für einen Zweig, der nicht mehr auf dem Remote vorhanden ist, und nicht das Entfernen des lokalen Zweigs, der den Remote-Tracking-Zweig verfolgt (für den der Remote-Tracking-Zweig der Upstream-Zweig ist).quelle
Hier gibt es viele akzeptable Antworten, aber einige der Klempnerarbeiten sind für Uneingeweihte möglicherweise etwas undurchsichtig. Hier ist ein viel einfacheres Beispiel, das leicht angepasst werden kann:
Wenn Sie
~/bin/git
zu Ihrer hinzufügenPATH
(vorausgesetzt, die Datei ist~/bin/git/git-update-all
), können Sie einfach Folgendes ausführen:quelle
Fügen Sie dieses Skript zu
.profile
auf Mac OS X:quelle
Hier ist eine gute Antwort: Wie man alle Git-Zweige abruft
quelle
git fetch
undgit pull
statt nur zu tungit pull
?origin/
PräfixEin Skript, das ich für meinen GitBash geschrieben habe . Erreicht Folgendes:
git checkout branch
git pull origin
** Ich benutze dies, habe es aber nicht gründlich getestet, benutze es auf eigenes Risiko. Sehen Sie ein Beispiel dieses Skript in einer .bash_alias Datei hier .
quelle
Wenn Sie unter Windows arbeiten, können Sie PyGitUp verwenden , einen Klon
git-up
für Python. Sie können es mit pip mitpip install --user git-up
oder über Scoop mit installierenscoop install git-up
[
quelle
Einfach eine aktualisierte Antwort posten.
git-up
wird nicht mehr gepflegt und wenn Sie die Dokumentation lesen, erwähnen sie, dass die Funktionalität jetzt in git verfügbar ist .Sie können dies auch für jeden
git pull
ab Git 2.9 einstellen (danke @VonC, siehe seine Antwort hier )quelle
git-up
Dokumentation , weil sie nicht erwähnen , dassgit-up
.git-up
:)Ich bin auf das gleiche Problem dieser Frage gestoßen ...
Ich wunderte mich darüber und führte eine kleine Alias-Funktion in meiner
.bashrc
Datei aus:Arbeitete für mich (:
quelle
Wenn refs / Heads / Master schnell zu refs / remotes / foo / master vorgespult werden kann , wird die Ausgabe von
sollte die SHA1-ID zurückgeben, auf die refs / Heads / Master zeigt. Auf diese Weise können Sie ein Skript zusammenstellen, das automatisch alle lokalen Zweige aktualisiert, auf die keine Umleitungs-Commits angewendet wurden.
Dieses kleine Shell-Skript (ich nannte es git-can-ff ) zeigt, wie es gemacht werden kann.
quelle
Um die Antwort von Matt Connolly zu vervollständigen, ist dies eine sicherere Möglichkeit, lokale Zweigstellenreferenzen zu aktualisieren, die schnell weitergeleitet werden können, ohne den Zweig auszuchecken. Zweige, die nicht schnell weitergeleitet werden können (dh die auseinander gegangen sind), werden nicht aktualisiert, und der aktuell ausgecheckte Zweig wird nicht aktualisiert (da dann auch die Arbeitskopie aktualisiert werden sollte).
quelle
Ein etwas anderes Skript, das nur Zweige vorspult, deren Namen mit ihrem vorgelagerten Zweig übereinstimmen. Außerdem wird der aktuelle Zweig aktualisiert, wenn ein schneller Vorlauf möglich ist.
Stellen Sie sicher, dass alle Upstream-Zweige Ihrer Zweige korrekt eingestellt sind, indem Sie ausführen
git branch -vv
. Stellen Sie den Upstream-Zweig mit eingit branch -u origin/yourbanchname
Kopieren-Einfügen in eine Datei und chmod 755:
quelle
Der folgende Einzeiler spult nach Möglichkeit alle Zweige vor, die einen vorgelagerten Zweig haben, und gibt ansonsten einen Fehler aus:
Wie funktioniert es?
Es verwendet ein benutzerdefiniertes Format mit dem
git branch
Befehl. Für jeden Zweig, der einen vorgelagerten Zweig hat, wird eine Zeile mit dem folgenden Muster gedruckt:Dies kann direkt in geleitet werden
sh
(vorausgesetzt, die Zweignamen sind wohlgeformt). Lassen Sie das aus, um| sh
zu sehen, was es tut.Vorsichtsmaßnahmen
Der Einzeiler wird Ihre Fernbedienungen nicht kontaktieren. Geben Sie ein
git fetch
odergit fetch --all
vor dem Ausführen aus.Der aktuell ausgecheckte Zweig wird nicht mit einer Meldung wie aktualisiert
Hierfür können Sie auf regelmäßige zurückgreifen
git pull --ff-only
.Alias
Fügen Sie Folgendes hinzu,
.gitconfig
damitgit fft
dieser Befehl ausgeführt wird:Siehe auch meine
.gitconfig
. Der Alias ist eine Abkürzung für "Fast-Forward-Tracking (Zweige)".quelle
hub
@John vorgeschlagene Lösung für eine bessere Ausgabe verwenden werde.git push
, was völlig anders ist als das, was man erwarten würde. Was ist das Geheimnis?git push
?git push
hat Upload-Semantik - Ich habe einige Commits lokal, die ich Upstream senden möchte.git pull
hat Download-Semantik - Ich möchte einige Upstream-Remote-Commits in meine lokale Niederlassung bringen. Da es sich um das Herunterladen neuer Commits von der Remote-Datei auf die lokale Ebene handelt,git pull
ist dies die naheliegende Wahl. Aber nein, dieser Trick verwendetgit push
. Wie führtgit push
dies dazu, dass Remote-Änderungen an meiner lokalen Niederlassung vorgenommen werden?!git push
kann auch zum Aktualisieren lokaler Zweige verwendet werden, sofern es sich um ein Schnellvorlauf-Update handelt.Das Skript von @larsmans, etwas verbessert:
Nach Abschluss des Vorgangs wird die Arbeitskopie aus demselben Zweig ausgecheckt wie vor dem Aufruf des Skripts.
Die
git pull
Version:quelle
Es sieht so aus, als hätten viele andere ähnliche Lösungen beigesteuert, aber ich dachte, ich würde teilen, was ich mir ausgedacht habe, und andere einladen, einen Beitrag zu leisten. Diese Lösung hat eine schöne, farbenfrohe Ausgabe, verwaltet Ihr aktuelles Arbeitsverzeichnis elegant und ist schnell, da sie keine Kassen durchführt und Ihr Arbeitsverzeichnis intakt lässt. Außerdem ist es nur ein Shell-Skript ohne andere Abhängigkeiten als git. (bisher nur unter OSX getestet)
https://github.com/davestimpert/gitup
Entschuldigung, ich habe anscheinend auch den gleichen Namen wie das andere Tool oben gefunden.
quelle
Dies kann mit dem folgenden Skript durchgeführt werden ... Es werden zuerst alle Zweige abgerufen und einzeln ausgecheckt und von selbst aktualisiert.
quelle
Sie können es nicht mit nur einem Git-Befehl tun, aber Sie können es mit einer Bash-Zeile automatisieren.
Um alle Zweige sicher mit einer Zeile zu aktualisieren, gehe ich wie folgt vor:
Wenn ein Zweig nicht vorgespult werden kann oder ein Fehler auftritt, wird er angehalten und Sie bleiben in diesem Zweig, sodass Sie die Kontrolle zurückerobern und manuell zusammenführen können.
Wenn alle Zweige schnell vorgespult werden können, endet sie mit dem Zweig, in dem Sie sich gerade befanden, und lässt Sie dort, wo Sie sich vor dem Update befanden.
Erklärungen:
Zur besseren Lesbarkeit kann es auf mehrere Zeilen aufgeteilt werden:
git fetch --all && ...
=> Ruft alle Refs von allen Fernbedienungen ab und fährt mit dem nächsten Befehl fort, wenn kein Fehler aufgetreten ist.git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> Aus dem Ausganggit branch
,sed
nehmen Sie die Linie mit einem*
und es bis zum Ende bewegen (so dass der aktuelle Zweig zuletzt aktualisiert). Danntr
entfernen Sie einfach die*
.for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Überprüfen Sie für jeden aus dem vorherigen Befehl erhaltenen Zweignamen diesen Zweig und versuchen Sie, ihn mit einem Schnellvorlauf zusammenzuführen. Wenn es fehlschlägt,break
wird aufgerufen und der Befehl stoppt hier.Natürlich können Sie ersetzen
git merge --ff-only
mit ,git rebase
wenn es ist , was Sie wollen.Schließlich können Sie es als Alias in Ihr Bashrc einfügen :
Oder wenn Sie Angst haben, das 'und' durcheinander zu bringen, oder einfach lieber die syntaktische Lesbarkeit in Ihrem Editor beibehalten möchten, können Sie dies als Funktion deklarieren:
Bonus:
Für diejenigen, die die Erklärung des
sed '/*/{$q;h;d};$G'
Teils wünschen :/*/
=> Suche nach der Zeile mit a*
.{$q
=> Wenn es in der letzten Zeile steht, beenden Sie (wir müssen nichts tun, da der aktuelle Zweig bereits der letzte in der Liste ist).;h;d}
=> Andernfalls speichern Sie die Zeile im Haltepuffer und löschen Sie sie an der aktuellen Listenposition.;$G
=> Wenn die letzte Zeile erreicht ist, hängen Sie den Inhalt des Haltepuffers an.quelle
&&
indem Sieset -e
oben im Skript festlegen.Nein, ich kann nicht. Für den schnellen Vorlauf habe ich dazu ein kleines Tool geschrieben. https://github.com/changyuheng/git-fast-forward-all
Vorteile dieses Tools:
hub sync
Unterstützt derzeit nicht mehrere Fernbedienungen.)quelle
git fetch . refspec
. Das.
sagt, dass aus dem aktuellen Repository anstatt aus dem Remote-Repository abgerufen werden soll.Ab Git 2.9:
git pull --rebase --autostash
Siehe https://git-scm.com/docs/git-rebase
quelle
In der Tat
version 1.8.3.1
funktioniert es mit git :Im Hauptzweig können Sie alle anderen Zweige aktualisieren. @Cascabel
Ich weiß nicht, welche Version es kaputt macht / repariert, in 2.17 (welche ich benutze) kann es funktionieren.
quelle