Git-Pushing code to two remotes [duplicate]

To pytanie ma już odpowiedź tutaj:

Mam dwa zdalne repozytoria Gita. origin i github

Wciskam gałąź devel do obu repozytoriów.

git push -u origin devel
git push -u github devel
Ale wtedy, kiedy to zrobię. git push zostanie tylko zepchnięty do github.

Czy w ogóle mogę ustawić w górę dwa piloty, tak, że mogę push zmiany do obu repozytoriów z jednym poleceniem ?

 348
Author: yasith, 2013-01-12

2 answers

W ostatnich wersjach Git możesz dodać wiele pushurl s dla danego pilota. Aby dodać dwa pushurldo swojego origin, Użyj następującego wzoru:

git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git

Więc kiedy wciśniesz origin, to wciśnie się do obu repozytoriów.

UPDATE 1: Git 1.8.0.1 i 1.8.1 (i prawdopodobnie inne wersje) wydają się mieć błąd, który powoduje, że --add zastępuje oryginalny URL przy pierwszym użyciu, więc musisz ponownie dodać oryginalny URL używając tego samego polecenia. Robienie git remote -v powinno ujawnić aktualne adresy URL dla każdego pilota.

Aktualizacja 2: Junio C. Hamano, opiekun Gita, wyjaśnił, jak został zaprojektowany. Robienie git remote set-url --add --push <remote_name> <url> dodaje pushurl dla danego pilota, który nadpisuje domyślny adres URL dla wypychania. Można jednak dodać wiele pushurls dla danego pilota, co pozwala na naciśnięcie na wiele pilotów za pomocą jednego git push. Możesz zweryfikować to zachowanie poniżej:

$ git clone git://original/repo.git
$ git remote -v
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.'
remote.origin.url=git://original/repo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

Teraz, jeśli chcesz przejść do dwóch lub więcej repozytoriów za pomocą pojedyncze polecenie, możesz utworzyć nowy zdalny o nazwie all (zgodnie z sugestią @Adam Nelson w komentarzach), lub używać origin, choć ta ostatnia nazwa jest mniej opisowa w tym celu. Jeśli nadal chcesz użyć origin, pomiń następny krok i użyj origin zamiast all we wszystkich pozostałych krokach.

Dodajmy więc nowy pilot o nazwie all, do którego będziemy odwoływać się później, gdy będziemy naciskać na wiele repozytoriów:

$ git remote add all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)               <-- ADDED
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git            <-- ADDED
remote.all.fetch=+refs/heads/*:refs/remotes/all/* <-- ADDED

Następnie dodajmy pushurl do all remote, wskazanie innego repozytorium:

$ git remote set-url --add --push all git://another/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)                 <-- CHANGED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git         <-- ADDED

Tutaj git remote -v pokazuje nowe pushurl dla przycisku push, więc jeśli to zrobisz git push all master, spowoduje to naciśnięcie master tylko do git://another/repo.git. Pokazuje to, jak pushurl nadpisuje domyślny adres url (zdalny.wszystkie.url).

Teraz dodajmy kolejne pushurl wskazując na oryginalne repozytorium:

$ git remote set-url --add --push all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git
remote.all.pushurl=git://original/repo.git        <-- ADDED

Widzisz, że oba pushurl, które dodaliśmy, są zachowane. Teraz pojedynczy git push all master przesunie gałąź master do obu git://another/repo.git i git://original/repo.git.

 538
Author: jweyrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Aby wysłać do obu zdalnych za pomocą jednego polecenia, możesz utworzyć dla niego alias:

git config alias.pushall '!git push origin devel && git push github devel'

Dzięki temu, gdy użyjesz polecenia git pushall, zaktualizuje oba repozytoria.

 72
Author: William Seiti Mizuta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 04:12:55