在 bash 脚本中,我正在等待释放特定的远程 git 标签,然后再在我的脚本中使用它。
在执行 git checkout $tag
命令之前,如何检查间隔循环中是否存在标签?
前任:
while sleep 3; do git fetch && git rev-parse --verify <tag> && break; done
编辑
我创建了以下 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
无法做到这一点?
git rev-parse
来检查标签是否存在的天气:
git rev-parse -q --verify "refs/tags/$tag" >/dev/null
在您提到的循环中,结合git checkout
它可能看起来像这样:
tag="foo"
while true; do
git fetch --all
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then
git checkout "$tag" && break
fi
sleep 5
done
在这种情况下,您确实必须传递一个标签名称作为$tag
- 没有提交哈希或分支。
git rev-parse
来检查标签是否存在。 像这样:
while :; do
git remote update
git rev-parse --verify --quiet SomeInterestingTag && break
# the tag did not exist
sleep 10
done