J'ai deux dépôts git distants. Origin
et github
Je pousse ma branche devel
vers les deux référentiels.
git Push -u Origin devel
git Push -u github devel
Mais alors, quand je le fais. git Push
Il ne serait poussé que vers github
.
Est-il possible de configurer mes deux télécommandes de manière à pouvoir transmettre les modifications aux deux référentiels à l'aide d'une seule commande?
Dans les versions récentes de Git, vous pouvez ajouter plusieurs pushurl
s pour une télécommande donnée. Utilisez ce qui suit pour ajouter deux pushurl
s à votre Origin
:
git remote set-url --add --Push Origin git://original/repo.git
git remote set-url --add --Push Origin git://another/repo.git
Ainsi, lorsque vous appuyez sur Origin
, il envoie aux deux référentiels.
UPDATE 1 : Git 1.8.0.1 et 1.8.1 (et éventuellement d’autres versions) semblent avoir un bogue qui fait que --add
remplace le l'URL d'origine la première fois que vous l'utilisez, vous devez donc rajouter l'URL d'origine à l'aide de la même commande. Faire git remote -v
devrait révéler les URL actuelles de chaque télécommande.
UPDATE 2: Junio C. Hamano, le responsable de la maintenance de Git, a expliqué comment il a été conçu. Faire git remote set-url --add --Push <remote_name> <url>
ajoute une pushurl
pour une télécommande donnée, qui écrase l'URL par défaut des envois. Toutefois, vous pouvez ajouter plusieurs pushurl
s pour une télécommande donnée, ce qui vous permet ensuite d’appuyer sur plusieurs télécommandes à l’aide d’un seul git Push
. Vous pouvez vérifier ce comportement ci-dessous:
$ 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/*
Maintenant, si vous voulez pousser vers deux ou plusieurs référentiels en utilisant une seule commande, vous pouvez créer une nouvelle télécommande nommée all
(comme suggéré par @ Adam Nelson dans les commentaires), ou continuer à utiliser la Origin
, bien que ce dernier nom soit moins descriptif à cette fin. Si vous souhaitez toujours utiliser Origin
, ignorez l'étape suivante et utilisez Origin
au lieu de all
dans toutes les autres étapes.
Ajoutons donc une nouvelle télécommande appelée all
à laquelle nous ferons référence plus tard lors du transfert sur plusieurs référentiels:
$ 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
Ensuite, ajoutons un pushurl
à la télécommande all
, pointant vers un autre référentiel:
$ 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
Ici, git remote -v
affiche le nouveau pushurl
pour Push. Ainsi, si vous faites git Push all master
, il poussera la branche master
vers git://another/repo.git
. Cela montre comment pushurl
remplace l'adresse URL par défaut (remote.all.url).
Ajoutons maintenant un autre pushurl
pointant vers le référentiel d'origine:
$ 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
Vous voyez que les deux pushurl
s que nous avons ajoutés sont conservés. Maintenant, un seul git Push all master
va pousser la branche master
vers git://another/repo.git
et git://original/repo.git
.
Pour envoyer aux deux à distance avec une seule commande, vous pouvez créer un alias pour cela:
git config alias.pushall '!git Push Origin devel && git Push github devel'
Avec cela, lorsque vous utilisez la commande git pushall
, les deux référentiels seront mis à jour.