2011-03-31 96 views
22

如果遠程存儲庫中有標籤,我通常會在拉動時自動獲取它們。當我刪除創建的本地標籤(git tag -d <tag-name>)並拉出時,刪除的標籤將被重新創建。我可以刪除遠程分支機構/標籤(git push <remote-branch/tag-name>:<branch/tag-name>),但是我怎樣才能通過獲取遠程標籤來檢測本地標籤是否已創建?Git:區分本地和遠程標籤

+2

如果你在一個友好的地方,標籤會被標註,而你從其他地方獲取的標籤通常會有不是你的作者。 – Cascabel 2011-03-31 16:14:35

回答

27

如果您對運行git pull時重新創建的這些標籤感到惱火,您可以使用remote.<remote-name>.tagopt配置設置在默認情況下關閉標籤的抓取。例如如果遙控器origin,那麼你可以做:

git config remote.origin.tagopt --no-tags 

更新:解決您的意見,我認爲這是有沒有一個明顯的方式告訴大家,創建一個標籤之間的差異的原因本地和從遠程獲取的一個。標籤也沒有reflog。所以,我的建議是禁止自動獲取標籤 - 然後您可以將它們自己獲取到不同的名稱空間中。例如,你可以這樣做:

git fetch origin +refs/tags/*:refs/tags/origin/* 

...並且可能爲此創建一個別名。然後,當您要抓取標籤時,它們將被命名,例如,refs/tags/origin/tag1而不是refs/tags/tag1


如果你想這個自動發生,你可以改變你的.git/config列出多個refspecs用於獲取,例如:

[remote "origin"] 
     url = [email protected]:whatever.git 
     fetch = +refs/heads/*:refs/remotes/origin/* 
     fetch = +refs/tags/*:refs/tags/origin/* 

...這是suggested in Pro Git

+0

我不想關閉抓取標籤,我想檢測一個本地可用的標籤是通過抓取還是手動創建的。 – Mot 2011-03-31 12:23:29

+1

@mklhmnn:我的想法是,您可以禁止自動獲取標籤,然後當您想要遠程標籤時,將它們獲取到不同的名稱空間中。我用一個例子更新了我的答案。 – 2011-03-31 12:48:59

+1

@Mark:我發現這個方法比我的要多得多,在提取時按名稱空間分隔標籤。我會+1,但我已經做過編輯之前;) – VonC 2011-03-31 13:33:25

10

標記不是「本地」或「遠程」的:它與一個提交相關聯,該提交可以是多個分支的一部分,包括遠程名稱空間中的一部分。上提交的由標籤

git show -s 'TAG_NAME^{commit}' --format='%H' 

參考,並做

獲取標記SHA1一個:

git branch -a --contains SHA1 

如果你看到

remotes/aRemoteRepoName/aBranch 

你知道標記引用提交您已從遠程回購獲取。

由於Chris提到:

git branch -a --contains TAGNAME 

將間接引用的標籤,並給出了一氣呵成的答案。

+2

爲什麼不在一個命令中:'git branch -a --contains'TAG_NAME^{commit}'? – 2011-03-31 07:35:45

+1

再想一想,'--contains'會自動取消引用已命名的對象,所以不需要手動指定取消引用。只要'git branch -a --contains TAG_NAME'按預期工作即可。 – 2011-03-31 07:42:15

+1

@Chris:好點,我已經將它包含在答案中。 – VonC 2011-03-31 08:02:44