oneline - Configurar git para tirar y empujar todas las ramas
git push (9)
Me gustaría empujar y jalar todas las ramas por defecto, incluyendo las recién creadas.
¿Hay una configuración que pueda definir para ella?
De lo contrario, cuando agrego una nueva rama, localmente y quiero extraerla del servidor, ¿cuál es la forma más sencilla de hacerlo?
Creé una nueva rama con el mismo nombre y traté de extraerla pero no funciona. Me pide toda la configuración remota de la rama. ¿Cómo lo configuro?
Solución sin origin
hardcoding en config.
Usa lo siguiente en tu gitconfig global
[remote]
push = +refs/heads/*
push = +refs/tags/*
Esto empuja todas las ramas y todas las etiquetas.
¿Por qué NO deberías codificar el origin
en configuración?
Si usted codifica:
- Terminarás con el
origin
como un control remoto en todos los repositorios. Así que no podrás agregar origen, pero necesitas usarset-url
. - Si una herramienta crea un control remoto con un nombre diferente, no se aplicarán todas las configuraciones. Luego tendrá que cambiar el nombre del control remoto, pero el cambio de nombre no funcionará porque el
origin
ya existe (desde el punto 1) recuerde :)
La recogida ya está a cargo del git moderno.
Según la respuesta de Jakub NarÄ™bski:
Con git moderno, siempre se obtienen todas las ramas (como ramas de seguimiento remoto en refs / remotes / origen / * espacio de nombres)
Con git moderno, siempre se obtienen todas las ramas (como ramas de seguimiento remoto en refs/remotes/origin/*
espacio de nombres, visibles con git branch -r
o git remote show origin
).
De forma predeterminada (consulte la documentación de la variable de configuración push.default
), empuja ramas coincidentes , lo que significa que primero tiene que hacer la git push origin branch
para que git lo presione siempre en git push
.
Si desea empujar siempre todas las ramas , puede configurar push refspec. Suponiendo que el control remoto se denomina origin
, puede utilizar git config :
$ git config --add remote.origin.push ''+refs/heads/*:refs/heads/*''
$ git config --add remote.origin.push ''+refs/tags/*:refs/tags/*''
o edite directamente el archivo .git/config
para tener algo como lo siguiente:
[remote "origin"] url = [email protected]:/srv/git/repo.git fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/tags/*:refs/tags/* push = +refs/heads/*:refs/heads/* push = +refs/tags/*:refs/tags/*
Incluir el signo + en la especificación de empuje es probablemente una mala idea, ya que significa que git hará con gusto un empuje sin avance incluso sin -f , y si el servidor remoto está configurado para aceptarlos, puede perder el historial.
Prueba solo esto:
$ git config --add remote.origin.push ''refs/heads/*:refs/heads/*''
$ git config --add remote.origin.push ''refs/tags/*:refs/tags/*''
$ git config --add remote.origin.fetch ''refs/heads/*:refs/remotes/origin/*''
$ git config --add remote.origin.fetch ''refs/tags/*:refs/tags/*''
La forma más sencilla es hacer:
git push --all origin
Esto empujará etiquetas y ramas.
Para ver todas las ramas sin usar git branch -a
debes ejecutar:
for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all
Ahora puedes ver todas las ramas:
git branch
Para empujar todas las ramas intente:
git push --all
Si está moviendo sucursales a un nuevo repositorio desde uno antiguo y NO tiene todas las sucursales de repositorios locales, deberá rastrearlas primero.
for remote in `git branch -r | grep -v ''/->''`; do git branch --track $remote; done
Luego agrega tu nuevo repositorio remoto:
git remote add bb <path-to-new-repo>
Luego puedes empujar todo usando este comando:
git push -u bb --all
O puede configurar el repositorio utilizando los comandos de configuración de git anotados en las otras respuestas aquí si no lo hace una sola vez o solo busca mover sucursales locales.
El punto importante, las otras respuestas solo empujan todas las ramas LOCALES. Si las ramas solo existen en un repositorio REMOTO alternativo, no se moverán sin rastrearlas primero. El bucle for presentado aquí ayudará con eso.
Si está moviendo todas las ramas a un nuevo repositorio desde uno antiguo, en su repositorio local necesita configurar el seguimiento de cada rama a las ramas de origen existentes, antes de pasar al nuevo repositorio, de lo contrario, no aparecerán todas sus ramas de origen. El nuevo origen. Haga esto de forma manual mediante el seguimiento o la comprobación de cada rama, o utilice un forro:
for remote in `git branch -r | grep -v ''/->'' | grep -v master`; do git branch --track `echo $remote|sed ''s=origin/==''` `echo $remote`; done
Este comando de una línea se basa en versiones de él en otras respuestas en esta página, pero es posiblemente mejor porque:
- configura correctamente el seguimiento de la rama, a diferencia de algunas variantes anteriores de este comando en esta página, que solo proporcionan un parámetro a --track y, por lo tanto, cada rama termina en el maestro de seguimiento - no es bueno
- nombra las sucursales locales sin el prefijo "origen /" que personalmente no quiero, y es coherente con lo que sucede cuando se registra una sucursal normalmente.
- omite el master de seguimiento ya que eso ya está sucediendo
- En realidad no hace checkout nada por lo tanto es rápido
- evita tropezar con el -> en la salida de la rama git -r
A continuación, si está cambiando los orígenes, reemplace el enlace al origen anterior y apunte a un nuevo control remoto. Asegúrese de crear el nuevo control remoto primero, utilizando la interfaz gráfica de usuario de bitbucket / github, pero no le agregue ningún archivo o habrá un problema de fusión. P.ej
git remote set-url origin [email protected]:YOUR/SOMEREPO.git
Ahora empuja. Tenga en cuenta que el segundo comando es necesario para empujar las etiquetas también:
git push -u --all origin
git push --tags origin
Yo había usado los siguientes comandos para migrar todas las ramas al nuevo repositorio.
~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror
NOTA : Tuve que usar el segundo último comando (es decir, empujar el maestro primero) al clonar un repositorio de Atlassian Stash a AWS CodeCommit (repositorio en blanco). No estoy seguro de la razón, pero después de presionar ( git push new-origin --mirror
), la rama predeterminada se refería a otra rama distinta de la master
.
for b in $(git branch -a | grep -v master | /
sed -e "s|remotes//origin///(.*/)|/1|g"); do git checkout $b && /
git push origin $b; done