如何在git checkout之前等待标签?

时间:2019-02-11 22:48:51

标签: git

我创建了以下bash函数:


function wait_for_tag() {
  tag=v${1#v}
  interval=${2:-20}
    while :; do

        echo "Waiting for tag ${tag}..."
        git remote update > /dev/null 2>&1
        git rev-parse --verify --quiet "${tag}" && break
        sleep ${interval}
    done
}

function git_checkout() {
  tag=v${1#v}
    is_release && wait_for_tag "${tag}"
    git checkout ${tag} || echo "testing"
    npm install
}

我希望在执行git_checkout v2.0.13-bs-redux-saga-router-dom-intl时签出该标签是否已经存在,否则,将获取新标签并稍后再试。

这似乎在本地环境中很好用,但是当我在Gitlab-CI中这样做时,即使并行管道被标记并存在于Gitlab UI上,并行管道也永远不会看到新标记。

如何确保wait_for_tag函数确实能检索标签,为什么git remote update不能做到这一点?

1 个答案:

答案 0 :(得分:4)

TL; DR:尝试git fetch --tags


首先,git remote update或多或少地运行git fetch。唯一的特别之处是,如果您有多个遥控器(originupstream等),它将运行个以上 git fetch。所获取的特定远程集是可配置的,因此,如果您的CI系统配置了它的Git,则需要查看它已设置了什么配置。 (如果您只有一个遥控器,origingit remote update可能会设置为从该遥控器获取,因为其他任何设置都几乎是疯狂的。)

与此同时,git fetch remote从命名的 remote 获得新的提交和引用。所使用的引用的特定集合是可配置的,它影响哪些提交被拾取以及哪些标签被拾取(如果有)。因此,如果您的CI系统配置了它的Git,则需要查看它已设置了什么配置。如果使用浅分支和/或单分支克隆,则可能永远无法获得该标签。

或者,您可以将git fetch命令与refspec一起使用:

git fetch origin '+refs/tags/*:refs/tags/*'

或:

git fetch origin +refs/tags/$tag:refs/tags/$tag

强制其尝试获取一个特定标签。 +的意思是覆盖我当前存在的同名标签(如果存在),因此,如果您不希望发生这种情况,请忽略它。

最后,请注意,git fetch --tags与对您的提取添加 refs/tags/*:refs/tags/*具有相同的作用。这与 writing 并不完全相同:

git fetch origin 'refs/tags/*:refs/tags/*'

,因为最后一个变体(带有显式refspec)将覆盖隐含的refspec。 (解释最后一句话超出了此答案的范围。)

请注意,此变体使用前导+。但最后:

git fetch --tags

可能是最简单,最简单的方法。