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)
JB.*_*JB. 392
你可以看看git describe
,它会做一些接近你所要求的事情.
kil*_*anc 297
将在所有分支上输出最新标记的提交的标记
git describe --tags $(git rev-list --tags --max-count=1)
Run Code Online (Sandbox Code Playgroud)
Wil*_*ell 44
要获取最新标记,您可以执行以下操作:
$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1
当然,您可以根据需要更改计数参数或排序字段.看起来你可能想问一个略有不同的问题,但这确实回答了我解释它的问题.
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))
从技术上讲,不一定会为您提供最新的标签,但最新的标签会被标记,这可能是也可能不是您正在寻找的东西.
poo*_*a13 22
我不知道为什么这个问题没有答案。即所有标签(包括非注释)并且没有后缀:
git describe --tags --abbrev=0
Run Code Online (Sandbox Code Playgroud)
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)
想象一下开发人员标记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的路径上找到这样的标签,而是从那里分开的路径.
use*_*741 16
git tag --sort=committerdate | tail -1
Run Code Online (Sandbox Code Playgroud)
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
!
我开始自己的旅程(看看里面,我没有复制花哨的证明图像到这篇长篇文章):
目前我对标签和修订之间的距离有4个合理的定义,但有用性有所降低:
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
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)
如果您需要最后两个标记,以下内容适用于我(例如,为了在当前标记和前一个标记之间生成更改日志).我只在最新标签是的情况下测试过它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向导,我相信它可以进一步改进.我还怀疑它会在提交历史向前发展的情况下中断.我只是分享它以帮助某人.
如果您想查找应用于特定分支的最后一个标签,您可以尝试以下操作:
git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
Run Code Online (Sandbox Code Playgroud)
如果您需要一个单行程序来获取当前分支上的最新标签名称(按标签日期):
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。