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

cul*_*rón 424 git git-checkout getlatest git-tag

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

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
Run Code Online (Sandbox Code Playgroud)

输出:

a
b
c
Run Code Online (Sandbox Code Playgroud)

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

小智 591

要获取最新标记:

git describe --tags
Run Code Online (Sandbox Code Playgroud)

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

git describe --abbrev=0
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`git describe --tags` (21认同)
  • 这应该是公认的答案.谢谢你的提交. (9认同)
  • 如果你有两个指向同一提交的标签,这个答案(可能还有其他的)会遇到麻烦.除非标签是带注释的标签,否则我认为git无法区分之前创建的两个标签. (5认同)
  • 如果你想直接签出最新的标签:`git checkout $(git describe --abbrev = 0 --tags)` (5认同)
  • 这个答案比当前的“接受”更好,因为它提供了要使用的确切命令行,而不仅仅是“查看文档” (5认同)
  • 是的,作为`git describe`的手册页说:` - abbrev = <n> [...]一个<n>为0将禁止长格式,只显示最接近的标签. (2认同)
  • 如果我有两个以上的标签,那么这不会打印出来 (2认同)
  • 老线程,感觉很愚蠢,但是 `git fetch --tags origin &amp;&amp; git describe --abbrev=0 --tags` 不会返回由 `fetch` 操作拉下的最新标签。我想知道为什么不呢? (2认同)
  • 两个命令中都需要 `--abbrev=0` 来仅显示标签名称(没有后续的提交计数和哈希值)。澄清一下,除了带注释的标签之外,“--tags”默认还会搜索轻量级标签。 (2认同)

JB.*_*JB. 392

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

  • 使用`--abbrev = 0`,它应返回最接近**注释的**标记 (184认同)
  • 要获取**最新注释标记**,其目标**仅**当前分支**中的当前提交**,请使用`git describe --exact-match --abbrev = 0`. (42认同)
  • `git describe --tags`并比较github发布页面中的com最后一个标签 (17认同)
  • 返回当前分支中的最新标记**.** (13认同)
  • 这个答案和评论没有为我提供正确的标签.@kilianic提供了正确的解决方案. (5认同)
  • 我创建了3个标签,即“ 0.0.123-dev”,“ 0.0.124-dev”,“ 0.0.125-dev”。我尝试使用“ git describe --tags”。它只显示“ 0.0.123-dev”,我希望是“ 0.0.125-dev” (2认同)
  • `git describe --tags --abbrev=0` 对我有用(git 版本 2.22.0)。 (2认同)

kil*_*anc 297

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

git describe --tags $(git rev-list --tags --max-count=1)
Run Code Online (Sandbox Code Playgroud)

  • 除了特别询问当前分支的问题. (54认同)
  • 这是最好的答案.它实际上会在所有分支上获得标记,而不仅仅是当前分支,就像当前的"正确"答案一样. (19认同)
  • 或者`TAG = $(git describe --tags $(git rev-list --tags --max-count = 1))`@ william-pursell (8认同)
  • @michaeltwofish,当时我不知道,我后来想出来并相应地纠正了我的答案.对于那个很抱歉. (3认同)
  • 注意:即使此标记位于另一个分支上,此命令也会返回"最新"标记. (3认同)
  • 我不同意问题与特定分支有关的说法。问题的标题暗示了这一点,但实际提出的问题是“在 Git 中获取最新标签的最简单方法是什么?” 如果标题是问题,我想这是一个元问题。 (2认同)

Wil*_*ell 44

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

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

当然,您可以根据需要更改计数参数或排序字段.看起来你可能想问一个略有不同的问题,但这确实回答了我解释它的问题.

  • `git for-each-ref refs/tags --sort = -taggerdate --format ='%(refname:short)' - count = 1`甚至更好:) (8认同)
  • 真的,低估了近5年没有评论的完美正确答案吗?那太粗鲁了. (5认同)
  • 啊哈,因为你真正想要的是`--sort = -taggerdate`.对于标签,`authordate`和`committerdate`是空的(因此排序键无用). (3认同)
  • 这几乎就是我所寻找的(所有分支中最新的标签),但至少在我的git版本(1.7.7.6)中,标签以相同的顺序生成`--sort = -authordate`和`--sort = authordate`. (2认同)

Sha*_*ane 37

CI/CD 流程的问题describe是您可能会遇到错误fatal: no tags can describe

发生这种情况是因为git describe --help

该命令查找可从提交访问的最新标签。

如果您想要存储库中的最新标签,无论您所在的分支是否可以访问该标签(通常是因为它不是当前分支树的一部分),此命令将为您提供整个存储库中最近创建的标签:

git tag -l --sort=-creatordate | head -n 1
Run Code Online (Sandbox Code Playgroud)

更多详细信息和其他排序键可以在这里找到: https: //git-scm.com/docs/git-for-each-ref#_field_names


小智 30

这个怎么样?

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

从技术上讲,不一定会为您提供最新的标签,但最新的标签会被标记,这可能是也可能不是您正在寻找的东西.

  • 如果需要获取标签匹配模式,可以在 `rev-list` 中使用 `--tags=&lt;pattern&gt;`。例如,获取最新版本标签`git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)` (3认同)
  • $(git 描述 --包含 $(git rev-parse HEAD)) (2认同)

xse*_*rat 23

您可以执行:git describe --tags $(git rev-list --tags --max-count=1)在这里讨论:如何获取最新的标签名称?


poo*_*a13 22

我不知道为什么这个问题没有答案。即所有标签(包括非注释)并且没有后缀:

git describe --tags --abbrev=0
Run Code Online (Sandbox Code Playgroud)


bee*_*urs 21

git describe --tags

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


Mat*_*ett 21

"最近"在git方面可能有两个含义.

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

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

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

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

想象一下开发人员标记Zv0.2星期一,然后标记Qv0.1星期二. v0.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的路径上找到这样的标签,而是从那里分开的路径.


use*_*741 16

git tag --sort=committerdate | tail -1
Run Code Online (Sandbox Code Playgroud)

  • 请解释此代码片段将如何解决问题,而不是发布仅代码答案。 (2认同)

eas*_*ast 15

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

如果你需要超过一个标签

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

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

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

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


gav*_*koa 13

所有建议有什么问题(除了Matthew Brett的解释,此答复帖的最新版本)?

当您在历史的不同时刻运行jQuery Git历史记录中的其他任何命令,并使用可视化标记历史记录表示检查结果(我这样做是为什么您会看到此帖子):

$ git log --graph --all --decorate --oneline --simplify-by-decoration
Run Code Online (Sandbox Code Playgroud)

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

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

因为Git使用DAG而不是线性历史 - 很难定义距离度量, 所以我们可以说 - 哦,转速最接近我HEAD!

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

过去最接近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
Run Code Online (Sandbox Code Playgroud)

它可用于大多数项目.

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

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n
Run Code Online (Sandbox Code Playgroud)

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

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

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
Run Code Online (Sandbox Code Playgroud)

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

$ git log --max-count=1
Run Code Online (Sandbox Code Playgroud)

请注意,它git describe --tags可以在自己的情况下使用,但不能在项目历史记录中查找人类期望的最近标记.

注意您可以在任何修订版上使用上述配方,只需替换HEAD为您想要的!


Wal*_*r B 11

git describe --abbrev=0 --tags

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

git remote update

  • @acassis答案重复 - http://stackoverflow.com/a/7261049/873282 (6认同)

Aec*_*Liu 11

git tag -l ac* | tail -n1
Run Code Online (Sandbox Code Playgroud)

获取前缀为"ac"的最后一个标记.例如,标记为ac1.0.0,或ac1.0.5.命名为其它标签1.0.0,1.1.0将被忽略.

git tag -l [0-9].* | tail -n1
Run Code Online (Sandbox Code Playgroud)

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

更多信息

git tag --help # Help for `git tag`
Run Code Online (Sandbox Code Playgroud)
git tag -l <pattern>
Run Code Online (Sandbox Code Playgroud)

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


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 
Run Code Online (Sandbox Code Playgroud)

更新

随着git tag --help,有关sort说法.lexicorgraphic order如果tag.sort属性不存在,它将默认使用.

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

google之后,有人说 git 2.8.0支持以下语法.

git tag --sort=committerdate
Run Code Online (Sandbox Code Playgroud)


Iva*_*ica 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_"`
Run Code Online (Sandbox Code Playgroud)

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


Scy*_*ion 5

如果您想查找应用于特定分支的最后一个标签,您可以尝试以下操作:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
Run Code Online (Sandbox Code Playgroud)


Mar*_*kus 5

如果您需要一个单行程序来获取当前分支上的最新标签名称(按标签日期):

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

我们用它来设置安装程序中的版本号。

输出示例:

v1.0.0
Run Code Online (Sandbox Code Playgroud)

也适用于 Windows。

  • 如果我将该部分用引号引起来(即 `--format="%(refname:short)"`)并跳过 `--points-at=HEAD` ,它就可以工作。最后一个开关没有返回任何内容,我猜是因为我的“HEAD”没有被标记? (3认同)