список тегов, содержащихся в ветке - PullRequest
54 голосов
/ 04 марта 2010

Как я могу перечислить теги, содержащиеся в данной ветви, противоположность:

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

Но я надеюсь, что есть лучший способ, так как это может занять много времени в репозитории с большим количеством тегов и коммитов.

Ответы [ 9 ]

60 голосов
/ 22 августа 2016
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 по вопросу, который я рассчитывал, я добавлю его всем, кто прокручивает страницу до конца в поисках ответа, который включает в себя меньше ввода, чем принятый ответ (и для моего собственного обращения, когда я забыл этот ответ снова на следующей неделе).

40 голосов
/ 05 марта 2010

Это может быть близко к тому, что вы хотите:

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

Но более распространенная ситуация - просто найти самый последний тег:

git describe --tags --abbrev=0 "$committish"
  • --tags будет искать по легким тегам, не используйте его, если вы хотите использовать только аннотированные теги.
  • Не используйте --abbrev=0, если вы также хотите видеть обычный суффикс «количество коммитов сверху» и сокращенный хеш (например, v1.7.0-17-g7e5eb8).
12 голосов
/ 08 октября 2011

для отображения всех доступных тегов в текущей ветви:

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:]]*##'
6 голосов
/ 08 января 2014

У меня недостаточно репутации, чтобы комментировать посты других людей, но это в ответ на ответ и его комментарии на https://stackoverflow.com/a/7698213/2598329. Чтобы показать все теги, доступные текущей ветке, включая В теге HEAD commit вы можете использовать следующее:

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

1 голос
/ 20 июня 2014

Вот как я перечисляю аннотированные теги, соответствующие шаблону (TAG_PREFIX *) в обратном хронологическом порядке.Этот рецепт использует git-description.

#!/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
0 голосов
/ 23 августа 2015

Эффективно для большого количества тегов и обеспечивает простую гибкость формата:

{ 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, чтобы ограничить его.

0 голосов
/ 04 июля 2012

Существует git branch --contains (Git начиная с 1.5.7, как минимум)

0 голосов
/ 17 марта 2012

Вы можете использовать это:

# 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
0 голосов
/ 05 марта 2010

git description (или его вариант) может быть тем, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...