Não é uma pergunta que considero fazer separadamente, mas me pergunto por que git tag( -nou alguma outra opção ...) não mostra hashes de commit em primeiro lugar. É bom ver quais soluções as pessoas apresentam, mas considero isso uma falha de design nas opções disponíveis.
andreee
Respostas:
142
Para obter tags git com o hash SHA1 do objeto Tag, você pode executar:
Observe que isso não diferencia entre tags leves e anotadas. Para tags leves, ele mostrará o commit e para tags anotadas ele mostrará o hash do próprio objeto tag.
Lily Ballard
20
Para mostrar uma lista de tags com referências não referenciadas (no caso de tags anotadas), use git show-ref --tags -d. Tags não referenciadas são pós-fixadas com um ^{}.
S. Christoffer Eliesen
49
o git tag comando está subdesenvolvido. Muita coisa é desejada, mas está faltando, como detalhes completos da tag e tags na ordem do histórico de commits.
Eu gosto disso, que dá exatamente o que eu quero, mas não consigo obter git tag:
git log --oneline --decorate --tags --no-walk
Isso dá uma boa visão codificada por cores das tags na ordem cronológica reversa (como seria no log completo). Dessa forma, não apenas você verá as tags, mas também os hashes abreviados e as mensagens de commit dos commits de tag.
Eu criei um alias para git te da git tagsseguinte maneira:
Você pode usar outros formatos de data na --dateopção, bem como controlar totalmente a saída para corresponder ao seu gosto exclusivo na --prettyopção. Ambas as opções estão bem documentadas na documentação do git-log .
Embora não seja o que o OP pediu (exiba hashes sha1 de commit ), é muito útil, pois as mensagens de commit também podem ser úteis. +1 de mim.
Stelios Adamantidis de
2
@nealmcb git logé poderoso! Você pode fazer com que mostre exatamente o que você deseja. Experimente git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Outros formatos de data também são possíveis. Basta procurar --datena página de ajuda. Eu atualizei minha resposta para incluir esta opção.
ADTC
1
@SteliosAdamantidis Na verdade, minha resposta fornece os hashes SHA1 abreviados (primeiros 7 caracteres) e, se desejar hashes completos, você sempre pode modificá-los com --prettye %H. Obrigado pelo +1 :)
ADTC
15
As tags anotadas têm seu próprio SHA − 1, portanto, precisamos desreferenciá-las. No entanto, as tags leves não podem ser desreferenciadas, pois já apontam para um commit. Para resolver, devemos listar e filtrar os objetos de commit:
O uso git log --tags --oneline --no-walktambém deferirá as tags anotadas automaticamente. :)
ADTC
11
Para obter o SHA1 referido por qualquer tipo de ref (branch, tag ...) use git rev-parse:
git rev-parse tag1^0 tag2^0
Ele imprimirá apenas os SHA1s completos, em linhas separadas. O ^0sufixo é uma sintaxe especial, para garantir que imprimirá o SHA1 do commit apontado pela tag, seja anotado ou não. (Tags anotadas são objetos em si mesmos, que contêm um ponteiro para um commit junto com metadados. Se você sabe que uma tag está anotada e deseja o SHA1 da tag, simplesmente deixe de fora o^0 .)
Claro, você não deve precisar fazer isso com frequência, já que qualquer comando Git que aceitaria um SHA1 também deveria aceitar uma tag!
Melhor resposta aqui, obrigado @Jefromi. Observe que em um shell cmd do Windows qualquer comando git usando ^ precisa ser citado: por exemplo, git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo
8
Eu tinha uma pergunta semelhante, mas queria o hash de (várias) tags específicas. Descobri que "show-ref" pegará uma lista de tags, então isso faz o trabalho:
No entanto, algumas experiências com "git show" resultaram neste 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 estou muito mais familiarizado com o uso de "show" do que "show-ref", acho este último mais fácil de lembrar e mais útil.
As tags devem ser assinadas e / ou enviadas por mensagem. Tags leves não possuem objetos SHA1 e são apenas referências. Caso contrário, tente git show.
git tag
(-n
ou alguma outra opção ...) não mostra hashes de commit em primeiro lugar. É bom ver quais soluções as pessoas apresentam, mas considero isso uma falha de design nas opções disponíveis.Respostas:
Para obter tags git com o hash SHA1 do objeto Tag, você pode executar:
A saída será semelhante a:
Cada linha é o hash SHA1 da tag, seguido pelo nome da tag prefixado com
refs/tags/
.Se você quiser o hash SHA1 do commit, em vez do objeto tag, você pode executar:
Isso produzirá resultados como:
As linhas que terminam com
^{}
começam com o hash SHA1 do commit real para o qual a tag aponta.fonte
git show-ref --tags -d
. Tags não referenciadas são pós-fixadas com um^{}
.o
git tag
comando está subdesenvolvido. Muita coisa é desejada, mas está faltando, como detalhes completos da tag e tags na ordem do histórico de commits.Eu gosto disso, que dá exatamente o que eu quero, mas não consigo obter
git tag
:Isso dá uma boa visão codificada por cores das tags na ordem cronológica reversa (como seria no log completo). Dessa forma, não apenas você verá as tags, mas também os hashes abreviados e as mensagens de commit dos commits de tag.
Eu criei um alias para
git t
e dagit tags
seguinte maneira:Nota: Tive que usar o redirecionamento bash
git t
porque o Git não suporta chamar um alias de outro alias (o que é uma chatice).Se você quiser ver a data e hora de confirmação, tente:
Você pode usar outros formatos de data na
--date
opção, bem como controlar totalmente a saída para corresponder ao seu gosto exclusivo na--pretty
opção. Ambas as opções estão bem documentadas na documentação do git-log .fonte
git log
é poderoso! Você pode fazer com que mostre exatamente o que você deseja. Experimentegit log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'
. Outros formatos de data também são possíveis. Basta procurar--date
na página de ajuda. Eu atualizei minha resposta para incluir esta opção.--pretty
e%H
. Obrigado pelo +1 :)As tags anotadas têm seu próprio SHA − 1, portanto, precisamos desreferenciá-las. No entanto, as tags leves não podem ser desreferenciadas, pois já apontam para um commit. Para resolver, devemos listar e filtrar os objetos de commit:
Resultado com tags leves:
Resultado com tags anotadas:
fonte
git log --tags --oneline --no-walk
também deferirá as tags anotadas automaticamente. :)Para obter o SHA1 referido por qualquer tipo de ref (branch, tag ...) use
git rev-parse
:Ele imprimirá apenas os SHA1s completos, em linhas separadas. O
^0
sufixo é uma sintaxe especial, para garantir que imprimirá o SHA1 do commit apontado pela tag, seja anotado ou não. (Tags anotadas são objetos em si mesmos, que contêm um ponteiro para um commit junto com metadados. Se você sabe que uma tag está anotada e deseja o SHA1 da tag, simplesmente deixe de fora o^0
.)Claro, você não deve precisar fazer isso com frequência, já que qualquer comando Git que aceitaria um SHA1 também deveria aceitar uma tag!
fonte
Eu tinha uma pergunta semelhante, mas queria o hash de (várias) tags específicas. Descobri que "show-ref" pegará uma lista de tags, então isso faz o trabalho:
No entanto, algumas experiências com "git show" resultaram neste comando:
Como estou muito mais familiarizado com o uso de "show" do que "show-ref", acho este último mais fácil de lembrar e mais útil.
Veja também o bom resumo em Como saber para qual commit uma tag aponta no Git? .
fonte
As tags devem ser assinadas e / ou enviadas por mensagem. Tags leves não possuem objetos SHA1 e são apenas referências. Caso contrário, tente
git show
.fonte
Isso dá uma lista de todos os commits para tags. As tags anotadas são desreferenciadas. Envie agradecimentos aqui .
fonte
%(refname:short)
vez de%(refname)
.Eu peguei o comando de um posto de anatoly techtonik adicionei a mensagem do título das tags / commits e formatei como colunas legais.
O resultado é uma saída idêntica a,
git tag -n
mas com commit-hash como prefixo.Se você preferir o hash longo em vez do curto, substitua
objectname:short
porobjectname
.fonte