Lista de tags Git, exibir hashes sha1 de confirmação

101

então o git tagcomando lista as tags git atuais

tag1
tag2

git tag -n imprime a mensagem da tag

tag1  blah blah
tag2  blah blah

Qual é a melhor maneira de obter o hash de tag1 e tag2?

Quang Van
fonte
1
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:

git show-ref --tags

A saída será semelhante a:

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 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:

git show-ref --tags -d

Isso produzirá resultados 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^{}

As linhas que terminam com ^{}começam com o hash SHA1 do commit real para o qual a tag aponta.

Peterjmag
fonte
7
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:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Nota: Tive que usar o redirecionamento bash git tporque 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:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

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 .

ADTC
fonte
2
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:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Resultado com tags leves:

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 com tags 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^{}
Steven Penny
fonte
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!

Cascabel
fonte
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:

% 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

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.

Veja também o bom resumo em Como saber para qual commit uma tag aponta no Git? .

Ted
fonte
3

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.

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

Isso dá uma lista de todos os commits para tags. As tags anotadas são desreferenciadas. Envie agradecimentos aqui .

anatoly techtonik
fonte
Ótima solução. Se desejar ter Apenas tagenames em vez de refname completo, você pode alterar o uso em %(refname:short)vez de %(refname).
Radon8472
2

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 -nmas com commit-hash como prefixo.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Se você preferir o hash longo em vez do curto, substitua objectname:shortpor objectname.

Radon8472
fonte