Git: enviar código a dos controles remotos
Tengo dos repositorios git remotos. origin
ygithub
Envío mi rama devel
a ambos repositorios.
git push -u origin devel
git push -u github devel
Pero luego, cuando lo haga. git push
Sólo sería empujado a github
.
¿Hay alguna forma de configurar mis dos controles remotos para poder enviar cambios a ambos repositorios con un solo comando?
En versiones recientes de Git, puedes agregar varios pushurl
correos electrónicos para un control remoto determinado. Utilice lo siguiente para agregar dos pushurl
s a su origin
:
git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git
Entonces, cuando presionas origin
, se enviará a ambos repositorios.
ACTUALIZACIÓN 1 : Git 1.8.0.1 y 1.8.1 (y posiblemente otras versiones) parecen tener un error que hace que se --add
reemplace la URL original la primera vez que la usas, por lo que debes volver a agregar la URL original usando el mismo comando. . Al hacerlo, git remote -v
se deberían revelar las URL actuales de cada control remoto.
ACTUALIZACIÓN 2: Junio C. Hamano, el mantenedor de Git, explicó cómo fue diseñado. Al hacerlo, git remote set-url --add --push <remote_name> <url>
se agrega un pushurl
para un control remoto determinado, que anula la URL predeterminada para las inserciones. Sin embargo, puede agregar varios pushurl
correos electrónicos para un control remoto determinado, lo que le permitirá enviar mensajes a varios controles remotos usando un solo archivo git push
. Puede verificar este comportamiento a continuación:
$ 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/*
Ahora, si desea enviar dos o más repositorios usando un solo comando, puede crear un nuevo control remoto llamado all
(como lo sugiere @Adam Nelson en los comentarios) o seguir usando origin
, aunque este último nombre es menos descriptivo para este propósito. . Si aún desea utilizar origin
, omita el siguiente paso y utilícelo origin
en lugar de all
en todos los demás pasos.
Entonces, agreguemos un nuevo control remoto llamado all
al que nos referiremos más adelante cuando realicemos envíos a múltiples repositorios:
$ 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
Luego agreguemos un pushurl
al all
control remoto, apuntando a otro repositorio:
$ 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
Aquí git remote -v
se muestra lo nuevo pushurl
para push, por lo que si lo hace git push all master
, solo empujará la master
rama git://another/repo.git
. Esto muestra cómo pushurl
anula la URL predeterminada (remote.all.url).
Ahora agreguemos otro pushurl
que apunte al repositorio original:
$ 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
Verás pushurl
que los dos que agregamos se mantienen. Ahora un single git push all master
empujará la master
rama hacia ambos git://another/repo.git
y git://original/repo.git
.
NOTA IMPORTANTE : Si sus controles remotos tienen reglas distintas (ganchos) para aceptar/rechazar un empujón, un control remoto puede aceptarlo mientras que el otro no. Por lo tanto, si desea que tengan exactamente el mismo historial, deberá corregir sus confirmaciones localmente para que sean aceptables para ambos controles remotos y volver a presionar, o podría terminar en una situación en la que solo pueda solucionarlo reescribiendo el historial. (usando push -f
), y eso podría causar problemas a las personas que ya retiraron sus cambios anteriores del repositorio.
Para enviar a ambos controles remotos con un comando, puedes crear un alias para él:
git config alias.pushall '!git push origin devel && git push github devel'
Con esto, cuando uses el comando git pushall
, actualizará ambos repositorios.