在Git中获取最新标签的最简单方法是什么?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
输出:
a
b
c
我应该写一个脚本来获得每个标记的日期时间并比较它们吗?
在Git中获取最新标签的最简单方法是什么?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
输出:
a
b
c
我应该写一个脚本来获得每个标记的日期时间并比较它们吗?
当前回答
就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描述做了一些稍微不同的事情,因为它从(例如)HEAD跟踪,以找到从HEAD返回的历史路径上的第一个标记。在git术语中,git描述了从HEAD“可到达”的标记的查找。因此,它不会找到像v0.2这样不在从HEAD返回的路径上的标记,而是从那里偏离的路径。
其他回答
为了只获取当前分支/以当前分支为前缀的标记名上的最新标记,我必须执行以下命令
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而言,“最近的”可能有两种含义。
您的意思可能是“哪个标签的创建日期最近”,这里的大多数答案都是关于这个问题的。在你的问题中,你想要返回标签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描述做了一些稍微不同的事情,因为它从(例如)HEAD跟踪,以找到从HEAD返回的历史路径上的第一个标记。在git术语中,git描述了从HEAD“可到达”的标记的查找。因此,它不会找到像v0.2这样不在从HEAD返回的路径上的标记,而是从那里偏离的路径。
对于刚才的问题,
如何获得当前分支中最新的标记名称
你想要的
git log --first-parent --pretty=%d | grep -m1 tag:
——first-parent告诉git log不要详述任何合并的历史,——pretty=%d表示只显示装饰,即任何提交的本地名称。Grep -m1表示“只匹配一个”,因此您只获得最近的标记。
如果你需要一个获得当前分支上最新标签名称(通过标签日期)的一行程序:
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
我们使用它来设置设置中的版本号。
输出的例子:
v1.0.0
也适用于Windows。
要获得最新的标签,你可以这样做:
$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1
当然,您可以根据需要更改count参数或排序字段。似乎 你可能想问一个稍微不同的问题,但这确实回答了我理解的问题。