Configure git para tirar y empujar todas las ramas

616

Me gustaría empujar y tirar todas las ramas de forma predeterminada, incluidas las recién creadas.

¿Hay una configuración que pueda definir para ello?

De lo contrario, cuando agrego una nueva sucursal, localmente y quiero extraerla del servidor, ¿cuál es la forma más sencilla de hacerlo?

Creé una nueva rama con el mismo nombre e intenté extraer pero no funciona. Me pide toda la configuración remota de la rama. ¿Cómo lo configuro?

Lakshman Prasad
fuente
44
"e intenté tirar pero no funciona". Detalles por favor. Muéstranos qué comando intentaste usar.
Jakub Narębski

Respuestas:

1298

La forma más simple es hacer:

git push --all origin

Esto empujará etiquetas y ramas.

brimble2010
fuente
10
Entre las docenas de respuestas que encontré en SO y otros lugares, esta es la forma más simple de impulsar una rama local recién creada, sin tocar la configuración. ¡Gracias!
András Szepesházi
174
Y si agrega -uuna vez, por ejemplo git push --all origin -u, el seguimiento se configura y luego puede simplemente usarlo git push.
Alec
23
Para git versión 1.7.12.3 tuve que usar git push --tags originpara empujar todas las etiquetas.
thisgeek
17
También mira "--mirror" en lugar de "--todos" esto empuja más cosas
Loda
21
ADVERTENCIA: Si tiene un montón de ramas LOCALES que no ha limpiado (características, revisiones) o no ha limpiado correctamente (yo), esto inundará su control remoto. Maldición. Y acabamos de hacer una poda. No estoy seguro de por qué mi local tenía tantas ramas sobrantes.
Jack
147

