如何在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.1v0.1v0.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.0ac1.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可以到达的最新标签。