git-列出分支所包含的标签

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

git tag --contains <commit>

其中“仅列出包含指定提交的标记”。

如果不存在类似的内容,如何测试另一个提交是否包含某个提交,以便可以对此编写脚本?

我可以这样做:

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

但是我希望有一种更好的方法,因为在具有许多标签和提交的存储库中,这可能需要很长时间。

tarsius asked 2019-11-14T05:38:28Z
9个解决方案
67 votes
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).

我相信这个选项是在最近才添加的-当提出原始问题并建议上述答案时,它肯定无法使用。 由于该线程仍然是Google在该问题上的第一命中,所以我认为我会把它扔给任何滚动到底部以寻找一个打字量少于接受的答案的人(当我忘记时供我参考) 下周再次回答这个问题)。

JamHandy answered 2019-11-14T05:39:44Z
40 votes

这可能接近您想要的:

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

但是,更常见的情况是只找到最新的标签:

git describe --tags --abbrev=0 "$committish"
  • --abbrev=0将搜索轻量级标签,如果只想考虑带注释的标签,则不要使用它。
  • 如果您还希望看到通常的“顶部提交数和缩写的哈希数”后缀(例如v1.7.0-17-g7e5eb8),请不要使用--abbrev=0
Chris Johnsen answered 2019-11-14T05:39:11Z
12 votes

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

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:]]*##'
Ferry Huberts answered 2019-11-14T05:40:11Z
6 votes

我没有足够的声誉来评论其他人的帖子,但这是对[https://stackoverflow.com/a/7698213/2598329]的回答及其评论的回应。为了显示所有可到达的标签 通过当前分支(包括HEAD提交上的标签),可以使用以下命令:

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

一个警告-我使用super sed,因此您可能需要将我的“ sed”更改为sed。

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

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

--一种

akutz answered 2019-11-14T05:41:10Z
1 votes

这是我按照反向时间顺序列出与模式(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
akhan answered 2019-11-14T05:41:47Z
0 votes

git describe(或它的某些变体)可能是您正在寻找的东西。

ebneter answered 2019-11-14T05:42:10Z
0 votes

您可以使用此:

# 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
Jared Grubb answered 2019-11-14T05:42:31Z
0 votes

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

{ 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 }
'

要获取所有裁判,请在f-e-r中添加refs/tags以对其进行限制。

jthill answered 2019-11-14T05:43:07Z
-1 votes

git branch --contains(Git自1.5.7起)

fork0 answered 2019-11-14T05:43:30Z
translate from https://stackoverflow.com:/questions/2381665/list-tags-contained-by-a-branch