Como encontrar a tag associada a um determinado git commit?

90

Para lançamentos, normalmente uso algo como v1.1.0. Durante meu script de construção, estou criando um arquivo fwVersion.c que contém as informações atuais do git. Atualmente, tenho commit e informações de branch no arquivo, mas gostaria de adicionar a tag.

Isso é possível?

wes
fonte

Respostas:

114

Verifique a documentação para git describe . Ele encontra a tag mais próxima de um determinado commit (que é uma tag que aponta para um ancestral do commit) e descreve esse commit em termos da tag.

Se você deseja apenas saber se o commit é apontado por uma tag, você pode verificar a saída de:

git describe --exact-match <commit-id>
CB Bailey
fonte
32
git describe --tags <commit-id>para tags não anotadas
Aleksandr Levchuk
1
Eu amo isto. Especificamente, adoro poder obter uma leitura humana da revisão atual:git describe --all --exact-match `git rev-parse HEAD`
dsummersl
5
Em versões mais recentes, git describe --tags --abbrev=0 REVserá útil quando você não quiser o lixo na etiqueta.
Craig Ringer
1
git describe --all(para o commit atualmente verificado) ou git describe --all <commit>sempre fiz tudo o que sempre quis.
quinta
A melhor parte de usar versões do git é não codificar mais a versão no código-fonte quando um software é implantado. A maneira do git describe de encontrar a tag mais próxima pode ser usada para calcular o próximo número da versão e apenas adicionar uma tag ref ao repo e ao nome do pacote.
Sid
62

Se o que você quer é a primeira tag contendo o commit, então:

git describe --contains <commit>

dá a melhor resposta IMO. Se você tiver tags frequentes, o uso de "git tag --contains" em um commit antigo em um grande repositório pode demorar um pouco para ser executado e fornece todas as tags que contêm esse commit.

Esta forma de git describe é executada muito rapidamente e dá a você um único valor de saída que é a primeira tag contendo o commit e o quão longe ele está.

Jay
fonte
27

Que tal agora?

git tag --points-at <commit-id>

Ele dá a você todas as tags que o commit fornecido tem (enquanto git describefornece apenas uma), e não inclui tags nos commits descendentes (como git tag --containsfaz).

Albertas Agejevas
fonte
Eu gosto disso porque nenhuma mensagem de erro é gravada em stderr. Obrigado.
Basuke
23

Você pode encontrar esta informação no manual

git tag --contains <commit>
dharga
fonte
3
Isso irá listar todas as tags que contêm o determinado commit (ou seja, tags que apontam para os filhos de determinado commit), então não necessariamente vai dar uma única tag para um determinado commit ou qualquer informação sobre qual tag é mais próxima, a menos que o lista contém apenas um único commit.
CB Bailey
4
Como Charles Bailey disse acima, não é exatamente isso que estou procurando. Talvez você deve RTFM :)
wes
1
Bem, desculpe pela resposta errada. Quando verifiquei, parecia fazer o que você estava pedindo. Eu fiz RTFM, só estava resolvendo o problema errado. Hope Bailey ofereceu uma solução que ajuda você.
dharga
6
você não precisa ler todo o manual do git antes de fazer uma pergunta sobre o git SO, certo? índices do google TÃO muito melhores do que qualquer página de manual do git ...
aaronstacy
13

Eu encontrei a combinação das duas principais respostas para me dar o que eu queria, então:

git describe --tags --exact-match <commit-id>

Isso dá a você a tag que é APENAS para aquele commit e para aqueles sem anotação. Útil quando você deseja encontrar tags e não se preocupar em remover a formatação (para Jenkins, por exemplo).

por exemplo. $ git describe --tags --exact-match head~2

Da-te:

$ ReleaseBeta
Christopher Alexander
fonte
0

Consolidando algumas das respostas:

git tag --contains [<ref>]

e

git tag --points-at [<ref>]

ou apenas

git tag

comporte-se da mesma forma, imprimindo qualquer (e todas) tags para o ref especificado ou o commit atual se não for especificado.

git describe --tags [<ref>]

onde o <ref>padrão é o commit atual, sai com 128 se nenhuma tag estiver associada ao commit e imprime uma tag associada ao commit (não parece haver um padrão).

git describe [<ref>] se comporta da mesma forma que com, --tagsexceto que só imprime tags anotadas.

Fornecer a opção --containsde describeimprimirá a tag que está associada a um ancestral do commit especificado. Por exemplo

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

bschlueter
fonte