Qual é a maneira mais simples de obter a tag mais recente no Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
resultado:
a
b
c
Devo escrever um script para obter o datetime de cada tag e compará-los?
git
git-checkout
git-tag
getlatest
culebrón
fonte
fonte
Respostas:
Você pode dar uma olhada
git describe
, o que faz algo parecido com o que você está perguntando.fonte
--abbrev=0
ele deve retornar mais próximo anotada taggit describe --exact-match --abbrev=0
.git describe --tags
e compare a última tag com na página de lançamento do githubPara obter a tag mais recente:
Para obter a tag anotada mais recente :
fonte
git describe
diz:--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Produzirá a tag do último commit marcado em todas as ramificações
fonte
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursellPara obter a tag mais recente, você pode:
Obviamente, você pode alterar o argumento de contagem ou o campo de classificação, conforme desejado. Parece que você pretende fazer uma pergunta um pouco diferente, mas isso responde à pergunta como eu a interpreto.
fonte
--sort=-authordate
e--sort=authordate
.--sort=-taggerdate
. Para tagsauthordate
ecommitterdate
está vazio (tão inútil quanto as chaves de classificação).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
é ainda melhor :)--points-at=$SHA
fornecerá a tag para um hash de confirmação.Que tal agora?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Tecnicamente, você não necessariamente obterá a tag mais recente, mas o commit mais recente que está marcado, que pode ou não ser o que você está procurando.
fonte
--tags=<pattern>
-lorev-list
. Por exemplo, obtenha a tag da última versãogit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Você pode executar:
git describe --tags $(git rev-list --tags --max-count=1)
falou aqui: Como obter o nome da tag mais recente?fonte
git describe ...
retorna uma tag antes ?!)--abbrev=0
respostas e eles cortaram parte da tag que eu quero."Mais recente" pode ter dois significados em termos de git.
Você pode dizer "qual tag tem a data de criação mais recente" e a maioria das respostas aqui são para essa pergunta. Em termos de sua pergunta, você deseja retornar a tag
c
.Ou você pode significar "qual tag é a mais próxima do histórico de desenvolvimento de algum ramo nomeado", geralmente o ramo em que você está
HEAD
,. Na sua pergunta, isso retornaria a taga
.Estes podem ser diferentes, é claro:
Imagine que o desenvolvedor marcou
Z
comov0.2
segunda-feira e depoisQ
comov0.1
terça-feira.v0.1
é o mais recente, masv0.2
está mais próximo na história do desenvolvimento do HEAD, no sentido de que o caminho em que ele começa começa em um ponto mais próximo do HEAD.Eu acho que você geralmente quer essa segunda resposta, mais próxima da história do desenvolvimento. Você pode descobrir isso usando
git log v0.2..HEAD
etc para cada tag. Isso fornece o número de confirmações no HEAD desde o caminho que termina emv0.2
divergiu do caminho seguido por HEAD.Aqui está um script Python que faz isso iterando todas as tags que executam essa verificação e, em seguida, imprimindo a tag com menos confirmações no HEAD, pois o caminho da tag divergiu:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
faz algo um pouco diferente, na medida em que rastreia de (por exemplo) HEAD para encontrar a primeira tag que está no caminho de volta da história a partir de HEAD. Em termos de git,git describe
procura por tags "acessíveis" a partir do HEAD. Portanto, ele não encontrará tags comov0.2
essas que não estão no caminho de volta do HEAD, mas em um caminho que divergiu a partir daí.fonte
git describe --tags
retorna a última tag capaz de ser vista pelo ramo atual
fonte
SE VOCÊ PRECISA DE MAIS DE UM ÚLTIMO TAG
(git descrevem - tags às vezes dão hashes errados, eu não sei por que, mas para mim --max-count 2 não funciona)
é assim que você pode obter a lista com os 2 últimos nomes de tags em ordem cronológica reversa, funciona perfeitamente no git 1.8.4. Para versões anteriores do git (como 1.7. *), Não há "tag:" string na saída - apenas exclua a última chamada sed
Se você quiser mais de duas tags mais recentes - altere "sed 2q" para "sed 5q" ou o que você precisar
Em seguida, você pode analisar facilmente cada nome de tag como variável.
fonte
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
where in%D
exclui os()
caracteres circundantes , e osed
s inicial 5q deixa 4 linhas antes de 5, depois imprime todos os caracteres entre 'tag: `e o primeiro', '. Então ... supondo que nenhuma vírgula seja usada dentro da tag, isso funciona perfeitamente.O que há de errado com todas as sugestões (exceto a explicação de Matthew Brett , atualizada nesta resposta)?
Basta executar qualquer comando fornecido por outro no histórico do jQuery Git quando você estiver em um ponto diferente do histórico e verificar o resultado com a representação visual do histórico de marcação (eu fiz por isso que você vê este post):
Atualmente, muitos projetos realizam lançamentos (e, portanto, marcam) em ramificações separadas da linha principal .
Há fortes razões para isso. Basta olhar para qualquer projeto JS / CSS bem estabelecido. Para convenções de usuários, eles carregam arquivos de liberação binária / minificada no DVCS. Naturalmente, como mantenedor do projeto, você não deseja descartar o histórico de diferenças da linha principal com blobs binários inúteis e executar o commit de artefatos de construção fora da linha principal .
Como o Git usa o DAG e não o histórico linear - é difícil definir a métrica da distância para que possamos dizer - oh, essa rev é a mais próxima da minha
HEAD
!Começo minha própria jornada (olhe para dentro, não copiei imagens de prova sofisticadas para este longo post):
Qual é a tag mais próxima no passado em relação à ramificação no Git?
Atualmente, tenho 4 definições razoáveis de distância entre tag e revisão com diminuição da utilidade:
HEAD
de base de intercalação com tagHEAD
e tagNão sei como calcular o comprimento do caminho mais curto .
Script que classifica as tags de acordo com a data da base de mesclagem entre
HEAD
e tag:É utilizável na maioria dos projetos.
Script que classifica as tags de acordo com o número de rotações alcançáveis a partir de HEAD, mas não alcançáveis a partir da tag:
Se o histórico do seu projeto tiver datas estranhas nas confirmações (devido a rebase ou outra reescrita do histórico ou algum idiota, esqueça de substituir a bateria do BIOS ou outras mágicas que você faz no histórico) use o script acima.
Para a última opção ( data da tag, independentemente da base de mesclagem ), para obter a lista de tags classificadas por data, use:
Para conhecer a data atual da revisão, use:
Observe que eles
git describe --tags
têm uso em seus próprios casos, mas não para encontrar a marca mais próxima esperada humana no histórico do projeto .NOTA Você pode usar as receitas acima em qualquer revisão, basta substituir
HEAD
pelo que deseja!fonte
git describe --abbrev=0 --tags
Se você não vir a tag mais recente, verifique a busca da origem antes de executar:
git remote update
fonte
Obtenha a última tag com o prefixo "ac" . Por exemplo, tag nomeada com
ac1.0.0
, ouac1.0.5
. Outras marcas nomeados1.0.0
,1.1.0
serão ignorados.Obtenha a última tag, cujo primeiro caractere é
0-9
. Portanto, essas tags com o primeiro caracterea-z
serão ignoradas.Mais informações
Atualizar
Com
git tag --help
, sobre osort
argumento. Ele será usadolexicorgraphic order
por padrão, se atag.sort
propriedade não existir.Depois do google, alguém disse que o suporte ao git 2.8.0 segue a sintaxe.
fonte
fonte
O seguinte funciona para mim, caso você precise das duas últimas tags (por exemplo, para gerar um log de alterações entre a tag atual e a tag anterior). Eu testei apenas na situação em que a última tag foi
HEAD
.Atende às minhas necessidades, mas como não sou um git wizard, tenho certeza de que poderia ser melhorado ainda mais. Eu também suspeito que isso será interrompido caso o histórico de consolidação avance. Estou apenas compartilhando, caso isso ajude alguém.
fonte
Meu primeiro pensamento é que você poderia usar
git rev-list HEAD
, que lista todas as rotações em ordem cronológica reversa, em combinação comgit tag --contains
. Quando você encontra uma referência ondegit tag --contains
produz uma lista não vazia, você encontra as tags mais recentes.fonte
Se você deseja encontrar a última tag que foi aplicada em uma ramificação específica, tente o seguinte:
fonte
Se você precisar de um liner que obtenha o nome mais recente da tag (por data da tag) na ramificação atual :
Usamos isso para definir o número da versão na configuração.
Exemplo de saída:
Também funciona no Windows.
fonte
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) e pular o texto,--points-at=HEAD
ele funcionará. Com essa última opção, ele não retorna nada, acho que porque o meuHEAD
não está marcado?HEAD
não está marcado.Este é um tópico antigo, mas parece que muitas pessoas estão perdendo a resposta mais simples, fácil e correta à pergunta do OP: para obter a última tag do ramo atual , use
git describe HEAD
. Feito.Editar: você também pode fornecer qualquer nome de referência válido, mesmo controles remotos; ou seja,
git describe origin/master
informará a tag mais recente que pode ser acessada a partir da origem / mestre.fonte
for-each-ref
comando ( stackoverflow.com/a/5261470/515973 ) e a combinação derev-list
edescribe
( stackoverflow.com/a/7979255/515973 )git describe branchname --tags
não trabalho para mim para receber as últimas tag no ramo (git versão 2.12.2)Para obter a tag mais recente apenas no nome da filial / marca atual que prefixa a filial atual, tive que executar o seguinte
E minha necessidade final de incrementar e obter a tag +1 para a próxima tag.
fonte
Para a pergunta feita,
você quer
--first-parent
dizgit log
para não detalhar nenhuma história mesclada,--pretty=%d
diz para mostrar apenas as decorações, ou seja, nomes locais para quaisquer confirmações.grep -m1
diz "corresponder a apenas um", para que você obtenha apenas a tag mais recente.fonte
se suas tags puderem ser classificadas:
fonte
Não há muita menção de tags não anotadas versus tags anotadas aqui. 'description' funciona em tags anotadas e ignora as não anotadas.
Isso é feio, mas faz o trabalho solicitado e não encontrará nenhuma tag em outras ramificações (e não na especificada no comando: master no exemplo abaixo)
A filtragem provavelmente deve ser otimizada (consolidada), mas, novamente, isso parece funcionar.
As críticas são bem-vindas, pois agora vou colocar isso em uso :)
fonte
Outra maneira simples de obter o nome da tag mais recente é com
ou
para armazená-lo em uma variável.
git tag
lista todas as tags disponíveis e retornará a última linha se o resultado.tail
-1
fonte