Wie kann ich von mehreren entfernten Standorten ziehen/drücken?
Lesezeit: 8 Minuten
Zorzella
Das kurze: Gibt es eine Möglichkeit, ein Git-Repo in eine Liste von Remote-Repos zu pushen und daraus zu ziehen (anstelle eines einzelnen “Ursprungs”)?
Das lange: Ich habe oft eine Situation, in der ich eine App auf mehreren Computern mit unterschiedlicher Konnektivität entwickle – sagen wir, ein Laptop während der Fahrt, ein Computer „A“, während ich an einem bestimmten Ort bin, und ein weiterer Computer „B“, während ich an einem anderen bin . Außerdem hat der Laptop möglicherweise nur Konnektivität mit entweder “A” oder “B” und manchmal mit beiden.
Was ich gerne hätte, ist, dass Git immer von allen Computern “pullt” und “pusht”, mit denen es sich derzeit verbinden kann, damit es einfacher ist, von einer Maschine zur anderen zu springen und nahtlos weiterzuarbeiten.
Hinweis für Neubesucher, Stand 2016: Der derzeit richtige Weg, sanktioniert durch First-Class git Features, ist in der Antwort von Malvineous unten enthalten. Die akzeptierte Antwort ist falsch.
– ELLIOTTKABEL
15. August 2016 um 1:13 Uhr
Ich fand die hier gegebene Antwort sehr gut detailliert und zusammengefasst
– Gangula
11. Januar um 18:27 Uhr
ELLIOTTKABEL
Eine manuelle Durchführung ist nicht mehr erforderlichmit modernen Versionen von git! Sehen Malvine‘s Lösung, unten.
Dieses Etwas verwende ich schon seit einiger Zeit ohne schlimme Folgen und wurde von Linus Torvalds auf der vorgeschlagen Git-Mailingliste.
araqnidDie Lösung von ist die richtige, um Code zu bringen hinein Ihr Repository … aber wenn Sie, wie ich, mehrere gleichwertige maßgebliche Upstreams haben (ich halte einige meiner wichtigeren Projekte sowohl auf einen privaten Upstream, GitHub als auch auf Codaset geklont), kann es mühsam sein, Änderungen an jedem einzelnen vorzunehmen Tag.
Um es kurz zu machen, git remote add alle Ihre Fernbedienungen einzeln … und dann git config -e und fügen Sie eine zusammengeführte Fernbedienung hinzu. Angenommen, Sie haben dieses Repository config:
Sobald ich das getan habe, wenn ich git push Origin Masterwird es auf beide drücken Paws/Master und Codaset/Master nacheinander, um das Leben ein wenig einfacher zu machen.
git config -e öffnet die .git/config Datei in Ihrem bevorzugten Editor.
– Richard
27. Januar 2012 um 16:52 Uhr
Nur für den Fall. Bestätigen, dass eine Fernbedienung mit 2 URLs unter 1.7.12.4 immer noch funktioniert. Danke.
– foobar
9. November 2012 um 14:59 Uhr
Ich habe die “Origin”-Fernbedienung “all” genannt, um ihr eine etwas sauberere Semantik zu verleihen
– ErichBSchulz
17. Februar 2013 um 6:23 Uhr
@JamesWomack siehe die Antwort von @Malvineous unten. Es ist jetzt „korrekter“, als gitDie Befehlszeile von unterstützt dies nativ mit git remote set-url ... --add.
– ELLIOTTKABEL
19. September 2013 um 7:19 Uhr
Unter [branch "Master"] einstellen remote = Origin und git pull werde beide Fernbedienungen verwenden.
– Bengt
16. Juni 2014 um 19:07 Uhr
araqnid
Sie können mehrere Remote-Repositories mit konfigurieren git remote Befehl:
git remote add alt alt-machine:/path/to/repo
Von allen konfigurierten Remotes abrufen und Tracking-Zweige aktualisieren, aber nicht zusammenführen HEADtun:
git remote update
Wenn es derzeit nicht mit einer der Fernbedienungen verbunden ist, dauert es eine Weile oder es wird ein Fehler ausgegeben und es wird mit dem nächsten fortgefahren. Sie müssen die abgerufenen Repositories manuell zusammenführen oder cherry-pickje nachdem, wie Sie das Sammeln von Änderungen organisieren möchten.
Um den Master-Zweig von alt abzurufen und in Ihren aktuellen Kopf zu ziehen, tun Sie Folgendes:
git pull alt master
Also tatsächlich git pull ist fast eine Abkürzung für git pull origin HEAD (Eigentlich sieht es in der Konfigurationsdatei aus, um dies festzustellen, aber Sie bekommen die Idee).
Um Updates zu pushen, müssen Sie dies für jedes Repo manuell tun.
Ein Push wurde meiner Meinung nach mit Blick auf den zentralen Repository-Workflow entwickelt.
Sie sagen also, dass “git remote add foo ssh://foo.bar/baz” eine Kurzform erstellt, aber ich muss sie immer noch mit einem “git pull” überschleifen oder mit einem “git merge” (wie lautet hier die Syntax nach einem “git remove update”?) Funktioniert dieser Kurzname nicht auch für “git push”? Dh kann ich nicht “git push foo” etc (loop)? Danke
– Zorzella
11. Mai 2009 um 22:50 Uhr
“git pull” ist im Grunde “git fetch”, gefolgt von “git merge”. “git remote update” erledigt nur eine Reihe von “git fetch”-Aufrufen für Sie. Was bleibt, ist also das Bit “git merge”. Sie können “git merge origin/master” sagen und es wird die Master-Version von origin mit Ihrem aktuellen HEAD zusammenführen. “git pull origin master” macht dasselbe, obwohl es zuerst einen Abruf durchführt (und wenn Sie bereits ein git remote update durchgeführt haben, muss das nichts mehr abrufen, also ist es überflüssig). Ja, Sie können “git push foo” sagen und es werden alle passenden Branches auf die Fernbedienung namens “foo” geschoben.
– araqnid
11. Mai 2009 um 23:19 Uhr
Anscheinend können Sie auch einen einzigen Push für mehrere Repos haben, überprüfen Sie diese Antwort für weitere Details stackoverflow.com/questions/14290113/…
– manei_cc
7. Mai 2014 um 16:20 Uhr
Malvine
Seit git 1.8 (Oktober 2012) können Sie dies über die Befehlszeile tun:
Dann git push pusht zu user1@repo1 und dann zu user2@repo2.
Ich rate dringend von dieser Lösung ab. Wir haben es in unserem Unternehmen verwendet und hatten ernsthafte Probleme mit Hooks, die an einem Repository fehlschlugen, aber nicht an dem anderen. Changesets waren dann nur noch in einem Repository vorhanden.
– Michael Schmeißer
7. Juni 2013 um 7:37 Uhr
@MichaelSchmeißer: Vermutlich konntest du die Fehlermeldungen beim Pushen sehen, das Problem beheben und dann erneut pushen, um alles wieder in einen sauberen Zustand zu bringen?
– Malvine
7. Juni 2013 um 21:38 Uhr
Das Problem ist, dass das Reparieren des abgelehnten Pushs das Ändern der Commits beinhaltet, die bereits in das andere Repo gepusht wurden. Wenn also jemand bereits auf diesen Commits basiert, wenn sie behoben sind, werden die Dinge wirklich unangenehm, was in unserem Büro der Fall war.
– Michael Schmeißer
7. Juni 2013 um 22:42 Uhr
Ah ja, das könnte knifflig werden. Allerdings scheint mir, dass die Haken neu gestaltet werden müssen. Ein fehlgeschlagener Push unterbricht Git normalerweise nicht, daher ist die Einführung eines neuen Fehlerpunkts (der Sie auch daran hindert, eine raffinierte Git-Funktion zu verwenden) wahrscheinlich nicht die beste Lösung. Natürlich sage ich das ohne zu wissen, was Ihre Anforderungen sind…
– Malvine
7. Juni 2013 um 23:22 Uhr
Nein. Seit ich meine Frage geschrieben habe, habe ich andere Web-Postings gelesen und dieses Ding dann getestet. Durch das Lesen anderer Postings habe ich den Verdacht, dass nur die erste Zeile verwendet wird. Ich habe das gerade getestet: Tatsächlich wird nur die URL aus der ersten Zeile von überprüft git fetch. (In Anbetracht dessen verstehe ich den Zweck nicht git remote set-url --add kann ohne sein --push.)
– imz – Ivan Zakharyaschev
19. Mai 2016 um 12:32 Uhr
Ich habe diese Aliase zu meiner ~/.bashrc hinzugefügt:
alias pushall="for i in `git remote`; do git push $i; done;"
alias pullall="for i in `git remote`; do git pull $i; done;"
FelipeC
Sie können Fernbedienungen hinzufügen mit:
git remote add a urla
git remote add b urlb
Um dann alle Repos zu aktualisieren, tun Sie Folgendes:
git remote update
Troex
Hier ist mein Beispiel mit Bash-Skript drin .gitconfig Alias-Bereich
[alias]
pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
Diese Antwort unterscheidet sich von den vorherigen Antworten, weil es vermeidet die unnötige und asymmetrische Verwendung der --push Möglichkeit in dem set-url Befehl von git-Fernbedienung. Auf diese Weise sind beide URLs symmetrisch in ihrer Konfiguration. Für Skeptiker ist die Git-Konfiguration wie gezeigt von cat ./.git/config sieht anders aus mit gegen ohne diese Option.
Hinweis für Neubesucher, Stand 2016: Der derzeit richtige Weg, sanktioniert durch First-Class
git
Features, ist in der Antwort von Malvineous unten enthalten. Die akzeptierte Antwort ist falsch.– ELLIOTTKABEL
15. August 2016 um 1:13 Uhr
Ich fand die hier gegebene Antwort sehr gut detailliert und zusammengefasst
– Gangula
11. Januar um 18:27 Uhr