Answers:
您可以看一下git describe
,它的功能与您的要求接近。
--abbrev=0
它应该返回最近的带注释的标签
git describe --exact-match --abbrev=0
。
git describe --tags
并在github发布页面中比较com的最后一个标记
要获取最新标签:
git describe --tags
要获取最新的带注释的标签:
git describe --abbrev=0
git describe
: --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
将在所有分支中输出最新标记的提交的标记
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
要获取最新标签,您可以执行以下操作:
$ git for-each-ref refs / tags --sort = -taggerdate --format ='%(refname)'--count = 1
当然,您可以根据需要更改count参数或sort字段。看来您可能想问一个稍微不同的问题,但这在我解释时确实回答了这个问题。
--sort=-authordate
和--sort=authordate
。
--sort=-taggerdate
。对于标签,authordate
并且committerdate
为空(因此无用作为排序键)。
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
甚至更好:)
--points-at=$SHA
会给你标签的提交哈希值。
这个怎么样?
TAG=$(git describe $(git rev-list --tags --max-count=1))
从技术上讲,不一定会为您提供最新的标签,但是可以为您标记的最新提交,这可能是您想要的东西,也可能不是。
--tags=<pattern>
在中使用rev-list
。例如,获取最新版本标签git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
您可以执行:git describe --tags $(git rev-list --tags --max-count=1)
在这里讨论:如何获取最新的标签名称?
git describe ...
标签会返回一个较早的标签?!)
--abbrev=0
答案,他们切断了我想要的部分标签。
就git而言,“最新”可能有两种含义。
您可能的意思是“哪个标签的创建日期是最新时间”,并且这里的大多数答案都针对该问题。就您的问题而言,您想返回tag c
。
或者您可能的意思是“哪个标签在开发历史上最接近某个命名分支”,通常是您所在的分支HEAD
。在您的问题中,这将返回tag 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
对每个标签使用etc 来找出答案。自从以HEAD结尾的路径结束的路径结束以来,这为您提供了HEAD上的提交次数v0.2
。
这是一个Python脚本,它通过遍历运行此检查的所有标签,然后打印出带有自标签路径偏离以来在HEAD上提交次数最少的标签来执行此操作:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
所做的事情略有不同,因为它从(例如)HEAD追溯,以查找从HEAD返回历史记录的路径上的第一个标签。用git术语,git describe
查找HEAD中“可达”的标签。因此,它将找不到v0.2
不在从HEAD返回的路径上的标签,而是从那里发散的路径上的标签。
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调用
如果您需要两个以上的最新标签-将此“ sed 2q”更改为“ sed 5q”或您需要的任何内容
然后,您可以轻松地将每个标签名称解析为变量左右。
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
其中in %D
排除周围的()
字符,并且sed
s开头5q在5之前保留4行,然后打印出'tag:'和第一个','之间的所有字符。因此...假设标签内未使用逗号,则效果很好。
所有建议有什么问题(马修·布雷特除外)解释,截至本答复的最新信息)?
当您在历史记录的不同点上时,只需在jQuery Git历史记录上运行其他人提供的任何命令,然后使用可视标记历史记录表示法检查结果即可(我这样做是为什么您看到此文章):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
如今,许多项目在与mainline分开的分支中执行发布(以及标记)。
这有很强的理由。只需查看任何完善的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
它可用于大多数项目。
脚本根据HEAD可以到达但标签无法到达的转速对标签进行排序:
$ 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
。因此,那些带有第一个字符的标签a-z
将被忽略。
git tag --help # Help for `git tag`
git tag -l <pattern>
列出名称与给定模式匹配的标签(如果没有给出模式,则列出所有名称)。不带参数运行“ git tag”也会列出所有标签。该模式是外壳通配符(即,使用fnmatch(3)进行匹配)。可以给出多种模式;如果它们中的任何一个匹配,则显示标签。
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
用git tag --help
,关于sort
参数。lexicorgraphic order
如果tag.sort
属性不存在,它将默认使用。
排序顺序默认为为tag.sort变量配置的值(如果存在),否则为字典顺序。参见git-config(1)。
在google之后,有人说 git 2.8.0支持以下语法。
git tag --sort=committerdate
如果您需要最后两个标签(例如,为了在当前标签和上一个标签之间生成更改日志),以下内容对我有用。我仅在最新标签为的情况下进行了测试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 for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
我们用它来设置版本号。
输出示例:
v1.0.0
在Windows上也可以使用。
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
),则跳过该部分--points-at=HEAD
。最后一个开关什么都不返回,我猜是因为我HEAD
没有被标记?
HEAD
没有被标记。
这是一个旧线程,但是似乎很多人都缺少OP问题的最简单,最简单和最正确的答案:要获取当前分支的最新标签,请使用git describe HEAD
。做完了
编辑:您还可以提供任何有效的refname,甚至是remote;即,git describe origin/master
将告诉您可以从来源/主站访问的最新标签。
for-each-ref
命令(stackoverflow.com/a/5261470/515973)和的组合rev-list
和describe
(stackoverflow.com/a/7979255/515973)
git describe branchname --tags
确实为我工作以获取分支上的最新标签(git版本2.12.2)
为了仅在当前分支/以当前分支为前缀的标签名称上获取最新标签,我必须执行以下命令
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}'