2011-03-31 20 views
22

Si hay etiquetas en el repositorio remoto, generalmente las obtengo automáticamente al tirar. Cuando elimino la etiqueta local creada (git tag -d <tag-name>) y la extraigo, la etiqueta eliminada se volverá a crear. Puedo eliminar ramas/etiquetas remotas (git push <remote-branch/tag-name>:<branch/tag-name>), pero ¿cómo puedo detectar que la etiqueta local fue creada obteniendo una etiqueta remota?Git: distinguir entre etiquetas locales y remotas

+2

Si te encuentras en un lugar amigable, las etiquetas se anotarán, y las que hayas obtenido de otra parte generalmente tendrán autores que no eres tú. – Cascabel

Respuesta

27

Si está molesto por la recreación de estas etiquetas cuando ejecuta git pull, desactive la búsqueda de etiquetas de forma predeterminada con la configuración de configuración remote.<remote-name>.tagopt. p.ej. Si la distancia es origin, entonces usted puede hacer:

git config remote.origin.tagopt --no-tags 

Actualización: hacer frente a su comentario, la razón por la que sugiero esto es que no hay una forma obvia de decir la diferencia entre una etiqueta que se creó localmente y uno que fue obtenido desde un control remoto. Tampoco hay reflog para las etiquetas. Por lo tanto, mi sugerencia es suprimir la búsqueda automática de etiquetas; luego puede buscarlas en un espacio de nombres diferente. Por ejemplo, puede hacer:

git fetch origin +refs/tags/*:refs/tags/origin/* 

... y quizás cree un alias para eso. Luego, cuando desee buscar etiquetas, recibirán un nombre, por ejemplo, refs/tags/origin/tag1 en lugar de refs/tags/tag1.


Si desea que esto ocurra de forma automática, puede cambiar su .git/config a enumerar varios refspecs para ir a buscar, por ejemplo .:

[remote "origin"] 
     url = [email protected]:whatever.git 
     fetch = +refs/heads/*:refs/remotes/origin/* 
     fetch = +refs/tags/*:refs/tags/origin/* 

... que es suggested in Pro Git.

+0

No quiero desactivar la búsqueda de etiquetas, quiero detectar si una etiqueta disponible localmente fue creada por búsqueda o manualmente. – Mot

+1

@mklhmnn: mi idea fue que puede suprimir la búsqueda automática de etiquetas y luego, cuando desee las etiquetas remotas, buscarlas en un espacio de nombres diferente. He actualizado mi respuesta con un ejemplo. –

+1

@Mark: encuentro el enfoque mucho más directo que el mío, separando las etiquetas por espacio de nombres en fetch. Quisiera +1, pero ya lo hice antes de su edición;) – VonC

10

una etiqueta no es "local" o "remota": está asociada a una confirmación, que puede formar parte de varias ramas, incluidas las que se encuentran en el espacio de nombres de los controles remotos.

Get etiqueta SHA1 del commit referenciado por una etiqueta

git show -s 'TAG_NAME^{commit}' --format='%H' 

, y hacer un:

git branch -a --contains SHA1 

Si ve

remotes/aRemoteRepoName/aBranch 

sabe que la etiqueta hace referencia a un compromiso has buscado desde un repositorio remoto.

Como Chris menciones:

git branch -a --contains TAGNAME 

voluntad eliminar la referencia de la etiqueta y da la respuesta de una sola vez.

+2

¿Por qué no todo en un solo comando: 'git branch -a --contiene 'TAG_NAME^{commit}'? –

+1

Pensando en ello un poco más, '--contains' desreferenciará automáticamente el objeto nombrado, por lo que no es necesario especificar manualmente la desreferenciación. Simplemente 'git branch -a --contiene TAG_NAME' funciona como se esperaba. –

+1

@Chris: buen punto, lo he incluido en la respuesta. – VonC

Cuestiones relacionadas