Como saber para qual commit uma tag aponta no Git?

Eu tenho um monte de tags não anotadas no repository e quero descobrir com quais commit elas apontam. Existe um comando que apenas lista as tags e seus commits SHAs? Verificar a etiqueta e olhar para a cabeça parece um pouco trabalhoso para mim.

Atualizar

Eu percebi depois que eu passei pelas respostas que o que eu realmente queria era simplesmente olhar para o histórico que levava à tag, para o qual o git log é suficiente.

A resposta marcada como resposta é útil para obter uma lista de tags e seus commits, que é o que eu perguntei. Com um pouco de hacker de shell, tenho certeza que é possível transformá-los em SHA + Commit message.

Uma maneira de fazer isso seria com git rev-list . O seguinte mostrará o commit para o qual uma tag aponta:

 $ git rev-list -n 1 $TAG 

Você pode adicioná-lo como um alias em ~/.gitconfig se você usá-lo muito:

 [alias] tagcommit = rev-list -n 1 

E então chame com:

 $ git tagcommit $TAG 
 git show-ref --tags 

Por exemplo, git show-ref --abbrev=7 --tags mostrará algo como o seguinte:

 f727215 refs/tags/v2.16.0 56072ac refs/tags/v2.17.0 b670805 refs/tags/v2.17.1 250ed01 refs/tags/v2.17.2 

Basta usar o git show

No entanto, também despeja diferenças de confirmação. Para omitir esses diffs, use git log -1 . (Obrigado a @DolphinDream e @demisx!)

Usar

 git rev-parse --verify ^{commit} 

(que retornaria SHA-1 de um commit mesmo para tag anotada).


git show-ref também funcionaria se não fosse anotado. E há sempre git for-each-ref (veja a documentação para detalhes).

No meu repository, git show-ref TAG mostra o hash da tag, não o hash do commit para o qual ele aponta.

git show-ref --dereference TAG mostra, adicionalmente, o commit sendo apontado.

De Igor Zevaka :

Resumo

Como existem cerca de quatro respostas quase igualmente aceitáveis, porém diferentes, vou resumir todas as diferentes maneiras de eliminar uma tag.

  1. git rev-list -1 $TAG ( resposta ). git rev-list mostra os commits que levam até o $TAG similar ao git log mas mostrando apenas o SHA1 do commit. O -1 limita a saída para o commit em que aponta.

  2. git show-ref --tags ( answer ) mostrará todas as tags (locais e buscadas pelo remoto) e seus SHA1s.

  3. git show-ref $TAG ( resposta ) mostrará a tag e seu caminho junto com o SHA1.

  4. git rev-parse $TAG ( resposta ) mostrará o SHA1 de uma tag não anotada.

  5. git rev-parse --verify $TAG^{commit} ( resposta ) mostrará um SHA1 de tags anotadas e não anotadas. No Windows, use git rev-parse --verify %TAG%^^^^{commit} (quatro chapéus).

  6. cat .git/refs/tags/* ou cat .git/packed-refs ( answer ), dependendo de a tag ser ou não local ou remota.

Que tal agora:

 git log -1 $TAGNAME 

OU

 git log -1 origin/$TAGNAME 

Para obter o sha / hash do commit ao qual uma tag se refere (não o sha da tag):

git rev-list -1

Eu também gostaria de saber o caminho “certo”, mas enquanto isso, você pode fazer isso:

 git show mytag | head -1 

Você também pode obter uma imagem mais fácil de interpretar de onde as tags apontam para o uso

 git log --graph |git name-rev --stdin --tags |less 

e, em seguida, role até a tag que você está procurando por / .

Visão mais compacta ( --pretty=oneline ) mais todas as cabeças ( -a ) também poderiam ajudar:

 git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less 

Parece um pouco aterrorizante, mas também pode ser alias em ~/.gitconfig se necessário.

 ~/.gitconfig [alias] ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less 

Isso vai te dar o atual hash SHA1

Hash de Confirmação Abreviado

 git show  --format="%h" --> 42e646e 

Commit Hash

 git show  --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280 

Mesmo que isso seja muito antigo, pensei em apontar um recurso interessante que acabei de encontrar para listar tags com commits:

 git log --decorate=full 

Ele mostrará as ramificações que end / start em um commit e as tags para commits.

Eu também gostaria de saber o caminho certo , mas você pode sempre espreitar para:

 $ cat .git/packed-refs 

ou:

 $ cat .git/refs/tags/* 

Se você gostaria de ver os detalhes da tag SOMETAG (tagger, date, etc), o hash do commit que ele aponta e um pouco de informação sobre o commit mas sem o diff completo, tente

 git show --name-status SOMETAG 

Exemplo de saída:

 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) ..... 

Isso não mostra os nomes dos arquivos, mas pelo menos você tem uma idéia do repository.

 cat .git/refs/tags/* 

Cada arquivo nesse diretório contém um SHA de confirmação apontando para uma confirmação.

De git mailing list , aqui está a maneira de obter a lista de hashes de commit para tags com desreferenciamento automático para tags anotadas:

 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags 

Então eu tenho uma carga de pastas de lançamento, onde essas pastas podem ser retiradas de um dos repos diferentes, e podem ser dev, qa ou ramificações mestras ou podem ser versões de produção, retiradas de uma tag, e a tag pode ser anotado ou não. Eu tenho um script que vai olhar para a pasta de destino e receber de volta uma resposta no formulário -. O problema é que versões diferentes do git retornam status diferente ‘para uma verificação de tag.

Então eu encontrei git show-ref --tags trabalhado inicialmente, exceto pelas tags anotadas. No entanto, adicionando -d adicionou uma input separada à lista de tags, uma para a tag, outra para a anotação (a confirmação de anotação foi identificada como ^ {}, que eu tirei com sed).

Então este é o núcleo do meu roteiro, para qualquer um que queira:

 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