簡體   English   中英

在執行git checkout $ tag命令之前,如何檢查間隔循環是否存在標簽?

[英]How can I check in interval loop if the tags exist before doing the `git checkout $tag` command?

在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來檢查標簽是否存在。 像這樣:

while :; do
  git remote update
  git rev-parse --verify --quiet SomeInterestingTag && break

  # the tag did not exist
  sleep 10
done

您可以使用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傳遞-沒有提交哈希或分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM