列表标签包含在一个分支

我如何列出给定分支包含的标签,相反:

git tag --contains <commit> 

其中“只列出包含指定提交的标签”。

如果像这样的东西不存在,我该如何testing一个提交是否被另一个提交包含,以便我可以编写脚本?

我可以这样做:

 commit=$(git rev-parse $branch) for tag in $(git tag) do git log --pretty=%H $tag | grep -q -E "^$commit$" done 

但是我希望有一个更好的方法,因为这可能需要很长时间才能在有许多标签和提交的仓库中使用。

这可能接近你想要的:

 git log --simplify-by-decoration --decorate --pretty=oneline "$committish" | fgrep 'tag: ' 

但是,更常见的情况是find最近的标签:

 git describe --tags --abbrev=0 "$committish" 
  • --tags将search轻量级标签,不要使用它,如果你只想考虑注释标签。
  • 不要使用--abbrev=0如果你还想看到通常的“提交数量”和“缩写哈希”后缀(例如v1.7.0-17-g7e5eb8)。
 git tag --merged <branch> 

从手册页:

 --[no-]merged <commit> Only list tags whose tips are reachable, or not reachable if --no-merged is used, from the specified commit (HEAD if not specified). 

我相信这个选项是最近添加的 – 当原来的问题被提出并且上面的答案被提出时,它肯定是不可用的。 由于这个主题仍然是谷歌的第一个打击,我想我会把它放在任何人谁滚动到底部寻找一个答案,涉及较less的键入比接受的答案(和我自己的参考,当我忘记这个答案下周再次)。

列出当前分支上可达的所有标签:

 git log --decorate=full --simplify-by-decoration --pretty=oneline HEAD | \ sed -r -e 's#^[^\(]*\(([^\)]*)\).*$#\1#' \ -e 's#,#\n#g' | \ grep 'tag:' | \ sed -r -e 's#[[:space:]]*tag:[[:space:]]*##' 

我没有足够的声望评论其他人的post,但是这是对https://stackoverflow.com/a/7698213/2598329中的答案和评论的回应。; 为了显示当前分支可访问的所有标签,包括HEAD提交中的标签,可以使用以下命令:

 git log --decorate --oneline | egrep '^[0-9a-f]+ \((HEAD, )?tag: ' | ssed -r 's/^.+tag: ([^ ]+)[,\)].+$/\1/g' 

一个警告 – 我使用超级sed,所以你可能需要改变我的“ssed”为sed。

而对于它的地狱,这里是在PowerShell中:

 git log --decorate --oneline | % { if ($_ -match "^[0-9a-f]+ \((HEAD, )?tag: ") { echo $_} } | % { $_ -replace "^.+tag: ([^ ]+)[,\)].+$", "`$1" } 

– -一个

以下是我按照时间顺序列出与模式(TAG_PREFIX *)匹配的注释标签的方法。 这个配方使用git-describe。

 #!/usr/bin/env bash tag=$(git describe --abbrev=0 --match TAG_PREFIX*) until [ -z $tag ]; do echo $tag tag=$(git describe --abbrev=0 --match TAG_PREFIX* $tag^ 2>/dev/null); done 

如果匹配模式的多个标签指向相同的提交,这将不起作用。 为此,下面是另一个使用git-rev-list和git-tag列出所有标签的配方,匹配TAG_PREFIX *,从一个提交(本例中为HEAD)开始。

 #!/usr/bin/env bash git rev-list HEAD | while read sha1; do tags=( "$(git tag -l --points-at $sha1 TAG_PREFIX*)" ) [[ ! -z ${tags[*]} ]] && echo "${tags[@]}" | sort -r done 

git描述 (或它的一些变种)可能是你在找什么。

你可以使用这个:

 # get tags on the last 100 commits: base_rev=master~100 end_rev=master for rev in $(git rev-list $base_rev..$end_rev) do git describe --exact-match $rev 2> /dev/null done 

有一个git branch --contains (Git自1.5.7起,至less)

高效的大量标签,并获得简单的格式灵活性:

 { git rev-list --first-parent ${1:-HEAD} git for-each-ref --format='%(objectname) %(objecttype) %(refname) %(*objectname) *(%(objecttype)) %(refname)' } \ | awk ' NF==1 { revs[$1]=1; next } { if ( $1 in revs ) print $1,$2,$3 } ' 

获取所有的refs,添加refs/tags给fer来限制它。