Git-Pushing code to two remotes [duplicate]
To pytanie ma już odpowiedź tutaj:
- pull / push z wielu odległych miejsc 14 odpowiedzi
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 ?
2 answers
W ostatnich wersjach Git możesz dodać wiele pushurl
s dla danego pilota. Aby dodać dwa pushurl
do 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 pushurl
s 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
.
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.
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