Git: enviar código a dos controles remotos

Resuelto yasith asked hace 11 años • 2 respuestas

Tengo dos repositorios git remotos. originygithub

Envío mi rama devela ambos repositorios.

git push -u origin devel
git push -u github devel

Pero luego, cuando lo haga. git pushSó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?

yasith avatar Jan 12 '13 11:01 yasith
Aceptado

En versiones recientes de Git, puedes agregar varios pushurlcorreos electrónicos para un control remoto determinado. Utilice lo siguiente para agregar dos pushurls 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 --addreemplace 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 -vse 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 pushurlpara un control remoto determinado, que anula la URL predeterminada para las inserciones. Sin embargo, puede agregar varios pushurlcorreos 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 originen lugar de allen todos los demás pasos.

Entonces, agreguemos un nuevo control remoto llamado allal 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 pushurlal allcontrol 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 -vse muestra lo nuevo pushurlpara push, por lo que si lo hace git push all master, solo empujará la masterrama git://another/repo.git. Esto muestra cómo pushurlanula la URL predeterminada (remote.all.url).

Ahora agreguemos otro pushurlque 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 pushurlque los dos que agregamos se mantienen. Ahora un single git push all masterempujará la masterrama hacia ambos git://another/repo.gity 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.

jweyrich avatar Jan 12 '2013 04:01 jweyrich

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.

William Seiti Mizuta avatar Jan 12 '2013 04:01 William Seiti Mizuta