2013-03-11 159 views
0

我在使用maven發行版插件時遇到了git標籤的問題。在mvn release:perform我們已經關閉了自動推到git的,下面做是爲了建立一個新的版本:git中丟失的標籤

  1. 拉從遠程混帳回購協議的最新變化。
  2. mvn release:prepare
  3. mvn release:perform
  4. git push origin master
  5. git push --tags

這個場景的作品,提交的標籤,一切都很好。但是,在這種情況下,標籤丟失:

  1. 從遠程git倉庫中取出最新的更改。
  2. mvn release:prepare
  3. 有人推動主人的承諾!
  4. mvn release:perform
  5. git push origin master - 不工作,因爲新的承諾是,這樣
  6. git pull --rebase origin master
  7. git push origin master
  8. git push --tags

的Git指出,新的標籤已經被推,但它們不適用於我以外的其他任何人(製作版本),使用gitk時也不可見,因此在所有實際應用中,t他的標籤丟失了。

這是git中的錯誤,還是它是一個使用錯誤(我們的責任是確保在構建時沒有提交)?

回答

1

這是一個使用錯誤。標籤引用特定的提交,由其SHA1哈希標識。當您鍵入

git pull --rebase origin master 

你正在重寫歷史,這樣你的本地修改建立在遠程master分支的新狀態。您標記的提交不再存在於此歷史記錄中,但通過使用gitk --all,您應該能夠看到它們仍存在於本地存儲庫中的備用歷史記錄中。

master分支直接用於標記發佈以及爲來自多個開發人員的推送提交打開可能是錯誤的。您可以改爲爲每個版本創建一個新分支,如this workflow

+0

有沒有什麼辦法可以避免這種情況發生:一旦有人在發佈階段推送了一個提交到主服務器?或者正在向所有人發送電子郵件,警告他們不要推動任何事情來做到這一點? – Tobb 2013-03-11 14:13:34

+0

根據我編輯的答案,我建議不要使用主分支來標記發佈,至少如果有幾個人可以推送它。我不使用Maven,所以不能真正說出如何在當前的計劃中解決此問題。您可以在本地刪除標籤,並在重新綁定後重新運行Maven命令? – Ben 2013-03-11 14:27:35

0

正如在另一個答案中所說的那樣,rebase正在搞砸了歷史,所以標籤不再是它們應該存在的地方。

現在,我能夠做的,讓我的標籤:

刪除本地的Git標籤: git tag -d nameoftag

刪除遠程git的標籤(我已經推):git push origin :refs/tags/nameoftag

創建新標籤,現在在正確的地方:git tag nameoftag HEAD(HEAD可以代替sha-id)

最後推標籤:git push --tags

現在,其他人可以享受失蹤的標籤,但對未來而言,我認爲我只會發送一封我正在發佈的電子郵件,警告任何人推動東西的可怕後果。

3

正如其他人已經指出的那樣,問題是標籤不會自動更新,以指向rebase之後的新提交ID。

一個簡單的方法來避免這種情況是隻使用合併而不是rebase。然後你的提交將不會被修改,標籤仍然指向正確的提交。

對於你的間接問題:別人不會「看見」舊標籤的原因是因爲Git默認只從已提取的提交(例如,在已提取的分支上)可訪問的標籤中提取標籤。爲了讓所有的標籤使用以下命令:

git fetch --tags 

這將讓標籤,但他們仍將指向舊的(重訂之前)提交。