我認爲你是對的要謹慎。機器人並不總是最好的公民,而且往往可以做一些愚蠢的事情。
你最終做取決於你所看到的正在使用的標籤。例如,如果你只看到CI系統使用它們,那麼我建議讓它們保持本地化。根本沒有拉/推/合併問題。
有些標籤可能是重複的 - 即最新的穩定。我並不關心在這種情況下哪個構建被標記,但我不想要任何衝突,因爲腳本無法解決這些問題。
如果標籤已經被定義了,你再打電話hg tag
,它將除非你強迫它失敗了,但這樣做是添加相同標籤的更新,之後的定義,以及最新的1個勝場。一方面,這是好的,因爲合併是簡單的,但想想的情況下,當你做:
hg update -r latest-stable
hg update -r latest-stable
hg update -r latest-stable
hg update -r latest-stable
每次都會更新到版本標籤製作前,你會得到一個版本(正常),並在該版本latest-stable
將指向前latest-stable
。結果是,這個命令序列會讓你回到過去。
因此,我認爲最好是在兩次提交中擁有唯一標籤(即stable-2013-02-18
)或標籤;一個刪除舊標籤,另一個添加新標籤。
hg update -r latest-stable # You're now at the commit that removed the tag.
hg update -r latest-stable # This one will error because tag doesn't exist
標籤原因提交。然而,這意味着這些提交需要被推送,並且他們需要在面對人類和其他腳本的同時推送時保持健壯。特別是,自動推動可以創建額外的頭,這是不好的。但是,當檢測到額外的頭部(在推送處)時,本地標籤提交已經發生,並且即使新的頭部可能可以輕易合併,但有時標籤會引起衝突。
CI機器人應該tag; pull; merge (if necessary); push
。如果合併失敗,請不要按下,發出警報。如果推送失敗(即合併花費的時間有更多變更集),請再次進行提取和合並。我只是確保你的腳本對它正在合併的修訂非常明確。這個過程應該讓你沒有額外的頭。
我相信水銀對待.hgtags
文件不同的合併,因爲它知道的內容,這樣的衝突應該是非常罕見的。此外,標籤提交通常很容易合併,因爲所有更改都是.hgtags
,所以CI頭的合併不應該發生衝突。唯一的原因是因爲其他人使用與CI服務器相同的標籤名稱,如果他們這樣做,那麼他們需要在他們的鍵盤上澆注蜂蜜,以便他們可以做更多的損害。
我可以看到導致問題的情況是,如果你在同一個標簽名多頭做CI標記。例如開發和發佈分支都在它們上面運行CI,兩者都分配了tests-clean
標籤,但對於不同的修訂版本,稍後進行合併。解決方案是,不要這樣做。
希望其中的一些是有幫助的。
我不能很好地讓他們當地的CI在執行許多建立在並行 - 即有許多CI回購。我想我可以有一箇中間的「緩衝」回購,但這使得推/拉的故事變得更加複雜(例如,他們仍然需要相互合併)。另外,開發人員很清楚哪些變更集是在哪裏生存的 - 而且花費所有這些努力讓基礎架構運行並將其全部納入保護範圍是一件恥辱,但不要走到最後一公里並實際傳達此信息。 – 2013-02-19 10:15:17
當你去'hg update latest-stable'時,mercurial不會看*工作拷貝*標籤,而是看所有頭部標籤的聯合。因此,迭代'hg update latest-stable'命令沒有問題 - 工作正常。 – 2013-02-19 10:57:37
至於合併:.hgtags只是追加,這意味着_every_標籤更改衝突 - 不僅僅是對同一個標籤的更改!所以各種CI建設者會相互衝突;並且如果其他人添加了一個不相關的標籤也會發生衝突。實際上,這意味着每個標籤編輯都需要可序列化,並且全局原子*可以讓微不足道的自動更新工作。 – 2013-02-19 11:09:27