git - ¿Cómo puedo enumerar todas las etiquetas ligeras?
git-tag (1)
Todas las etiquetas ligeras están en los refs/tags/
namespace y se pueden enumerar con, por ejemplo:
git for-each-ref --format ''%(refname:short)'' refs/tags/
o:
git show-ref --tags
En cuanto a las etiquetas anotadas, bueno, el truco aquí, que también afecta a la parte de las etiquetas "ligeras", es que una etiqueta anotada es en realidad un objeto en el repositorio de git, pero hay una etiqueta liviana que apunta a ese objeto, que te permite llegar a la etiqueta anotada por su nombre de etiqueta. 1 Entonces, en realidad es un par de cosas: una etiqueta liviana, más el objeto anotado anotado en el repositorio, que lo hace "no una etiqueta liviana", ¡excepto por el hecho obstinado de que es una etiqueta liviana al mismo tiempo!
Por lo tanto, se reduce a: buscar todas las etiquetas ligeras, luego, opcionalmente, seleccionar solo las etiquetas que apuntan a las confirmaciones o las etiquetas que apuntan a las etiquetas de objetos en función del comportamiento que desee, y luego continuar para emitir el nombre de la etiqueta.
Hay un largo ejemplo en la documentación de git-for-each-ref
de escribir una secuencia de comandos completa en la cadena --format
y usar eval
para ejecutarla (o puede canalizar a sh
para ejecutarse, al costo de un proceso adicional). Por lo general, me resulta más sencillo canalizar la salida de git for-each-ref
en un while read ...
bucle:
git for-each-ref refs/tags/ --format ''%(objecttype) %(refname:short)'' |
while read ty name; do [ $ty = commit ] && echo $name; done
que imprime todas las etiquetas de peso ligero .
Comparar con:
git for-each-ref refs/tags/ --format ''%(objecttype) %(refname:short)'' |
while read ty name; do [ $ty = tag ] && echo $name; done
que imprime todas las etiquetas anotadas (o más precisamente, las etiquetas "ligeras que son anotadas").
Tenga en cuenta que una etiqueta puede (posiblemente, no hay un caso de uso real para esto en este momento, por lo que yo sé) apuntar a algo más que un compromiso o una etiqueta; depende de usted si hacer algo con una etiqueta que apunte directamente a un tree
o blob
.
1 Sin la etiqueta liviana, no podría referirse a la etiqueta annotag
con el nombre de annotag
no sin pasar por todo el esfuerzo de búsqueda que utiliza git fsck
para encontrar objetos colgantes, al menos. Además, si elimina la etiqueta liviana, el objeto de etiqueta anotada puede ser recolectado por la basura. Puede hacer que un objeto de etiqueta apunte a otro objeto de etiqueta para mantenerlo en el repositorio (es decir, inhibir el gc) sin un nombre externo para el segundo objeto de etiqueta, siempre que el primero tenga un nombre externo. Eso es definitivamente una cosa extraña para hacer sin embargo.
Curiosamente, el formato interno de la etiqueta anotada contiene el nombre externo, por lo que se puede usar esta técnica para proteger las etiquetas anotadas "antiguas", ocultarlas eliminando sus etiquetas ligeras y luego restaurar la etiqueta liviana original. Sin embargo, si alguien puede proponer un uso para esto ... :-)
Quiero enumerar todas las etiquetas ligeras en mi repositorio; lo mejor que puedo pensar es en combinar git for-each-ref
, grep
y cut
, pero parece que será un poco incómodo ...
(Mientras estamos en eso, podríamos hablar de lo mismo para las etiquetas anotadas: alguien seguramente terminará aquí preguntándose sobre eso en algún momento).
Editar:
Por etiquetas lightweight
, me refiero a esas referencias de etiquetas que no se refieren a objetos de etiqueta. (En otras palabras, etiquetas sin anotar).