2017-02-01 27 views
1

在SO上有數百個Git標籤問題,但我找不到這個問題。如何將本地標籤鏡像到遠程

如何鏡像我的本地git標籤到遠程。

即:

  1. 不管的origin
  2. 原來的狀態,我想有這反映當地所有的標籤和遠端的bash的功能是什麼。
  3. 這包括如果標記已創建,刪除或本地移動,則進行同步。

這個腳本的反面是隨處可見的,但是對於這個方向我找不到任何東西。

git tag -l | xargs git tag -d 
git fetch --tags 

回答

1

第1部分相對容易,第2部分不太容易,第3部分通常是不可能的,因爲沒有足夠的信息記錄。

這裏是一個例子。您檢查存儲庫L(您在本地),並找到標記T1存在,T2不存在,T3存在。

您現在檢查庫Ø,一個在大號的起源,發現標籤T1,T2和T3存在。

裏面居然發生了:「標籤T2並在大號存在並已明確地刪除」或「標籤T2從來沒有在大號存在,但以某種方式加入Ø」?

因爲Git不會保存此類型的數據,也沒有辦法告訴T2是否被顯式刪除,或者只是從來沒有回升。

如果你的要求是簡單的,如果你不小心T2是否加入Ø,你只需要做出Ø大號的標籤,無論爲什麼大號有那些標籤而不是其它的標籤,那麼所有你需要做的是兩個腳本做同樣的事情,但在其他方向:第一,刪除所有的標籤(但Ø,而不是大號),和然後將所有標籤從OLgit 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