Como saber para qual commit uma tag aponta no Git?

411

Eu tenho um monte de tags não anotadas no repositório e quero descobrir para qual commit elas apontam. Existe um comando que apenas listará as tags e seus SHAs de confirmação? Verificando a etiqueta e olhando para a cabeça parece um pouco trabalhoso para mim.

Atualizar

Percebi, depois de analisar as respostas, que o que realmente queria era simplesmente olhar para o histórico que antecedeu a marca, o que git log <tagname>é suficiente.

A resposta marcada como resposta é útil para obter uma lista de tags e seus commits, que foi o que perguntei. Com um pouco de hackery de shell, tenho certeza de que é possível transformá-los em mensagem de confirmação do SHA +.

Igor Zevaka
fonte
3
Quero salientar que git show-refmostra sha da tag, não sha da revisão do repo. $ Git teste show-ref 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / teste $ git teste de checkout cabeça está agora em c7f8831 ... $ git checkout 08b9c77 cabeça está agora em c7f8831 ...
Konstantin Pelepelin
se suas tags são anotadas, então você precisa #--dereference
Trevor Boyd Smith

Respostas:

348

Uma maneira de fazer isso seria com git rev-list. A seguir, será exibida a confirmação para a qual uma tag aponta:

$ git rev-list -n 1 $TAG

Você pode adicioná-lo como um alias ~/.gitconfigse você o usa muito:

[alias]
  tagcommit = rev-list -n 1

E depois chame-o com:

$ git tagcommit $TAG
mipadi
fonte
30
Por que não usar git rev-parse <tag>? Ou git rev-list -1 <tag>?
Jakub Narębski
52
@ Jakub: git rev-parse $TAGretorna o SHA1 do objeto tag, não o commit ao qual ele aponta. git rev-list -1funciona, no entanto.
Mipadi 08/12/09
11
@ mipadi: Para tags não anotadas, isso não importava; para tags anotados você pode usar git rev-parse $TAG^{commit}ou git rev-parse $TAG^{}excluir a referência anotada / tag assinado
Jakub Narębski
5
Você pode usar:git rev-list $TAG --max-count=1
b73
4
@RobinHsu: se você tiver tags anotadas , criadas com git tag -aor git tag -s, git rev-parse <tag>você fornecerá o SHA-1 de um objeto de tag em si, enquanto git rev-list -1 <tag>fornecerá o SHA-1 de confirmação (revisão) para o qual aponta, o mesmo que git rev-parse <tag>^{commit}. HTH.
Jakub Narębski 23/11
240
git show-ref --tags

