847 Stimmen

Wie kann ich von mehreren entfernten Standorten aus einen Pull/Push durchführen?

Die Kurzfassung: Gibt es eine Möglichkeit, ein Git-Repository in eine Liste von entfernten Repos zu pushen und von dort zu beziehen (statt von einem einzigen "Ursprung")?

Die lange: Ich habe oft die Situation, dass ich eine Anwendung auf mehreren Computern mit unterschiedlichen Verbindungen entwickle - z. B. auf einem Laptop unterwegs, auf einem Computer "A", wenn ich mich an einem bestimmten Ort befinde, und auf einem anderen Computer "B" an einem anderen Ort. Außerdem kann der Laptop entweder nur mit "A" oder "B" verbunden sein, manchmal auch mit beiden.

Ich möchte, dass Git immer von allen Computern, mit denen es sich derzeit verbinden kann, "pull" und "push" macht, damit es einfacher ist, von einem Rechner zum anderen zu wechseln und nahtlos weiterzuarbeiten.

46 Stimmen

Hinweis für neue Besucher, ab 2016: Die derzeit korrekte Vorgehensweise, die von der First Class git Funktionen, ist enthalten in bösartig 's Antwort unten . Die akzeptierte Antwort ist falsch.

0 Stimmen

Ich habe die Antwort gefunden hier zur Verfügung gestellt sehr detailliert und zusammenfassend zu sein

854voto

ELLIOTTCABLE Punkte 15484

Die manuelle Durchführung ist nicht mehr notwendig mit modernen Versionen von git ! Siehe Malvineous die Lösung, unter .

Hier wiedergegeben:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

Ursprüngliche Antwort:

Das ist etwas, das ich schon eine ganze Weile ohne schlechte Folgen benutze und das von Linus Torvalds auf der Git-Mailingliste .

araqnid ist die richtige Lösung, um den Code in Ihr Repository aber wenn Sie, wie ich, mehrere gleichwertige maßgebliche Upstreams haben (ich habe einige meiner kritischeren Projekte sowohl in einen privaten Upstream, GitHub und Codaset geklont), kann es mühsam sein, jeden Tag Änderungen in jeden einzelnen zu übertragen.

Lange Rede kurzer Sinn, git remote add alle Ihre Fernbedienungen einzeln und dann git config -e und fügen Sie ein mergedremote hinzu. Angenommen, Sie haben dieses Repository config :

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

um ein mergedremote zu erstellen für "Paws" y "Codaset" kann ich nach all dem das Folgende hinzufügen:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

Sobald ich das getan habe, kann ich, wenn ich git push Origin Master wird es zu beiden Paws/Master y Codaset/Master der Reihe nach, was das Leben ein wenig einfacher macht.

114 Stimmen

git config -e öffnet die .git/config Datei in Ihrem bevorzugten Editor.

5 Stimmen

Für den Fall der Fälle. Bestätigen, dass eine Fernbedienung mit 2 URLs immer noch den Job auf 1.7.12.4 tun. Danke.

27 Stimmen

Ich habe den "Ursprung" in "all" umbenannt, um die Semantik etwas zu verbessern.

569voto

araqnid Punkte 116680

Sie können mehrere entfernte Repositories mit der Option git remote Befehl:

git remote add alt alt-machine:/path/to/repo

Um von allen konfigurierten Remotes zu holen und die Verfolgungszweige zu aktualisieren, aber nicht zusammenzuführen in HEAD , tun:

git remote update

Wenn derzeit keine Verbindung zu einer der Fernbedienungen besteht, wird eine Zeitüberschreitung oder ein Fehler gemeldet, und es wird zur nächsten weitergeleitet. Sie müssen dann manuell aus den abgerufenen Repositories zusammenführen, oder cherry-pick je nachdem, wie Sie die Erfassung von Änderungen organisieren wollen.

Um den Master-Branch von alt zu holen und ihn in den aktuellen Head zu ziehen, tun Sie dies:

git pull alt master

Also in der Tat git pull ist quasi die Kurzform für git pull origin HEAD (eigentlich schaut es in der Konfigurationsdatei nach, um dies zu bestimmen, aber Sie verstehen schon).

Um Updates zu pushen, müssen Sie dies für jedes Repository manuell tun.
A-Push wurde, so glaube ich, mit Blick auf den Arbeitsablauf in der zentralen Ablage entwickelt.

0 Stimmen

Sie sagen also, dass "git remote add foo ssh://foo.bar/baz" eine Kurzform erzeugt, aber ich muss sie immer noch mit "git pull" oder mit "git merge" (wie lautet die Syntax hier, nach einem "git remove update"?) in einer Schleife bearbeiten. Kann ich also nicht "git push foo" usw. ausführen (Schleife)? Vielen Dank

10 Stimmen

"git pull" ist im Grunde "git fetch" gefolgt von "git merge". "git remote update" führt lediglich eine Reihe von "git fetch"-Aufrufen für Sie aus. Bleibt also nur noch der "git merge"-Teil. Du kannst "git merge origin/master" sagen und es wird die origin Version von master in deinen aktuellen HEAD einfügen. "git pull origin master" macht dasselbe, obwohl es zuerst einen Fetch durchführt (und wenn Sie bereits git remote update gemacht haben, wird es nichts mehr zu holen geben, also ist es überflüssig). Ja, Sie können "git push foo" sagen und es wird alle passenden Zweige auf den entfernten Zweig namens "foo" verschieben.

2 Stimmen

Offensichtlich kann man auch einen einzigen Push für mehrere Repos haben, siehe diese Antwort für weitere Details stackoverflow.com/questions/14290113/

300voto

Malvineous Punkte 22238

Seit Git 1.8 (Oktober 2012) können Sie dies über die Befehlszeile tun:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

Dann git push wird an user1@repo1 pushen, dann an user2@repo2.

26 Stimmen

Ich rate dringend von dieser Lösung ab. Wir haben sie in unserem Unternehmen verwendet und hatten ernsthafte Probleme mit Hooks, die in einem Repository fehlschlugen, im anderen aber nicht. Die Änderungssätze waren dann nur in einem Repository vorhanden.

7 Stimmen

@MichaelSchmeißer: Vermutlich könnte man die Fehlermeldungen beim Pushen sehen, das Problem beheben und dann erneut pushen, um alles wieder in einen sauberen Zustand zu bringen?

9 Stimmen

Das Problem ist, dass die Korrektur des abgelehnten Pushs eine Änderung der Commits beinhaltet, die bereits in das andere Repo verschoben wurden. Wenn also jemand zu dem Zeitpunkt, an dem sie korrigiert werden, bereits auf diesen Commits basiert, werden die Dinge wirklich unangenehm, was in unserem Büro der Fall war.

34voto

Nona Urbiz Punkte 4725

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;'

6 Stimmen

Das ist großartig! Am Ende hatte ich einen Git-Alias: git config alias.pushall '!for i in Git-Fernbedienung ; do git push $i; done;'

0 Stimmen

Ich denke, ich ziehe die Alias-Lösung der Erstellung einer neuen Fernbedienung vor. Siehe auch stackoverflow.com/questions/41372919/

1 Stimmen

Kleiner Verbesserungsvorschlag: alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'

27voto

FelipeC Punkte 7866

Sie können Fernbedienungen mit hinzufügen:

git remote add a urla
git remote add b urlb

Dann aktualisieren Sie alle Repos zu tun:

git remote update

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X