Tengo los siguientes controles remotos configurados:
$ git remote
korg
rorg
Y las siguientes ramas:
$ git branch -a
* (no branch)
remotes/korg/gingerbread
remotes/korg/gingerbread-release
remotes/korg/honeycomb
remotes/korg/honeycomb-mr1-release
remotes/korg/master
remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
remotes/m/gingerbread -> korg/gingerbread
Ahora deseo empujar todas las ramas remotas desde korg
el rorg
control remoto. ¿Cómo puedo hacer eso?
Preferiblemente sin hacer una rama local para cada primero, si eso es evitable.
git
git-branch
git-push
git-remote
Bjarke Freund-Hansen
fuente
fuente
Respuestas:
Una prueba rápida que hace algunos repositorios temporales muestra que puede construir una especificación de referencia que puede hacer esto:
Entonces origen / BRANCHNAME: referencias / cabezas / BRANCHNAME
Comprobando en mi
rorg
control remoto:fuente
git push rorg origin/one:one
(sinrefs/heads/
) en su lugar?refs/heads/
prefijo está empujando una ramificación remota que no necesita serone
He encontrado este:
Y empujó todas mis ramas remotas de korg a rorg (incluso sin copias locales de las ramas). Vea la salida a continuación:
Y luego puedes hacer el mismo impulso para los
tags
árbitros:fuente
Everything up-to-date
en git 2.10.0 sin que pase nada, mientras que hacer lo mismo en ramas individuales funciona.HEAD
. Pero eso puede ser eliminado.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. Lo que es lo mismogit push rorg --tags
, pero es bueno entender lo que están haciendo estas cosas :)Para complementar la respuesta de patthoyt , aquí hay un breve script de shell que empuja todas las ramas de un control remoto a otro:
Para resumir, para cada rama remota en la fuente remota (excluyendo las ramas "puntero" como HEAD), empuje esa referencia al control remoto de destino. (El
${a//$SRC_REMOTE\/}
bit quita el nombre remoto de origen del nombre de la rama, es decir, seorigin/master
convierte enmaster
).fuente
git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Esto funciona en Zsh
fuente
Para cualquier script que sugiera que ejecute, sería aconsejable guardar o confirmar todos los cambios.
Necesitaba empujar varias ramas de un control remoto a otro. Estas respuestas requerían que las sucursales locales existieran previamente
Simplemente cambie origin1 al control remoto de origen y origin2 al control remoto de destino. Copie esto en "remoteBranchCloner.sh" y llámelo usando "sh callBranchCloner.sh".
Puede haber una mejor manera, que no haga varios empujones.
Si usa mi código, probablemente quiera usar el almacenamiento en caché de credenciales, de lo contrario, debe escribir sus credenciales varias veces.
Para ventanas :
Nota: Este script es para Linux . Si lo ejecuta en "git bash", el script funcionará, pero no puede ejecutarlo desde la consola nativa sin haber instalado algo especial.
Para linux
Donde [--global] significa opcionalmente agregar --global
Si desea configurar el seguimiento remoto de todas las sucursales a un nuevo control remoto:
Almacenado como un archivo .sh y ejecutado con "sh filename.sh" configurará todas las secuencias ascendentes para rastrear 'remotename' remoto
fuente
Debido a la
HEAD
rama adicional que se creó en la respuesta anterior , la forma más limpia que encontré para hacer esto es clonar en un repositorio desnudo y luego empujar todas las ramas al control remoto de la siguiente manera:fuente