Por exemplo, git show-ref --abbrev=7 --tagsmostrará 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
CB Bailey
fonte
Obrigado por isso, este na verdade esconde a semântica de olhar para nenhum .git/packed-refsou.git/refs/tags/*
Igor Zevaka
3
hmmm. ele tem um comportamento estranho no meu repositório: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; veja a resposta de Jakub Narebski
NickSoft
6
isso funciona, embora eu me perguntei, não faria sentido git tag --verbosemostrá-los também?
nonopolarity
34
Isso mostrará o ref da própria tag, não o commit que a tag aponta. Você precisa adicionar o -dsinalizador para obter a confirmação referenciada (em uma segunda linha).
Old Pro
4
@CharlesBailey, é justo, mas a pergunta e as respostas se transformaram para incluir tags anotadas e o fato de git show-refse comportar de maneira diferente nos dois tipos diferentes de tags não é um conhecimento óbvio ou comum.
Old Pro
104

Apenas use git show <tag>

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

Hlung
fonte
7
No SO, quando uma pergunta tem muitas respostas possíveis diferentes, as respostas que são postadas primeiro são votadas primeiro - colocando-as no topo da lista e, assim, obtendo-as mais votadas posteriormente. Esse é um loop de feedback tendencioso com base na velocidade da resposta e na qualidade da resposta. Com imaginação suficiente, esse problema poderia ser resolvido.
precisa
6
"Melhor solução" para quê? Se o interesse é descobrir o SHA de um commit, a tag aponta para o "git show <mytag>" NÃO é a melhor solução. Este comando mostrará todo o diff que o commit introduz. Para listar apenas o SHA da confirmação, a tag aponta para "git rev-list <mytag> -n 1" é a solução correta.
DolphinDream
Esta não é a resposta para a pergunta do OP. git show <tag>mostra o diff, não o commit para o qual a tag aponta.
demisx
@demisx Do que você está falando? Definitivamente, mostra o hash de confirmação, juntamente com o tagger, a data e outras informações. Tente.
precisa saber é o seguinte
4
@Hlung Como o @DolphinDream apontou, git showdespeja muito mais coisas na tela que não precisam estar lá. Ele obscurece o hash de confirmação real que você está procurando. Um comando melhor é git log -1 [tag-name]ou git log -1 --pretty=oneline [tag-name]se você deseja oneliners.
demisx
40

No meu repositório, git show-ref TAGmostra o hash da tag, não o hash do commit para o qual aponta.

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

orip
fonte
34

De Igor Zevaka :

Sumário

Como existem cerca de 4 respostas quase igualmente aceitáveis ​​e diferentes, irei resumir todas as maneiras diferentes de identificar uma etiqueta.

  1. git rev-list -1 $TAG( resposta ) git rev-listproduz as confirmações que levam à $TAGsemelhante, git logmas apenas mostrando o SHA1 da confirmação. A -1limita a saída para a cometê-lo aponta.

  2. git show-ref --tags( resposta ) mostrará todas as tags (locais e buscadas no controle 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( resposta ), dependendo de a etiqueta ser local ou buscada remotamente.

user456814
fonte
33

Usar

git rev-parse --verify <tag>^{commit}

(que retornaria o SHA-1 de uma confirmação mesmo para a tag anotada).


git show-ref <tag>também funcionaria se <tag>não estiver anotado. E sempre existe git for-each-ref(consulte a documentação para obter detalhes).

Jakub Narębski
fonte
11
Prefiro o git rev-parse <tag>~0que também parece funcionar e não requer escape especial no Windows (no qual são necessários quatro chapéus (^) em vez de um). O sufixo ~<number>fornece o <número> a confirmação do pai, portanto, ~0gera a confirmação. Btw, ^0também é uma abreviação válida para o ^{commit}sufixo de revisão.
Attila
15

Que tal agora:

git log -1 $TAGNAME

OU

git log -1 origin/$TAGNAME
Tuong Le
fonte
10

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

git rev-list -1 <tag>

Daniel Little
fonte
8

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

git show mytag | head -1    
gahooa
fonte
Com título de confirmaçãogit show --oneline mytag | head -1
Stphane
7

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

git log --decorate=full

Ele mostrará os ramos que terminam / iniciam em uma confirmação e as tags para confirmações.

Terrence Reilly
fonte
4

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 depois vá até a tag que você está procurando /.

Uma visão mais compacta ( --pretty=oneline) e todas as cabeças ( -a) também podem ajudar:

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

Parece um pouco assustador, mas também pode ser alternativo, ~/.gitconfigse necessário.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Antony Hatchkins
fonte
4

Resposta curta pós-Git-2

Eu sei que essa pergunta está aqui há um bom tempo. E a resposta do CB Bailey é 100% correta:git show-ref --tags --abbrev

Eu gosto mais deste, pois usa git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Simples. Baixo.

PS alias isso como git taglistcom este comando:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
Jesper Rønn-Jensen
fonte
3

Na lista de discussão git , eis a maneira de obter a lista de hashes de confirmação para tags com desreferenciação automática para tags anotadas:

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

Isso não mostra os nomes dos arquivos, mas pelo menos você percebe o repositório.

cat .git/refs/tags/*

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

Peter Stuifzand
fonte
Acho que isso não funcionou, pois retirei as tags do controle remoto. .git/packed-refsfuncionou embora.
Igor Zevaka 7/12/2009
2

eu também gostaria de saber o caminho certo , mas você sempre pode espiar:

$ cat .git/packed-refs 

ou:

$ cat .git/refs/tags/*
miku
fonte
Certo, portanto, o comportamento de empacotamento-refs e refs / tags é um pouco diferente, empacotado-refs é um arquivo de texto contendo tags e SHAs, enquanto refs / tags / é um diretório com arquivos de texto nomeados após uma tag que contém o SHA. Na verdade, acho que é a maneira correta de fazer isso git rev-list.
Igor Zevaka 7/12/2009
2

Isso fornecerá o hash SHA1 atual

Hash de confirmação abreviado

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

Confirmar hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Louis
fonte
1
parece não funcionar na versão que tenho, mas git log <tag> -n 1 --pretty=%Hfunciona #
Andy
2

Se você deseja ver os detalhes da tag SOMETAG (tagger, date, etc), o hash do commit para o qual ele aponta e um pouco de informações 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) .....
Avy Sharell
fonte
0

Portanto, eu tenho um monte de pastas de lançamento, nas quais essas pastas podem ser retiradas de um de alguns repositórios diferentes e podem ser dev, qa ou ramificações principais ou podem ser liberações de produção, retiradas de uma tag, e a tag pode ser anotado ou não. Eu tenho um script que irá olhar para a pasta de destino e voltar uma resposta no formulário -. O problema é que versões diferentes do git retornam status diferente 'para uma verificação de tags.

Por isso, achei que git show-ref --tagsfuncionou inicialmente, exceto pelas tags anotadas. No entanto, a adição de -d adicionou uma entrada separada à lista de tags, uma para a tag e a outra para a anotação (o commit da anotação foi identificado como ^ {}, que eu retirei com o sed).

Portanto, este é o núcleo do meu script, para quem quiser: -

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
sibaz
fonte
0

Pode usar abaixo, ele dará o hash de confirmação
git show -s --format=%H <tag>^{commit}

Se o hash de confirmação abreviado for necessário, git show -s --format=%h <tag>^{commit}

Reddysekhar Gaduputi
fonte