如何在Git中获取当前分支的最新标签名称?
-
05-07-2019 - |
题
在 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
!
我开始自己的旅程(看看里面,我没有将精美的校样图像复制到这篇长文章中):
目前我对标签和修订版之间的距离有 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