在SO上有數百個Git標籤問題,但我找不到這個問題。如何將本地標籤鏡像到遠程
如何鏡像我的本地git標籤到遠程。
即:
- 不管的
origin
- 原來的狀態,我想有這反映當地所有的標籤和遠端的bash的功能是什麼。
- 這包括如果標記已創建,刪除或本地移動,則進行同步。
這個腳本的反面是隨處可見的,但是對於這個方向我找不到任何東西。
git tag -l | xargs git tag -d
git fetch --tags
在SO上有數百個Git標籤問題,但我找不到這個問題。如何將本地標籤鏡像到遠程
如何鏡像我的本地git標籤到遠程。
即:
origin
這個腳本的反面是隨處可見的,但是對於這個方向我找不到任何東西。
git tag -l | xargs git tag -d
git fetch --tags
第1部分相對容易,第2部分不太容易,第3部分通常是不可能的,因爲沒有足夠的信息記錄。
這裏是一個例子。您檢查存儲庫L(您在本地),並找到標記T1存在,T2不存在,T3存在。
您現在檢查庫Ø,一個在大號的起源,發現標籤T1,T2和T3存在。
裏面居然發生了:「標籤T2並在大號存在並已明確地刪除」或「標籤T2從來沒有在大號存在,但以某種方式加入Ø」?
因爲Git不會保存此類型的數據,也沒有辦法告訴T2是否被顯式刪除,或者只是從來沒有回升。
如果你的要求是簡單的,如果你不小心T2是否加入Ø,你只需要做出Ø有大號的標籤,無論爲什麼大號有那些標籤而不是其它的標籤,那麼所有你需要做的是兩個腳本做同樣的事情,但在其他方向:第一,刪除所有的標籤(但Ø,而不是大號),和然後將所有標籤從O到L,git push --tags
或同等學歷。
這是最簡單的託管Ø自己的機器上刪除Ø的標籤,但假設你是不是擔心原子性的問題,你可以從大號做到這一點:
git ls-remote origin 'refs/tags/*'
(這將讓你所有的都在origin
標籤),則:
git push --delete origin refs/tags/T1 refs/tags/T2 ...
(重複所有標籤),則:
git push --tags origin
注意git ls-remote
同時顯示了標籤的對象名稱和它們的最終目標對象:
7446b8fa5ead8ce0990e8f2be3a2490eac8e199f refs/tags/v2.9.0
05219a1276341e72d8082d76b7f5ed394b7437a4 refs/tags/v2.9.0^{}
7590ed7abf57429b36761c00377a3648630029bd refs/tags/v2.9.0-rc0
3a0f269e7c82aa3a87323cb7ae04ac5f129f036b refs/tags/v2.9.0-rc0^{}
c93578b0c65ac46bb6bba0750542798518f09335 refs/tags/v2.9.0-rc1
60bd4b1c513bb652cdffad44382046ca872140eb refs/tags/v2.9.0-rc1^{}
因此這就需要過濾的一點點;如果您可以強制推送覆蓋標籤,您可以通過使用+refs/tags/*:refs/tags/*
作爲主refspec進行推送,並使用一些:refs/tags/xyz
輔助參數來刪除任何「無關」標籤(例如上面示例中的T2
),從而提高效率。這需要一個稍微聰明的腳本。啞而簡單的方法是隻打印無後綴的標籤,例如:
git ls-remote origin 'refs/tags/*' | awk '/\^{}$/ { next } { print $2 }'
,你可以再管xargs git push --delete origin
。