Con git moderno, siempre busca todas las ramas (como ramas de seguimiento remoto en el refs/remotes/origin/*espacio de nombres, visible con git branch -ro git remote show origin).

De forma predeterminada (consulte la documentación de la push.defaultvariable de configuración), empuja las ramas coincidentes , lo que significa que primero debe hacer git push origin branchque git lo empuje siempre activado git push.

Si desea empujar siempre todas las ramas , puede configurar push refspec. Asumiendo que el control remoto se llamaorigin , puede usar 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 .git/configarchivo para tener algo como lo siguiente:

["origen" remoto]
        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 / *
Jakub Narębski
fuente
3
@Merc: git push --all origines bueno publicar una vez todas las ramas y etiquetas, aunque el valor predeterminado hasta la versión actual 'semántica' coincidente significaría que empujaría todas las ramas después ... a menos que agregue una nueva rama o etiqueta. La configuración para "empujar [...] todas las ramas por defecto" es como está escrita.
Jakub Narębski
Podría mejorar la respuesta para agregar la forma de reconfigurar Git de esta manera. Esto es útil para los usuarios que han configurado el modo simple.
Dereckson
3
Esto ha cambiado desde git 2.0. Push default es simple, ya no coincide.
Mike
Intenté esto y obtuve un error al presionar: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Nota: estoy en git 2.0. Todavía estoy trabajando en cómo solucionar esto.)
Brian Lacy
2
Ahora el valor predeterminado para push.defaultes simple.
hasanghaforian
32

Incluir el + en la especificación de inserción es probablemente una mala idea, ya que significa que git felizmente hará una inserción no rápida, incluso sin -f , y si el servidor remoto está configurado para aceptarlas, 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/*'
Mark Reed
fuente
También puede agregar la --globalopción a cada uno de estos para que sea el valor predeterminado global para todos sus repositorios.
Ether
Es lamentable que git agregue automáticamente + al hacerlo git remote add.
Ether
27

Había utilizado 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 comando penúltimo último (es decir, presionar maestro primero) mientras clonaba 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 que no sea master.

vikas027
fuente
1
Perfecto para trasladar un repositorio a otro host. ¡Gracias!
Pelmered
2
De hecho, este es solo un método útil. Use git push new_origin --allsolo empuje sus ramas locales actuales a new_origin, no todas las ramas de origen.
yanzi1225627
Solo teniendo en cuenta que esto hace un --barerepositorio, que es un poco diferente de un repositorio normal, solo tiene los .gitarchivos, no sus archivos. Es perfectamente suficiente si no vas a trabajar en él. Ver --barey --mirror git-scm.com/docs/git-clone .
jmmut
Aunque solo tiene los archivos .git y no el código fuente real, si realiza una actualización remota, volverá a buscar todo, desde el origen hasta el destino.
SanthoshM
¡Esto fue un salvavidas! Este método "maestro antes del espejo" solucionó un problema con Bitbucket como destino y creyendo que una rama diferente a "maestro" era la rama principal.
Toddius Zho
12

Si está moviendo sucursales a un nuevo repositorio de uno antiguo y NO tiene todas las sucursales locales de repositorios antiguas, primero tendrá que rastrearlas.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Luego agregue su nuevo repositorio remoto:

git remote add bb <path-to-new-repo>

Entonces puedes empujar todo usando este comando:

git push -u bb --all

O puede configurar el repositorio utilizando los comandos de configuración de git que se indican en las otras respuestas aquí si no lo hace una 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.

Lance Cleveland
fuente
Por cierto, estoy usando "bb" en lugar de "origen" aquí porque supongo que su repositorio original / antiguo se llamaba "origen" y probablemente todavía esté adjunto a esa etiqueta. "bb" es para Bitbucket, donde moví mi repositorio original, pero puedes llamarlo algo más aplicable como "neworigin" si lo prefieres.
Lance Cleveland
2
Eso no funcionó para mí. Terminé con todas las sucursales remotas que rastrean la misma sucursal local: /
jhsowter
2
AFAIK esto no debería funcionar, según el comentario de @jhsowter. el comando correcto para que rastree una rama remota en un repositorio recién clonado es git branch --track reponame origin/reponameque de lo contrario obtendrá un seguimiento de todas las ramas remotas en la rama local actual
Pioneer Skies
Cambié el fragmento de recopilación de repositorios a git branch -r | grep -v '\->' | sed 's/ origin\///', que da solo el nombre de la rama remota.
Paul Hicks
6

Para ver todas las ramas sin usar git branch -adebe 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
tokhi
fuente
1
λ git fetch --todo origen fatal: fetch --todo no toma un argumento de repositorio
foxundermon
estas intentando git fetch --all?
tokhi
4

Si está moviendo todas las sucursales a un nuevo repositorio de uno antiguo, entonces en su repositorio local debe configurar el seguimiento de cada sucursal a las sucursales de origen existentes, antes de pasar al nuevo repositorio, de lo contrario, todas sus sucursales de origen no aparecerán en El nuevo origen. Haga esto manualmente rastreando o revisando cada rama, o use el único revestimiento:

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 podría decirse que es mejor porque:

  1. 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 para rastrear y, por lo tanto, cada rama termina siendo el patrón de seguimiento, no es bueno
  2. nombra las sucursales locales sin el prefijo "origen /", que personalmente no quiero, y es coherente con lo que sucede cuando finaliza la compra de una sucursal normalmente.
  3. omite el maestro de seguimiento ya que eso ya está sucediendo
  4. en realidad no paga nada por lo tanto es rápido
  5. evita tropezar con -> en la salida de git branch -r

A continuación, si está cambiando de origen, reemplace el enlace al origen anterior y apunte a un nuevo control remoto. Asegúrese de crear primero el nuevo control remoto, utilizando la GUI de bitbucket / github, pero no 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 también es necesario para insertar las etiquetas:

git push -u --all origin
git push --tags origin
abulka
fuente
0

Solución sin codificación originen la configuración

Use lo siguiente en su gitconfig global

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Esto empuja todas las ramas y todas las etiquetas

¿Por qué NO deberías codificar originen la configuración?

Si codifica:

  1. Terminarás con originun control remoto en todos los repositorios. Por lo tanto, no podrá agregar origen, pero debe usarlo set-url.
  2. Si una herramienta crea un control remoto con un nombre diferente, presione toda la configuración no se aplicará. Luego tendrá que cambiar el nombre del control remoto, pero cambiar el nombre no funcionará porque originya existe (desde el punto 1) recuerde :)

El git moderno ya se ocupa de la recuperación

Según la respuesta de Jakub Narębski:

Con git moderno, siempre busca todas las ramas (como ramas de seguimiento remoto en refs / remotes / origin / * namespace)

Dheeraj Bhaskar
fuente