¿Las etiquetas git también se empujan?

190

Desde que creé mi repositorio, parece que las etiquetas que he estado creando no se envían al repositorio. Cuando lo hago git tagen el directorio local, todas las etiquetas están presentes, pero cuando inicio sesión en el repositorio remoto y hago un git tag, solo aparecen los primeros.

¿Cuál podría ser el problema?.

vfclists
fuente
3
git push --follow-tagsahora puede ser útil, mira mi respuesta a continuación
VonC
1
De acuerdo con el duplicado: aunque esto es más antiguo, la otra pregunta está mejor planteada.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

247

Podrías hacer esto:

git push --tags
eevar
fuente
27
Estoy bastante seguro de que eso significa que las referencias de HEAD no serán presionadas, lo que significa que SOLO presionas las etiquetas.
Dan Rosenstark
47
"Recomiendo no usar o entrenar a otros para que lo usen, git push --tagsya que puede ser muy difícil deshacerse de las etiquetas malas cuando sus compañeros de trabajo están capacitados para presionar todas las etiquetas, ya que las personas continúan presionando las viejas etiquetas malas que tienen localmente cada vez que quiero insertar una nueva etiqueta. Debido a esto, solo aconsejaré a alguien que use git push origin <tag_name>ahora ". - copiado de stackoverflow.com/a/5195913/4130619
reducción de actividad
Creo que la otra respuesta, stackoverflow.com/a/16164809/11635 debería ser aceptada. Incluso si no es así, que sin duda debe ser leído - que proporciona ventajas y desventajas y, en última instancia una respuesta más práctica y correcta para hoy
Ruben Bartelink
140

En la configuración remota de git predeterminada, debe insertar etiquetas explícitamente (mientras se obtienen automáticamente junto con las confirmaciones a las que apuntan). Necesitas usar

$ git push <remote> tag <tagname>

para empujar una sola etiqueta, o

$ git push <remote> --tags

para empujar todas las etiquetas (o git push --tagspara empujar al control remoto predeterminado, por lo general origin).

Este es un comportamiento muy intencionado, para hacer explícitas las etiquetas de empuje. Empujar etiquetas debería ser una elección consciente.


Resumiendo lo que escribió Junio ​​C. Hamano (vinculado en comentarios de @Andre Miras)

Al buscar, está interactuando con un repositorio remoto que alguien ha publicado, lo que significa:

  1. el conjunto de etiquetas que existen allí es todo lo que el editor quería que la gente viera, y
  2. no solo usted sino otras personas también verán las mismas etiquetas.

En otras palabras, las etiquetas en los repositorios que obtiene están diseñadas para ser públicas y compartidas. Facilitará la comunicación entre desarrolladores si es fácil para todos obtener estas mismas etiquetas.

Es por eso que git fetchautomáticamente "sigue" las etiquetas, es decir, descarga las etiquetas al descargar las revisiones a las que apuntan; en otras palabras, descarga todas las etiquetas publicadas relevantes .

Al empujar, está empujando desde su repositorio de trabajo, que la mayoría de las veces no es público, y las etiquetas en ese repositorio no están diseñadas para ser públicas. Puede usar sus propias etiquetas locales para marcar su progreso, por lo que no tiene sentido empujar ciegamente todas las etiquetas en su repositorio al repositorio que está presionando para publicar sus cambios, cuyas etiquetas son, por definición, públicas.

Es por eso que debe presionar la etiqueta explícitamente, para marcar la etiqueta como pública.


Alternativamente, puede configurar el control remoto que empuja para que siempre empuje todas las etiquetas, por ejemplo, coloque algo así en su .git/config:

["publicación" remota] # o como se llame
    url = ...
    push = + refs / heads / *: refs / heads / *
    push = + refs / tags / *: refs / tags / *

Esto significa forzar el empuje de todas las cabezas (todas las ramas) y todas las etiquetas (si no desea forzar el empuje de las cabezas, elimine el prefijo '+' de refspec).

