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

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

输出:

a
b
c

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

有帮助吗?

解决方案

您可以查看 git describe ,它可以提供您所要求的内容。

其他提示

获取最新标记:

git describe --tags

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

git describe --abbrev=0

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

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

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

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

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

这个怎么样?

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

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

git describe --tags

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

“最近”在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。 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的路径上,而是从那里偏离的路径。

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

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”或者你需要的任何东西

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

什么是 错误的 与所有建议(除了 马修·布雷特 解释,此答案帖子的最新内容)?

只需在 jQuery Git 历史记录中运行其他人提供的任何命令即可 不同的历史点 并检查结果 视觉标记历史表示 (我 做过 这就是你看到这篇文章的原因):

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

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

强有力的理由 为了这。只要看看任何成熟的 JS/CSS 项目即可。对于用户约定,它们在 DVCS 中携带二进制/缩小版本文件。作为项目维护者,你自然不想破坏你的主线 差异 具有无用的二进制 blob 的历史记录并执行构建工件的提交 脱离主线.

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

我开始自己的旅程(看看里面,我没有将精美的校样图像复制到这篇长文章中):

关于 Git 中的分支,过去最近的标签是什么?

目前我对标签和修订版之间的距离有 4 个合理的定义,随着有用性的降低:

  • 最短路径的长度HEAD合并基地 带标签
  • 日期合并基地 之间 HEAD 和标签
  • 转数 可以从 HEAD 访问但不能从 tag 访问
  • 日期 无论标签的 合并基地

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

对标签进行排序的脚本 日期合并基地 之间 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 访问但不能从 tag 访问:

$ 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 与你想要的!

git tag -l ac* | tail -n1

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

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

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

更多信息

git tag --help # Help for `git tag`

git tag -l <pattern>
  

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


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

更新

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

  

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

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

git tag --sort=committerdate

git describe --abbrev = 0 --tags

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

git remote update

以下适用于我需要最后两个标记的情况(例如,为了在当前标记和前一个标记之间生成更改日志)。我只在最新标签是 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向导,我相信它可以进一步改进。我还怀疑它会在提交历史向前发展的情况下中断。我只是分享它以帮助某人。

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

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

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

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

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

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

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}'

对于提出的问题,

  

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

你想要

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

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

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

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top