Несколько тегов могут указывать на один коммит, но git describe --abbrev=0 --tags
будет показывать только один. Вот демо.
$ git describe --abbrev=0 --tags
fatal: No names found, cannot describe anything.
$ git tag foo
$ git describe --abbrev=0 --tags
foo
$ git tag bar
$ git describe --abbrev=0 --tags
bar
git tag --points-at HEAD
покажет все теги, которые указывают на текущий коммит.
$ git tag --points-at HEAD
foo
bar
Как будет git log --decorate
$ git log --decorate
commit 8ce1cfebecda68ba42226d0e6cd5dbebba76ae0b (HEAD -> master, tag: foo, tag: bar)
Author: Michael G. Schwern <schwern@pobox.com>
Date: Thu Apr 4 09:39:34 2019 -0400
first commit
Это можно сделать по умолчанию в вашем .gitconfig
, я рекомендую это.
[log]
decorate = short
Ваша программа всегда будет помечать тегами, потому что -z
ищет строку null , она все равно будет срабатывать при ""
. Вы можете использовать -n
для поиска непустой строки и перевернуть логику.
NEEDS_TAG=`git describe --contains HEAD 2> /dev/null`
#only tag if no tag already (would be better if the git describe command above could have a silent option)
if [ -n "$NEEDS_TAG" ]; then
echo "Already a tag on this commit"
else
echo "New tag"
fi
Обратите внимание на использование 2> /dev/null
для подавления вывода ошибок.
Но безопаснее вместо этого полностью игнорировать вывод и проверить значение выхода.
if `git describe --contains HEAD 2&>1 > /dev/null`; then
echo "Already a tag on this commit"
else
echo "New tag"
fi
Обратите внимание, что избыточно искать хеш коммита для HEAD.