Jakub Narębski
fuente
¿No hace esto siempre un "empuje forzado" de todas las cabezas?
Stefan Näwe
@Stefan: Sí, lo hace. Actualizado.
Jakub Narębski
19
"Este es un comportamiento muy intencionado, hacer explícitas las etiquetas de empuje. Las etiquetas de empuje deberían ser una elección consciente". No entiendo la razón. ¿Puedes explicar por qué sería malo para Git insertar etiquetas automáticamente?
Ryan Lundy
13
@ Kyralessa, en esta publicación git.661346.n2.nabble.com/… , Junio ​​C Hamano (actual mantenedor de Git) explica por qué es malo presionar etiquetas automáticamente.
Andre Miras
@AndreMiras Gracias por este increíble enlace. Sería bueno si pudiéramos integrar la publicación de Junio ​​en esta respuesta.
Homer6
67

Tenga en cuenta que 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 las anotadas a las que hacen referencia las confirmaciones que se envían con el git push.


Esto ha sido introducido en commit c2aba15 por Junio ​​C Hamano ( gitster) :

La nueva opción " --follow-tags" dice "git push " que empuje las etiquetas anotadas que faltan en el otro lado y que pueden ser alcanzadas por el historial que de otro modo se eliminaría.

Por ejemplo, si está utilizando el " simple", " current" o " upstream" push, normalmente empujaría el historial que conduce al commit en su actual HEADy nada más.
Con esta opción, también empujaría todas las etiquetas anotadas a las que se puede llegar desde ese compromiso al otro lado.


La configuración push.followTagspermite incluir --follow-tagspor defecto (Git 2.4.1+, Q2 2015). Consulte " Enviar confirmaciones y etiquetas de git simultáneamente "

VonC
fuente
3
Esto solo empuja todas las etiquetas anotadas . La mayoría de las personas / proyectos están usando etiquetas livianas . Así que en la mayoría de los casos git push --follow-tagsno empuja más quegit push
Jarl
3
@Jarl sí, he mencionado "anotado" en mi respuesta. Pero realmente solo he usado etiquetas anotadas, reservando etiquetas livianas para uso puramente interno (es decir, nunca pretendieron ser presionadas de todos modos).
VonC
@VonC: ahora también hay una opción de configuración que hace que este sea el predeterminado, como usted señaló aquí: stackoverflow.com/a/3745250/946850
krlmlr
19

Lo que suelo hacer es:

["publicación" remota] # o como se llame
    url = ...
    empujar =:
    push = + refs / tags / *: refs / tags / *

Lo que significa que empuja cada rama que ya está allí, además de etiquetas. No fuerza el empuje, y no empuja la rama que no empujó manualmente.

estera
fuente
¿Puedo poner eso también en la configuración global de git de mi usuario? Si es así, ¿cómo? ¡Gracias! :)
gucki
Parece que estás forzando las etiquetas, pero no las ramas.
Adrian Ratnapala
Bueno, sí, y no, escribí eso, empujará nuevas etiquetas, no forzará a empujarlas, y no empujará ramas que aún no ha empujado.
mat
Intenté la sugerencia de Jakub, pero estaba empujando ramas que solo quería localmente. Esta sugerencia, mat, funciona perfecto. Sincroniza etiquetas pero no sincroniza ramas a menos que sean ramas de seguimiento remoto (es decir, no empujará nuevas ramas al control remoto, pero las actualizará si ya están en el control remoto). NOTA: si tiene una etiqueta y una rama con el mismo nombre, aparece el error "coincide con más de un". Consulte lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell
5

Y si desea forzar la obtención de todas las etiquetas, puede configurarlo en la configuración de la siguiente manera:

git config remote.origin.tagopt --tags

De los documentos:

Establecer este valor en --no-tags deshabilita el seguimiento automático de etiquetas cuando se recupera desde el control remoto. Si lo configura en --tags, obtendrá todas las etiquetas del control remoto, incluso si no se puede acceder a ellas desde los cabezales de las ramas remotas. Pasar estos indicadores directamente a git-fetch (1) puede anular esta configuración. Ver opciones --tags y --no-tags de git-fetch (1).

Boryn
fuente
1
La pregunta estaba más orientada a "empujar", ¿su respuesta también se aplica al empujar a un control remoto?
a1an