Empuje git commits y etiquetas simultáneamente

387

Soy consciente de la razón por la que git push --tagses una operación separada de la vieja git push. Empujar etiquetas debe ser una elección consciente ya que no desea empujar accidentalmente una. Esta bien. Pero, ¿hay alguna forma de unir ambos? (Aparte de git push && git push --tags)

Will Robertson
fuente
44
¿Cuál es tu problema git push && git push --tags?
fuz
21
Nada en particular, es más lento ya que la conexión debe establecerse dos veces.
Will Robertson
16
Vea mi respuesta actualizada a continuación: hay una nueva --follow-tagsopción desde git 1.8.3
VonC
24
Otra razón para no hacer esto por separado es evitar activar dos compilaciones de CI para la misma confirmación, cuando tiene ese tipo de automatización.
Alex R
También --tagsno distingue entre las etiquetas ligeros y anotados fuente
karlsebal

Respuestas:

555

Actualización de mayo de 2015

A partir de git 2.4.1 , puedes hacer

git config --global push.followTags true

Si se establece en verdadero, habilite la opción --follow-tags por defecto.
Puede anular esta configuración en el momento de la inserción especificando --no-follow-tags.

Como se señala en este hilo de Matt Rogers respondiendo a Wes Hurd :

--follow-tags solo empuja etiquetas anotadas .

git tag -a -m "I'm an annotation" <tagname>

Eso sería empujado (en lugar de git tag <tagname>una etiqueta ligera, que no sería empujada, como mencioné aquí )

Actualización de abril de 2013

Desde git 1.8.3 (22 de abril de 2013) , ya no tiene que hacer 2 comandos para empujar ramas y luego empujar etiquetas :

La nueva " --follow-tags" opción le dice " git push" que empuje las etiquetas anotadas relevantes cuando empuje las ramas .

Ahora puede intentar, al presionar nuevas confirmaciones:

git push --follow-tags

Sin embargo, eso no empujará todas las etiquetas locales, solo la referenciada por commits que se empujan con el git push.

Git 2.4.1+ (Q2 2015) presentará la opción push.followTags: consulte " ¿Cómo hacer que" git push"incluya etiquetas dentro de una rama? ".

Respuesta original, septiembre de 2010

La opción nuclear sería git push --mirror, que empujará a todas las referencias hacia abajo refs/.

También puede insertar solo una etiqueta con su confirmación de rama actual:

git push origin : v1.0.0 

Puede combinar la --tagsopción con una especificación de referencia como:

git push origin --tags :

(ya que --tagssignifica: todas las referencias debajo refs/tagsse insertan , además de las especificaciones especificadas explícitamente en la línea de comando )


También tiene esta entrada " Empujar ramas y etiquetas con una sola invocación " git push "

Zoltán Füzesi acaba de publicar un consejo útil en la lista de correo de Git :

Solía .git/configresolver esto:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

Con estas líneas agregadas git push origin, cargará todas sus ramas y etiquetas. Si desea cargar solo algunos de ellos, puede enumerarlos.

Todavía no lo he probado, pero parece que podría ser útil hasta que se agregue otra forma de empujar ramas y etiquetas al mismo tiempo al git push.
Por otro lado, no me importa escribir:

$ git push && git push --tags

Tenga cuidado , como se ha comentado por Aseem Kishore

push = +refs/heads/*se obligará-empuja todas sus ramas .

Esto me mordió justo ahora, así que para tu información.


René Scheibe agrega este interesante comentario :

El --follow-tagsparámetro es engañoso ya que solo .git/refs/tagsse consideran las etiquetas debajo .
Si git gcse ejecuta, las etiquetas se mueven de .git/refs/tagsa .git/packed-refs. Después git push --follow-tags ...ya no funciona como se esperaba.

VonC
fuente
3
El único comentario en la publicación a la que vincula correctamente señala que la fuerzapush = +refs/heads/* de la línea empuja todas sus ramas. Esto me mordió justo ahora, así que para tu información.
Aseem Kishore
2
Re: la --follow-tagsbandera agregada en git 1.8.3, ¿puedo configurar mi instalación de git para que sea la predeterminada?
Trevor Burnham
1
@TrevorBurnham no, sólo el valor de push.default( git-scm.com/docs/git-config ) puede definir acciones predeterminadas de empuje ( nothing, matching, upstream, simplecomo en stackoverflow.com/a/10002469/6309 ). Necesita agregar --follow-tagexplícitamente.
VonC
1
@VonC ¿Qué pasa si quiero forzar a empujar la etiqueta? git push --follow-tags -fNo funcionó para mí.
mauryat
1
El --follow-tagsparámetro es engañoso ya que solo .git/refs/tagsse consideran las etiquetas debajo . Si git gcse ejecuta, las etiquetas se mueven de .git/refs/tagsa .git/packed-refs. Después git push --follow-tags ...ya no funciona como se esperaba.
René Scheibe
4

Quizás esto ayude a alguien:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          
Rajesh Gupta
fuente
Probé su solución con git-2.21.0.windows.1 y descubrí que 3 solo empuja la etiqueta
Dustin Sun
Está funcionando bien a mi fin. ¿Estás probando los 3 comandos en orden y el repositorio remoto está configurado (git remote -v)?
Rajesh Gupta
Utilicé "git commit -m" msg "en el paso 1 y no había un parámetro -a. Este podría ser el motivo. ¡Gracias por el seguimiento!
Dustin Sun
2

@desde Git 2.4

git push --atomic origin <branch name> <tag>

SoBeRich
fuente
0

Git GUI

Git GUI tiene un botón PUSH: perdona el juego de palabras y el cuadro de diálogo que abre tiene una casilla de verificación para las etiquetas.

Empujé una rama desde la línea de comando, sin etiquetas, y luego intenté nuevamente empujar la rama usando el --follow-tags opción descrita anteriormente. La opción se describe como las siguientes etiquetas anotadas. Mis etiquetas eran etiquetas simples.

Arreglé algo, etiqueté el commit con la corrección, (para que los colegas puedan elegir la solución), luego cambié el número de versión del software y etiqueté la versión que creé (para que los colegas puedan clonar esa versión).

Git regresó diciendo que todo estaba actualizado. ¡No envió las etiquetas! Quizás porque las etiquetas no fueron anotadas. Quizás porque no había nada nuevo en la rama.

Cuando hice un empuje similar con Git GUI, se enviaron las etiquetas.

Etiquetas enviadas con Git GUI

Por el momento, voy a empujar mis cambios a mis controles remotos con Git GUI y no con la línea de comandos y --follow-tags.

Ivan
fuente