Теги списка, содержащиеся в ветке
Как я могу перечислить теги, содержащиеся в данной ветке, напротив:
git tag --contains <commit>
Какие "только теги списка, которые содержат указанную фиксацию".
Если что-то вроде этого не существует, как я могу проверить, содержит ли коммит другой фиксатор, чтобы я мог script это?
Я мог бы сделать это:
commit=$(git rev-parse $branch)
for tag in $(git tag)
do
git log --pretty=%H $tag | grep -q -E "^$commit$"
done
Но я надеюсь, что есть лучший способ, поскольку это может занять много времени в репозитории с большим количеством тегов и коммитов.
Ответы
Ответ 1
Это может быть близко к тому, что вы хотите:
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).
Ответ 2
git tag --merged <branch>
На странице man:
--[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 по этому вопросу, я решил, что брошу его для всех, кто прокручивается вниз, и ищет ответ, который требует меньше ввода текста, чем принятый ответ (и для моей собственной справки, когда я забываю этот ответ снова на следующей неделе).
Ответ 3
чтобы просмотреть все теги, доступные в текущей ветке:
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:]]*##'
Ответ 4
У меня недостаточно репутации, чтобы комментировать сообщения других людей, но это ответ на ответ и его комментарии на fooobar.com/questions/138163/.... Чтобы показать все теги, доступные для текущей ветки, включая тег для фиксации 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
Ответ 5
Здесь я перечисляю аннотированные теги, соответствующие шаблону (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
Это не сработает, если несколько тегов, соответствующих шаблону, указывают на одно и то же commit. Для этого вот еще один рецепт, который использует 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
Ответ 6
git описать (или его вариант) может быть тем, что вы ищете.
Ответ 7
Вы можете использовать это:
# 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
Ответ 8
Существует git branch --contains
(Git с 1.5.7, по крайней мере)
Ответ 9
Эффективен для большого количества тегов и обеспечивает легкую гибкость формата:
{ 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 }
'
который получает все ссылки ref, добавляет refs/tags
в f-e-r, чтобы ограничить его.