2010-06-07 14 views
145

Desde que creé mi repositorio, parece que las etiquetas que he creado no se han enviado al repositorio. Cuando hago git tag en el directorio local , todas las etiquetas están presentes, pero cuando inicio sesión en el repositorio remoto y hago una etiqueta git, solo aparecen las primeras.¿Las etiquetas de git también se presionan?

¿Cuál podría ser el problema?

+2

'git push---follow tags' ahora puede ser útil, ver [mi respuesta a continuación] (http://stackoverflow.com/a/16164809/6309) – VonC

+1

duplicado posible de [Cómo ¿Puedo insertar una etiqueta en un repositorio remoto usando Git?] (http://stackoverflow.com/questions/5195859/how-can-i-push-a-tag-to-a-remote-repository-using-git) . –

+0

Estoy de acuerdo con el duplicado: aunque esto es más antiguo, la otra pregunta se plantea mejor. –

Respuesta

190

Usted puede hacer esto:

git push --tags 
+17

Estoy bastante seguro de que eso significa que los ref de HEAD no serán empujados, lo que significa que SOLAMENTE debe empujar las etiquetas. –

+21

"Recomiendo no usar o entrenar a otros para usar' git push --tags', ya que puede ser muy muy difícil deshacerse de las etiquetas incorrectas cuando sus compañeros de trabajo están capacitados para empujar todas las etiquetas, ya que las personas continúan presionando el viejo etiquetas malas que tienen localmente cada vez que quieren empujar una nueva etiqueta. Debido a esto, solo le aconsejo a alguien que use 'origen de origen de git ' ahora. " - copiado de http://stackoverflow.com/a/5195913/4130619 –

122

En la configuración remota git por defecto que tiene que empujar las etiquetas explícitamente (mientras están fue a buscar automáticamente junto con commits que apuntan). Es necesario utilizar

$ git push <remote> tag <tagname> 

para empujar una sola etiqueta, o

$ git push <remote> --tags 

empujar todas las etiquetas (o git push --tags a empujar a los valores predeterminados a distancia, por lo general origin).

Este es un comportamiento muy intencionado, para que las etiquetas de empuje sean explícitas. Las etiquetas de empuje deben ser generalmente una elección consciente.


Resumiendo lo Junio ​​C. Hamano wrote (vinculado en los comentarios de acuerdo @Andre Miras)

Cuando ir a buscar, que 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 las personas vean, y
  2. no solo usted sino otras personas también verán las mismas etiquetas.

En otras palabras, las etiquetas en los repositorios de las que extrae 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.

Por eso git fetch automáticamente "sigue" etiquetas, es decir, que descarga las etiquetas al descargar las revisiones a los que apuntan - en otras palabras, todas las descargas relevantes publicados etiquetas.

Al presionar, está presionando 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 presionar siempre todas las etiquetas, p.poner algo así en tu .git/config:

 
[remote "publish"] # or whatever it is named 
    url = ... 
    push = +refs/heads/*:refs/heads/* 
    push = +refs/tags/*:refs/tags/* 

Esto significa fuerza de empuje todas las cabezas de todas las ramas() y todas las etiquetas (si no desea que la fuerza de empuje de cabezas, eliminar el prefijo '+' desde refspec) .

+0

¿Esto no siempre hace un 'empujón de fuerza' de todas las cabezas? –

+0

@Stefan: Sí, lo hace. Actualizado. –

+18

"Este es un comportamiento muy intencionado, para que las etiquetas de empuje sean explícitas. Las etiquetas de empuje deberían ser generalmente una opción consciente". No entiendo el razonamiento. ¿Puedes explicar por qué sería malo para Git insertar etiquetas automáticamente? –

2

Y si desea forzar obtener todos los tags, es posible configurarlo en la configuración por:

git config remote.origin.tagopt --tags 

A partir de los documentos:

establece este valor en --no-etiquetas deshabilita el seguimiento automático de etiquetas cuando se obtiene desde remoto. Al establecerlo en --tags, obtendrá todas las etiquetas del control remoto, incluso si no son accesibles desde las sucursales remotas . Pasar estas banderas directamente a git-fetch (1) puede anular esta configuración de . Ver opciones - etiquetas y --no-etiquetas de git-fetch (1).

+0

La pregunta era más orientada al "empuje", ¿tu respuesta también se aplica cuando presionas a un control remoto? – a1an

18

Lo que suelo hacer es:

 
[remote "publish"] # or whatever it is named 
    url = ... 
    push = : 
    push = +refs/tags/*:refs/tags/* 

Lo que significa que empuja todas las ramas que ya está ahí, además de las etiquetas. No fuerza el empuje, y no empuja la rama que no presionó manualmente.

+0

¿Puedo también poner eso en la configuración global de git de mi usuario? Si es así, ¿cómo? ¡Gracias! :) – gucki

+0

Parece que estás forzando las etiquetas, pero no las ramas. –

+0

Bueno, sí, y no, escribí eso, empujará nuevas etiquetas, no forzará empujarlas, y no empujará ramas que no haya empujado usted mismo. – mat

47

Nota que desde git 1.8.3 (April 22d, 2013), ya no tiene que hacer 2 comandos para empujar las ramas, y luego empujar tags:

La nueva opción "--follow-tags" cuenta "git push" a empuje etiquetas anotadas relevante cuando empujando ramas fuera.

Ahora puede intentar, al empujar nuevas confirmaciones:

git push --follow-tags 

Eso no empujará todas las etiquetas locales, sin embargo, sólo los anotados los referenciados por compromete que son empujadas con el git push.


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

La nueva opción "--follow-tags" cuenta "git push" para empujar las etiquetas con anotaciones que faltan en el otro lado y que pueden ser alcanzados por la historia que de otro modo se expulsa.

Por ejemplo, si está utilizando el "simple", "current", o "upstream" empuje, que ordinariamente empujar la historia que lleva al comprometerse a su actual nada HEAD y demás.
Con esta opción, también podría empujar todas las etiquetas anotadas que se pueden alcanzar desde esa confirmación al otro lado.


El config push.followTag permite incluir --follow-tags por defecto (Git 2.4.1+, Q2 2015).
Ver "Push git commits & tags simultaneously"

+2

Esto solo empuja a todas las etiquetas * anotadas *. La mayoría de las personas/proyectos utilizan etiquetas * lightweight *. Entonces, en la mayoría de los casos, 'git push --follow-tags' no empuja más que' git push' – Jarl

+3

@Jarl sí, he mencionado "anotado" en mi respuesta. Pero en realidad solo he usado etiquetas con anotaciones, reservé etiquetas livianas para uso puramente interno (es decir, nunca pretendí que las presionasen de todos modos). – VonC

+0

@VonC: Ahora también hay una opción de configuración que hace que este sea el predeterminado, como lo anotó aquí: http://stackoverflow.com/a/3745250/946850 – krlmlr

Cuestiones relacionadas