tener - ¿Cómo saber a qué cometa una etiqueta apunta en Git?
¿qué hace git log-oneline? (18)
Aunque esto es bastante antiguo, pensé en señalar una característica interesante que acabo de encontrar para listar etiquetas con confirmaciones:
git show <tag> --format="%h" --> 42e646e
Mostrará las ramas que terminan / comienzan en una confirmación, y las etiquetas para confirmaciones.
Tengo un montón de etiquetas sin anotar en el repositorio y quiero averiguar qué compromiso apuntan. ¿Hay un comando que solo enumere las etiquetas y sus SHA de confirmación? Revisar la etiqueta y mirar la CABEZA me parece demasiado laborioso.
Actualizar
Después de revisar las respuestas, me di cuenta de que lo que realmente quería era mirar simplemente el historial que lleva a la etiqueta, para lo cual git log <tagname>
es suficiente.
La respuesta que está marcada como respuesta es útil para obtener una lista de etiquetas y sus confirmaciones, que es lo que pregunté. Con un poco de pirateo, estoy seguro de que es posible transformarlos en un mensaje SHA + Commit.
De Igor Zevaka :
Resumen
Ya que hay alrededor de 4 respuestas casi igualmente aceptables pero diferentes, resumiré todas las formas diferentes de colocar una etiqueta.
git rev-list -1 $TAG
( answer ).git rev-list
genera las confirmaciones que llevan al$TAG
similar algit log
pero que solo muestra el SHA1 de la confirmación. El-1
limita la salida a los puntos de confirmación.git show-ref --tags
( answer ) mostrará todas las etiquetas (locales y recuperadas desde el control remoto) y sus SHA1.git show-ref $TAG
( answer ) mostrará la etiqueta y su ruta junto con el SHA1.git rev-parse $TAG
( answer ) mostrará el SHA1 de una etiqueta sin anotar.git rev-parse --verify $TAG^{commit}
( answer ) mostrará un SHA1 de etiquetas anotadas y no anotadas. En Windows usegit rev-parse --verify %TAG%^^^^{commit}
(cuatro sombreros).cat .git/refs/tags/*
ocat .git/packed-refs
( answer ) dependiendo de si la etiqueta es local o no desde el remoto.
Desde la lista de correo de git , esta es la forma de obtener la lista de hashes de confirmación para etiquetas con eliminación automática de referencias para etiquetas anotadas:
git for-each-ref --format=''%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)'' refs/tags
En mi repositorio, git show-ref TAG
muestra el hash de la etiqueta, no el hash de la confirmación a la que apunta.
git show-ref --dereference TAG
muestra, además, el compromiso al que se apunta.
Esto no muestra los nombres de los archivos, pero al menos tienes una idea del repositorio.
cat .git/refs/tags/*
Cada archivo en ese directorio contiene un SHA de confirmación que apunta a un compromiso.
Esto te dará el hash SHA1 actual
Abreviado Commit Hash
git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Cometer hash
git log --decorate=full
Para obtener el sha / hash de la confirmación a la que se refiere una etiqueta (no el sha de la etiqueta):
git rev-list -1 <tag>
Por lo tanto, tengo una carga de carpetas de versiones, donde esas carpetas pueden desprotegerse de uno de los pocos repositorios diferentes, y pueden ser dev, qa o ramas maestras o pueden ser versiones de producción, desprotegerse de una etiqueta, y la etiqueta puede ser anotado o no. Tengo una secuencia de comandos que buscará en la carpeta de destino y obtendrá una respuesta en el formulario. El problema es que las diferentes versiones de git devuelven un estado diferente para una comprobación de etiqueta.
Así que encontré que git show-ref --tags
funcionó inicialmente, a excepción de las etiquetas anotadas. Sin embargo, al agregar -d se agregó una entrada separada a la lista de etiquetas, una para la etiqueta, la otra para la anotación (la confirmación de la anotación se identificó como ^ {} que eliminé con sed).
Así que este es el núcleo de mi script, para cualquiera que lo quiera:
REPO=`git --git-dir=${TARGET} remote show origin -n | /
grep "Fetch URL:" | /
sed -E "s/^.*//(.*)$//1/" | /
sed "s/.git$//"`
TAG=`git --git-dir=${TARGET} show-ref -d --tags | /
grep /`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD/` | /
cut -d/ -f2 | /
cut -d/ -f3 | /
sed "s//^{}$//"`
if [ "${TAG}" == "" ] ; then
BRANCH=`git --git-dir=${TARGET} show-ref --heads | /
grep /`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD/` | /
cut -d/ -f2 | /
cut -d/ -f3`
TAG=${BRANCH}
fi
Qué tal esto:
git log -1 $TAGNAME
O
git log -1 origin/$TAGNAME
Se puede usar a continuación, le dará el hash de confirmación.
git show -s --format=%H <tag>^{commit}
Si se requiere hash de confirmación abreviado, git show -s --format=%h <tag>^{commit}
Si desea ver los detalles de la etiqueta SOMETAG (etiquetador, fecha, etc.), el hash de la confirmación señala y un poco de información sobre la confirmación, pero sin la diferencia completa, intente
git show --name-status SOMETAG
Ejemplo de salida:
tag SOMETAG
Tagger: ....
Date: Thu Jan 26 17:40:53 2017 +0100
.... tag message .......
commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date: Thu Jan 26 17:38:35 2017 +0100
.... commit message .......
..... list of changed files with their change-status (like git log --name-status) .....
Solo usa git show <tag>
Sin embargo, también se vuelca commit diffs. Para omitir esas diferencias, use git log -1 <tag>
. (¡Gracias a @DolphinDream y @demisx!)
También me gustaría saber cómo hacerlo, pero siempre puedes echar un vistazo a:
$ cat .git/packed-refs
o:
$ cat .git/refs/tags/*
También me gustaría saber la forma "correcta", pero mientras tanto, puedes hacer esto:
git show mytag | head -1
También podría obtener una imagen más fácil de interpretar de dónde las etiquetas apuntan a usar
git log --graph |git name-rev --stdin --tags |less
y luego desplácese hasta la etiqueta que está buscando a través de /
.
Una vista más compacta ( --pretty=oneline
) más todas las cabezas ( -a
) también podrían ayudar:
git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Parece un poco aterrador, pero también podría tener un alias en ~/.gitconfig
si es necesario.
~/.gitconfig
[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Una forma de hacerlo sería con git rev-list
. Lo siguiente dará salida a la confirmación a la que apunta una etiqueta:
$ git rev-list -n 1 $TAG
Podría agregarlo como un alias en ~/.gitconfig
si lo usa mucho:
[alias]
tagcommit = rev-list -n 1
Y luego llámalo con:
$ git tagcommit $TAG
Utilizar
git rev-parse --verify <tag>^{commit}
(lo que devolvería SHA-1 de una confirmación incluso para la etiqueta anotada).
git show-ref <tag>
también funcionaría si <tag>
no está anotado. Y siempre hay git for-each-ref
(ver documentación para más detalles).
git show-ref --tags
Por ejemplo, git show-ref --abbrev=7 --tags
le mostrará algo como lo siguiente:
f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2