2017-05-15 53 views
3

如何在不推送輕量級標籤的情況下將所有帶註釋的標籤從本地回購站推送到遠程站點?如何推送所有帶註釋的標籤?

我在本地使用我不想推送的輕量級代碼,所以git push --tags不是解決方案。

我知道git push --follow-tags,但只會推送與當前正在推送的提交相關聯的標籤。

我需要這個選項,因爲我的正常工作流程涉及時常推送,但只有在最終確定發佈時進行標記,而且有時會忘記推送標籤。這個問題通常很久沒有被發現,並且與其他開發者有點混淆,因爲我們與我們的標籤不同步。

由於它的複雜,列出其註釋標籤在本地,不存在遠距離,我想只需按下所有本地附註的標籤來解決這個問題,這將保證所有開發人員的本地和遠程的回購協議來註釋相同標籤。

回答

4

這並不難。首先找到所有帶註釋的標籤(通過拒絕直接指向提交的標籤而不是註釋標籤對象)。這是一個有點長,所以你可能希望把它寫成一個shell函數:

list_annotated_tags() { 
    git for-each-ref --format '%(objecttype) %(refname)' refs/tags | 
     while read reftype refname; do 
      case $reftype in tag) echo $refname;; esac 
     done 
} 

看了上面的輸出,並把它們作爲的Refspec參數傳遞給git push命令:

git push origin $(list_annotated_tags) 

和您的腳本已完成。

1

我注意到我的輕量級標籤不包含taggerdate。在這種情況下,這將在命令行或腳本工作:

taglist=`git for-each-ref refs/tags --format '%(refname:short) %09 %(taggerdate:short)' | \ 
grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' | \ 
cut -f 1 | \ 
tr '\n' ' '` 

依次爲:

git push origin $taglist 

命令彙總,任何人誰是有興趣

  • 第一行 - 檢索git for-each-ref標籤列表,格式化爲顯示標籤名稱,選項卡和日期。 (只有帶註釋的標籤纔會有日期。)
  • 第二行 - grep命令搜索第一個命令的結果,只提取那些帶日期的標籤。
  • 第3行 - cut命令刪除最初列後面的所有內容(即從每個標記名後面的標籤前到結束每個結果行的newline)。
  • 第4行 - tr命令用最後結果中的空格替換newline。 (該標記名現在在一行上,用空格分開。)

結果存儲在變量中(taglist - 注意在整個命令集的開始和結束之後的taglist=反引號)。

最後,您將標籤列表推送到原點(使用$表示taglist是變量)。