如何在Git中的当前分支获取最新的标签名称?
在Git中获取最新标签的最简单方法是什么?
git tag a HEAD git tag b HEAD^^ git tag c HEAD^ git tag
输出:
a b c
我应该写一个脚本来获取每个标签的date时间并比较它们吗?
你可以看一下git describe
,它和你所要求的有些接近。
这一个工作:
git describe --abbrev=0 --tags
将在所有分支上输出最新标记提交的标记
git describe --tags $(git rev-list --tags --max-count=1)
要获得最新的标签,你可以这样做:
$ git for-each-ref refs / tags --sort = -taggerdate --format ='%(refname)'--count = 1
当然,您可以根据需要更改计数参数或sorting字段。 看起来你可能打算提出一个稍微不同的问题,但是这样做的确解释了这个问题。
这个怎么样?
TAG=$(git describe $(git rev-list --tags --max-count=1))
从技术上讲,不一定会得到你最新的标签,但最新的标签提交,这可能会或可能不是你正在寻找的东西。
git describe --tags
返回当前分支能够看到的最后一个标签
“最近”可能有两个含义在git方面。
你可能会说,“哪个标签的创builddate是最新的”,这里的大部分答案都是针对这个问题的。 就你的问题而言,你会想要返回标签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.1
是最近的,但是v0.2
在HEAD的发展历史上更接近,因为它所处的path开始于更靠近HEAD的点。
我想你通常想要第二个答案,在发展史上更接近。 你可以通过使用git log v0.2..HEAD
等为每个标签find。 这会给你在HEAD上提交的次数,因为在v0.2
结尾的path与HEAD后面的path分开。
下面是一个Python脚本,它通过遍历所有运行此检查的标记来迭代,然后打印出标签path发散后最less提交的标记:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
做了一些稍微不同的事情,因为它从(例如)HEAD追溯到HEAD发现历史logging中的第一个标记。 用git来说, git describe
寻找HEAD“可达”的标签。 因此,它不会findv0.2
这样的标签,而不是从HEAD返回的path,而是从这里发散的path。
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
如果你需要超过一个最后的标签
(混帐描述 – 标签有时给出错误的哈希,我不知道为什么,但对我来说 – 最大数2不工作)
这是如何以反时间顺序获得最新的2个标签名称的列表,在git 1.8.4上完美工作。 对于早期版本的git(比如1.7。*),输出中没有“tag:”string – 只是删除最后的sed调用
如果你想要两个以上的最新标签 – 把这个“sed 2q”改成“sed 5q”或者你需要的任何东西
然后,你可以轻松地将每个标签名称parsing为variables左右。
git describe --abbrev=0 --tags
如果您没有看到最新的标签,请确保在运行之前获取原点:
git remote update
git tag -l ac* | tail -n1
获取前缀为“ac”的最后一个标签。 例如,用ac1.0.0
或ac1.0.5
命名的标签。 其他标签1.1.0
将被忽略。
git tag -l [0-9].* | tail -n1
获取最后一个标记,其第一个字符是0-9
。 所以,那些第一个字符的标签将被忽略。
更多信息
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
属性不存在, tag.sort
默认使用lexicorgraphic order
。
sorting顺序默认为为tag.sortvariablesconfiguration的值(如果存在),否则按字典顺序排列。 请参阅git-config(1)。
谷歌之后, 有人说 git 2.8.0支持下面的语法。
git tag --sort=committerdate
如果您需要最后两个标签(例如,为了在当前标签和之前的标签之间生成更改日志),以下方法适用于我。 我只在最新的标签是HEAD
情况下才进行testing。
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 wizard,我相信它可以进一步改进。 我也怀疑在提交历史前进的情况下它会中断。 我只是分享,以防止他人帮助。
所有的build议有什么问题 ( Matthew Brett的解释,这个答案的最新date除外)?
只要运行jQuery Git历史上其他人提供的任何命令,当你在不同的历史点,并检查结果与视觉标记历史表示 (我这样做 ,这就是为什么你看到这个职位):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
今天许多项目执行版本(和标签) 在主线分开的分支 。
这有很强的原因 。 只要看看任何良好的JS / CSS项目。 对于用户约定,它们在DVCS中携带二进制/精简版本文件。 当然,作为项目维护者,您不希望使用无用的二进制blob来扼制主线比较历史logging,并执行主线以外的构build工件的提交。
因为Git使用DAG而不是线性历史logging – 很难定义距离度量,所以我们可以说 – 哦,这个转速离我的HEAD
最近!
我开始了自己的旅程(看看里面,我没有复制奇特的图像到这个长的职位):
什么是在Git分支方面最近的标签?
目前我有4个标签和修订之间的距离合理的定义,减less有用性:
- 从
HEAD
到合并base和tag 的最短path长度 -
HEAD
和标签之间的合并基数的 date - 从HEAD到达但从标签无法到达的转数
- 标记的date ,无论合并基地
我不知道如何计算最短path的长度 。
根据HEAD
和标签之间的合并基础 date对标签进行sorting的脚本:
$ git tag \ | while read t; do \ b=`git merge-base HEAD $t`; \ echo `git log -n 1 $b --format=%ai` $t; \ done | sort
它可用于大多数项目。
根据从HEAD到达但从标签无法访问的转数次数对脚本进行sorting的脚本:
$ git tag \ | while read t; do echo `git rev-list --count $t..HEAD` $t; done \ | sort -n
如果你的项目历史有提交的奇怪date(由于重新编号或其他历史重写或一些白痴忘记取代BIOS电池或你在历史上做的其他魔术)使用上面的脚本。
对于最后一个选项(标签date而不考虑合并基础 )获取按datesorting的标签列表使用:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
要获取当前修订date,请使用:
$ git log --max-count=1
请注意, git describe --tags
在自己的情况下git describe --tags
但不能用于在项目历史中find人类预期的最近标签 。
注意你可以在任何版本上使用上面的食谱,只需要用你想要的东西replaceHEAD
!
我的第一个想法是你可以使用git rev-list HEAD
,它按照反向时间顺序列出了所有的git rev-list HEAD
,并结合git tag --contains
。 当你find一个ref,其中git tag --contains
产生一个非空列表,你已经find了最新的标签。
这是一个古老的线程,但似乎很多人都错过了OP的最简单,最简单,最正确的答案的问题:获取当前分支的最新标记,你使用git describe HEAD
。 完成。
编辑:你也可以提供任何有效的refname,甚至遥控器; 即git describe origin/master
会告诉你从origin / master可以到达的最新标签。