Respuestas:
Para obtener etiquetas git con el hash SHA1 del objeto Tag, puede ejecutar:
git show-ref --tags
La salida entonces se verá algo como:
0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
Cada línea es el hash SHA1 de la etiqueta, seguido del nombre de la etiqueta con el prefijo refs/tags/
.
Si desea el hash SHA1 de la confirmación, en lugar del objeto de etiqueta, puede ejecutar:
git show-ref --tags -d
Esto producirá una salida como:
0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}
Las líneas que terminan con ^{}
comienzan con el hash SHA1 del compromiso real al que apunta la etiqueta.
git show-ref --tags -d
. Las etiquetas desreferenciadas se adjuntan con un ^{}
.
El git tag
comando está subdesarrollado. Se desea mucho, pero falta en él, como detalles completos de la etiqueta y etiquetas en el orden del historial de confirmación.
En cambio, me gusta esto, que da exactamente lo que quiero pero no puedo obtener de git tag
:
git log --oneline --decorate --tags --no-walk
Esto proporciona una vista codificada por colores muy agradable de las etiquetas en orden cronológico inverso (como estaría en el registro completo). De esa manera, no solo verá las etiquetas, también verá los hashes abreviados y los mensajes de confirmación de la etiqueta.
Lo he puesto como alias git t
y de la git tags
siguiente manera:
git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"
Nota: Tuve que usar la redirección bash porque git t
Git no admite llamar a un alias desde otro alias (lo cual es un fastidio).
Si desea ver la fecha y hora de confirmación, intente:
git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'
Puede usar otros formatos de fecha en la --date
opción, así como controlar completamente la salida para que coincida con su gusto único en la --pretty
opción. Ambas opciones están bien documentadas en la documentación de git-log .
git log
es poderoso! Puedes hacer que muestre exactamente lo que quieres. Prueba git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'
. También son posibles otros formatos de fecha. Simplemente busque --date
en la página de ayuda. He actualizado mi respuesta para incluir esta opción.
--pretty
y %H
. Gracias por el +1 :)
Las etiquetas anotadas tienen su propio SHA − 1, por lo que debemos eliminar la referencia. Sin embargo, las etiquetas ligeras no pueden desreferenciarse, ya que apuntan a una confirmación. Para resolverlo, debemos listar ambos y filtrar los objetos de confirmación:
git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit
Resultado con etiquetas ligeras:
589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5
Resultado con etiquetas anotadas:
e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}
git log --tags --oneline --no-walk
también hará referencia a las etiquetas anotadas automáticamente. :)
Para hacer referencia al SHA1 por cualquier tipo de referencia (rama, etiqueta ...) use git rev-parse
:
git rev-parse tag1^0 tag2^0
Imprimirá solo los SHA1 completos, en líneas separadas. El ^0
sufijo es una sintaxis especial, para asegurar que imprimirá el SHA1 de la confirmación apuntada por la etiqueta, ya sea que esté anotada o no. (Las etiquetas anotadas son objetos por derecho propio, que contienen un puntero a una confirmación junto con los metadatos. Si sabe que una etiqueta está anotada y desea el SHA1 de la etiqueta, simplemente deje fuera ^0
).
Por supuesto, no debería necesitar hacer esto a menudo, ya que cualquier comando de Git que acepte un SHA1 también debería aceptar una etiqueta.
Tenía una pregunta similar, pero quería el hash de (varias) etiquetas específicas. Descubrí que "show-ref" tomará una lista de etiquetas, así que esto hace el trabajo:
% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga
Sin embargo, algunos experimentos con "git show" dieron como resultado este comando:
% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second
Como estoy mucho más familiarizado con el uso de "show" que con "show-ref", encuentro que este último es más fácil de recordar y también más útil.
Vea también el buen resumen en ¿Cómo saber a qué confirmación apunta una etiqueta en Git? .
Las etiquetas deben estar firmadas y / o enviadas por mensaje. Las etiquetas ligeras no tienen objetos SHA1 y son solo referencias. De lo contrario, intente git show
.
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
Esto da una lista de todas las confirmaciones para etiquetas. Las etiquetas anotadas están desreferenciadas. Envíe gracias aquí .
%(refname:short)
lugar de %(refname)
.
Tomé el comando de la publicación de anatoly techtonik, agregué el mensaje del título de las etiquetas / confirmaciones y lo formateé como bonitos cols.
El resultado es una salida idéntica git tag -n
pero con commit-hash como prefijo.
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'
Si desea tener el hash largo en lugar del corto, debe reemplazarlo objectname:short
por objectname
.
git tag
(-n
o alguna otra opción ...) no muestra los hashes de confirmación en primer lugar. Es agradable ver las soluciones que se le ocurren a la gente, pero considero que esto es un defecto de diseño en las opciones disponibles.