我创建了以下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
不能做到这一点?
答案 0 :(得分:4)
TL; DR:尝试git fetch --tags
。
首先,git remote update
或多或少地运行git fetch
。唯一的特别之处是,如果您有多个遥控器(origin
,upstream
等),它将运行个以上 git fetch
。所获取的特定远程集是可配置的,因此,如果您的CI系统配置了它的Git,则需要查看它已设置了什么配置。 (如果您只有一个遥控器,origin
,git 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
可能是最简单,最简单的方法。