Git не удалось обновить тег с помощью fatal: тег 'v0.0.8' уже существует - PullRequest
1 голос
/ 04 апреля 2019

Git не удалось обновить тег с помощью fatal: тег 'v0.0.8' уже существует

Это вывод моей команды.Он должен обновиться с последней версии v0.0.8 до v0.0.7.

 ./archive/tag_git_repo.sh
Updating v0.0.7 to v0.0.8
[feature/Jenkinsfile 76c4601] Updating v0.0.7 to v0.0.8
fatal: cannot describe '76c4601af575392eec851e4f86bb12f3e2f849b3'
Tagged with v0.0.8 (Ignoring fatal:cannot describe - this means commit is untagged)
fatal: tag 'v0.0.8' already exists
Everything up-to-date

Это исходный код скрипта:

$ cat archive/tag_git_repo.sh
#!/bin/bash

#fetch all tags!
git fetch --tags

#get highest tag number
VERSION=`git describe --abbrev=0 --tags`

#replace . with space so can split into an array
VERSION_BITS=(${VERSION//./ })

#get number parts and increase last one by 1
VNUM1=${VERSION_BITS[0]}
VNUM2=${VERSION_BITS[1]}
VNUM3=${VERSION_BITS[2]}
VNUM3=$((VNUM3+1))

#create new tag
NEW_TAG="$VNUM1.$VNUM2.$VNUM3"

echo "Updating $VERSION to $NEW_TAG"
git commit --allow-empty -m "Updating $VERSION to $NEW_TAG"

#get current hash and see if it already has a tag
GIT_COMMIT=`git rev-parse HEAD`
NEEDS_TAG=`git describe --contains $GIT_COMMIT`

#only tag if no tag already (would be better if the git describe command above could have a silent option)
if [ -z "$NEEDS_TAG" ]; then
    echo "Tagged with $NEW_TAG (Ignoring fatal:cannot describe - this means commit is untagged) "
    git tag $NEW_TAG
    git push --tags
else
    echo "Already a tag on this commit"
fi

Вы видите, что я получилпоследние теги, и он показывает v0.0.8, но все еще показывает v0.0.7 в качестве текущего тега хранилища.

$ git fetch --tags
$ git describe --abbrev=0 --tags
v0.0.7

$ git tag
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v0.0.8
$ git describe --tags
v0.0.7-3-g76c4601

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Несколько тегов могут указывать на один коммит, но 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.

0 голосов
/ 04 апреля 2019

С одной стороны, describe без явного ссылки подразумевает HEAD, так что это означает, что тег v0.0.8 существует в хранилище, но не , достижимый из HEAD.

Это означает, что этот тег последней версии находится на ветви, которая еще не была объединена с текущей веткой.

Трудно сказать намного больше, не зная о вашей древовидной структуре.

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