remove - git tag sort



Como saber para qual commit uma tag aponta no Git? (12)

Eu tenho um monte de tags não anotadas no repositório e quero descobrir com quais commit elas apontam. Existe um comando que apenas lista as tags e seus commits SHAs? Verificar a tag 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 <tagname> é 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 hackery de shell, tenho certeza que é possível transformá-los em SHA + Commit message.

https://code.i-harness.com


Basta usar o git show <tag>

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


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

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


Então eu tenho um monte 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 achei o git show-ref --tags trabalhado inicialmente, exceto pelas tags anotadas. No entanto, adicionando -d adicionou uma entrada separada para a lista de tags, um para a tag, o outro para a anotação (o commit de anotação foi identificado 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

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

git show mytag | head -1    

Isso não mostra os nomes dos arquivos, mas pelo menos você tem uma noção do repositório.

cat .git/refs/tags/*

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


No meu repositório, 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.


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

git rev-list -1 <tag>


Que tal agora:

git log -1 $TAGNAME

OU

git log -1 origin/$TAGNAME

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

Usar

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

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

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


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

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

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

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

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

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

~/.gitconfig

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




git-tag