分支包含的列表标签

时间:2010-03-04 18:20:31

标签: 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

但我希望有更好的方法,因为这可能需要很长时间才能在包含许多标记和提交的存储库中。

11 个答案:

答案 0 :(得分:58)

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).

我相信这个选项最近才被添加 - 当提出原始问题并提出上述答案时,它肯定无法恢复。由于这个帖子仍然是谷歌的第一个问题,我想我会把它扔给任何向下滚动到底部的人,寻找的答案涉及的打字少于接受的答案(并且在我自己参考的时候)我下周再次忘记这个答案。)

答案 1 :(得分:40)

这可能接近你想要的:

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

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

git describe --tags --abbrev=0 "$committish"
  • --tags将搜索轻量级代码,如果您只想考虑带注释的代码,请不要使用它。
  • 如果您还想查看通常的“顶部提交数量”和“缩写哈希值”后缀(例如v1.7.0-17-g7e5eb8),请不要使用--abbrev=0

答案 2 :(得分:12)

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

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:]]*##'

答案 3 :(得分:6)

我没有足够的声誉来评论其他人的帖子,但这是对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,所以你可能需要将我的“ssed”改为sed。

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

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

- -a

答案 4 :(得分: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

答案 5 :(得分:0)

git describe(或其某些变体)可能就是您要找的东西。

答案 6 :(得分:0)

你可以用这个:

# 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

答案 7 :(得分:0)

有一个git branch --contains(至少1.5.7以来的Git)

答案 8 :(得分:0)

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

{ 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/tags添加到f-e-r以限制它。

答案 9 :(得分:0)

所有答案仅列出标签,但是如果您希望它们按时间顺序排列,则需要添加--sort=taggerdate

或示例:

 git tag --merged release/11.x --sort=taggerdate
studio-1.4
llvmorg-10-init
llvmorg-11-init
llvmorg-11.0.0-rc1
llvmorg-11.0.0-rc2
llvmorg-11.0.0-rc3
llvmorg-11.0.0-rc4
llvmorg-11.0.0-rc5
llvmorg-11.0.0-rc6
llvmorg-11.0.0

答案 10 :(得分:0)

针对任何人的 Windows 特定答案。

(Powershell 最近实现了开源和跨平台,因此下面给出的命令也可以在 Windows 以外的系统上运行。)

<块引用>

注意:以下适用于旧版本的 git 或特定用例!

对于 powershell:

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

您还可以使用:-CaseSensitive 标志用于 Select-String 使其区分大小写

对于 cmd:

git log --simplify-by-decoration --decorate --pretty=oneline | findstr -i "tag: "

您可以删除 -i 以使搜索区分大小写

<块引用>

注意:对于新版本和跨平台,只要支持git命令就可以跨终端:

git tag --merged <branchname>

您可以使用格式、颜色、排序等选项。在这里查看所有内容:https://git-scm.com/docs/git-tag