web-dev-qa-db-fra.com

Git - Envoyer du code à deux télécommandes

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?

414
yasith

Dans les versions récentes de Git, vous pouvez ajouter plusieurs pushurls pour une télécommande donnée. Utilisez ce qui suit pour ajouter deux pushurls à 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 pushurls 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 pushurls 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.

653
jweyrich

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.

84