Git无法使用致命错误更新标签:标签“ v0.0.8”已存在

时间:2019-04-04 13:20:34

标签: git

Git无法使用致命错误更新标签:标签'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 个答案:

答案 0 :(得分:2)

多个标签可以指向一个提交,但是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的提交哈希是多余的。

答案 1 :(得分:0)

一方面,describe没有给出明确的引用就意味着HEAD,因此这意味着标记v0.0.8存在于存储库中,但不可可访问来自HEAD

这意味着最后一个版本标记位于尚未合并到当前分支中的分支上。

在不知道您的树结构的情况下很难说很多话。