如何在Git的当前分支中获取最新的标签名称?

时间:2009-09-10 11:43:39

标签: git git-checkout git-tag getlatest

在Git中获取最新标记的最简单方法是什么?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

输出:

a
b
c

我应该编写一个脚本来获取每个标记的日期时间并进行比较吗?

25 个答案:

答案 0 :(得分:553)

获取最新标记:

git describe --tags

要获取最新的带注释的标记:

git describe --abbrev=0

答案 1 :(得分:366)

你可以看一下git describe,它会做一些接近你所要求的事情。

答案 2 :(得分:266)

将跨所有分支输出最新标记提交的标记

git describe --tags $(git rev-list --tags --max-count=1)

答案 3 :(得分:36)

要获取最新标记,您可以执行以下操作:

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

当然,您可以根据需要更改计数参数或排序字段。它出现 您可能想要提出一个略有不同的问题,但这确实可以解释我的解释问题。

答案 4 :(得分:27)

这个怎么样?

TAG=$(git describe $(git rev-list --tags --max-count=1))

从技术上讲,不一定会为您提供最新的标记,但最新的标记会被标记,这可能是也可能不是您要查找的内容。

答案 5 :(得分:21)

git describe --tags

返回当前分支能够看到的最后一个标记

答案 6 :(得分:19)

“最近”在git方面可能有两个含义。

你可能会说,“哪个标签的创建日期是最新的”,这里的大多数答案都是针对该问题的。就您的问题而言,您希望返回标记c

或者您可能意味着“哪个标记在开发历史中最接近某个命名分支”,通常是您所在的分支HEAD。在您的问题中,这将返回标记a

当然,这些可能会有所不同:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

想象一下,开发人员在星期一将Z标记为v0.2,然后在星期二将Q标记为v0.1v0.1是最新的,但v0.2在开发历史中更接近HEAD,因为它所在的路径始于更接近HEAD的点。

我认为你通常想要第二个答案,更接近发展历史。您可以通过对每个标记使用git log v0.2..HEAD等来找到它。这将为您提供HEAD上的提交次数,因为从v0.2结束的路径与HEAD后面的路径不同。

这是一个Python脚本,通过迭代运行此检查的所有标记,然后在HEAD上打印标记最少的标记,因为标记路径分歧:

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe做了一些稍微不同的事情,因为它从(例如)HEAD追溯回来找到HEAD历史回溯路径上的第一个标记。在git术语中,git describe查找HEAD“可访问”的标记。因此,它不会找到像v0.2这样的标签,这些标签不在HEAD的路径上,而是从那里偏离的路径。

答案 7 :(得分:16)

您可以执行:git describe --tags $(git rev-list --tags --max-count=1)在这里说:How to get latest tag name?

答案 8 :(得分:13)

git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

如果你需要超过一个标签

(git describe --tags有时会给出错误的哈希,我不知道为什么,但对我来说 - max-count 2不起作用)

这是你如何以反向时间顺序获得最新2个标签名称的列表,在git 1.8.4上完美运行。 对于早期版本的git(如1.7。*),输出中没有“tag:”字符串 - 只需删除最后一个sed调用

如果您想要超过2个最新标签 - 请将此“sed 2q”更改为“sed 5q”或您需要的任何内容

然后,您可以轻松地将每个标记名称解析为变量左右。

答案 9 :(得分:12)

什么是错误包含所有建议(Matthew Brett解释除外,此答案帖的最新日期)?

当您在不同的历史记录时,只需运行其他jQuery Git历史记录提供的命令,并使用视觉标记历史记录表示检查结果(我做了< / strong>这就是你看到这篇文章的原因):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

今天许多项目在主线的单独分支中执行发布(以及标记)

这有强烈的理由。只需查看任何完善的JS / CSS项目。对于用户约定,它们在DVCS中携带二进制/缩小版本文件。当然,作为项目维护者,您不希望使用无用的二进制blob来破坏主线 diff 历史记录,并执行构建工件超出主线

因为Git使用DAG而非线性历史记录 - 很难定义距离指标所以我们可以说 - 哦,转速最接近我的HEAD

我开始自己的旅程(看看里面,我没有将花哨的证明图像复制到这个长篇文章中):

What is nearest tag in the past with respect to branching in Git?

目前我对标签与修订之间的距离有4个合理的定义,但实用性有所下降:

  • 最短路径的长度HEAD合并基地与标记
  • 日期 合并基础HEAD和标记
  • 之间 可从HEAD访问但无法从标记访问的转速 无论合并基础 ,标签的
  • 日期

我不知道如何计算最短路径的长度

根据HEAD和标记之间合并基础日期对标记进行排序的脚本:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

它适用于大多数项目。

根据转数对标记进行排序的脚本,该标记可从HEAD访问但无法从标记访问:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

如果您的项目历史记录在提交时有奇怪的日期(因为重写或其他历史记录重写或某些白痴忘记更换BIOS电池或您在历史记录中执行的其他魔法),请使用上述脚本。

对于最后一个选项(日期的标记,无论合并基础),以获取按日期使用排序的标记列表:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

要获取已知的当前修订日期,请使用:

$ git log --max-count=1

请注意,git describe --tags在其自身案例中有用,但不能用于在项目历史记录中找到人类预期最近的标记

注意您可以在任何版本上使用以上配方,只需将HEAD替换为您想要的内容!

答案 10 :(得分:10)

git tag -l ac* | tail -n1

获取前缀&#34; ac&#34; 的最后一个标记。例如,标记为ac1.0.0ac1.0.5的标记。其他名为1.0.01.1.0的标签将被忽略。

git tag -l [0-9].* | tail -n1

获取最后一个标记,其第一个字符为0-9。因此,那些带有第一个字符a-z的标记将被忽略。

更多信息

git tag --help # Help for `git tag`
git tag -l <pattern>
  

列出名称与给定模式匹配的标签(如果没有,则列出所有标签)              给出了模式)。运行&#34; git tag&#34;没有参数也列出              所有标签。该模式是shell通配符(即匹配使用              的fnmatch(3))。可以给出多种模式;如果他们中的任何一个              匹配,标签显示。

tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

更新

使用git tag --help,关于sort参数。如果lexicorgraphic order属性不存在,默认情况下会使用tag.sort

  

排序顺序              默认为tag.sort变量配置的值(如果是)              存在,否则就是字典顺序。见git-config(1)。

google之后,someone said git 2.8.0支持以下语法。

git tag --sort=committerdate

答案 11 :(得分:10)

我不确定为什么问题没有答案。即所有标签(包括未注释的标签)且不带后缀:

git describe --tags --abbrev=0

答案 12 :(得分:9)

git describe --abbrev=0 --tags

如果您没有看到最新标记,请确保在运行之前获取原点:

git remote update

答案 13 :(得分:5)

以下适用于我需要最后两个标记的情况(例如,为了在当前标记和前一个标记之间生成更改日志)。我只在最新标签为HEAD的情况下对其进行了测试。

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

它适合我的需要,但由于我不是git向导,我相信它可以进一步改进。我还怀疑它会在提交历史向前发展的情况下中断。我只是分享它以帮助某人。

答案 14 :(得分:3)

我的第一个想法是你可以使用git rev-list HEAD,它以反向时间顺序列出所有转速,并结合git tag --contains。当您找到git tag --contains生成非空列表的ref时,您已找到最新的标记。

答案 15 :(得分:3)

如果要查找在特定分支上应用的最后一个标记,可以尝试以下操作:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

答案 16 :(得分:2)

如果您需要一个衬纸,它可以在当前分支上获得最新标签名称(按标签日期):

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

我们使用它来设置设置中的版本号。

输出示例:

v1.0.0

在Windows上也可以使用。

答案 17 :(得分:1)

这是一个老话题,但似乎很多人都错过了OP问题的最简单,最简单,最正确的答案:获取当前分支的最新标记,您使用git describe HEAD。完成。

编辑:您还可以提供任何有效的refname,甚至是遥控器;即,git describe origin/master将告诉您可以从origin / master获得的最新标记。

答案 18 :(得分:0)

对于提出的问题,

  

如何在当前分支中获取最新的标记名称

你想要

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent告诉git log不要详细说明任何合并的历史记录,--pretty=%d表示只显示装饰,即任何提交的本地名称。 grep -m1表示“只匹配一个”,因此您只能获得最新的标记。

答案 19 :(得分:0)

如果您的代码是可排序的:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

答案 20 :(得分:0)

要仅使用当前分支前缀的当前分支/标记名称获取最新标记,我必须执行以下

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
  

分店主:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448
  

分支定制:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

我最后需要递增并为下一个标记获取+1标记。

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'

答案 21 :(得分:0)

git tag --sort=committerdate | tail -1

答案 22 :(得分:0)

这里没有多提及未注释的标签与已注释的标签。 'describe'对带注释的标签起作用,而忽略无注释的标签。

这很丑陋,但是可以完成所请求的工作,并且它不会在其他分支上找到任何标签(并且在以下示例中未在命令:master中指定的分支上)

应该对过滤进行优化(合并),但这似乎是可行的。

git log  --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1

欢迎批评,因为我现在要使用它:)

答案 23 :(得分:0)

git tag --sort=-refname | awk 'match($0, /^[0-9]+\.[0-9]+\.[0-9]+$/)' | head -n 1 

这是与语义版本匹配的所有分支中最新的标签。

答案 24 :(得分:-1)

获取最新标签名称的另一种简单方法是

git tag | tail -1

TAG=$(git tag | tail -1)

将其存储在变量中。

git tag列出所有可用的标记,如果结果返回,tail -1将返回最后一行。