2016-11-29 53 views
4

我希望用戶創建的所有標籤都被驗證(並在必要時重命名)以滿足我們的規則。
例如,如果用戶已創建"v1.2.3"標記,則應將其自動更名爲"v1.02.03"如何使用git鉤子自動重命名標籤?

不幸的是,沒有git掛鉤存在正在被git tag命令調用。

這就是爲什麼我實現了pre-push掛鉤,它會刪除舊標籤並在同一提交中創建一個新標籤(使用修改後的名稱)。

問題是,git push --tags將舊標籤發送到遠程回購而不是新標籤(儘管舊標籤在預推鉤已經刪除後不再存在)。

如何在推送到遠程回購之前自動重命名本地回購標籤?


編輯:
我通過在服務器端複製標籤重命名邏輯來post-receive鉤解決我的問題。
至今爲止,標籤「v1.2.3」在客戶端被pre-push掛鉤重命名爲「v1.02.03」,但舊標籤名稱(「v1.2.3」)被推送到遠程倉庫,並在遠程倉庫「通過post-receive鉤子再次將v1.2.3「重命名爲」v1.02.03「。現在客戶端和服務器都重新命名了標籤。

我應該說我對我的解決方案感到不滿嗎?
純客戶端解決方案仍然受歡迎。

+0

在我看來,這似乎是標籤沒有正確刪除的情況。你能在這裏分享預推鉤的代碼嗎? –

+0

@mu - 標籤被正確刪除,我看到鉤子打印的成功操作信息。我的代碼包含以下行:'os.execute('git tag -d''..tagname ..''&& git tag''..new_tag_name ..'''..commit ..'&& echo TAG RENAMED | |迴應失敗重新標記')'。我看到它們在'git push --tags'完成後實際上被刪除了。 –

回答

0

您可以在客戶端映射到pre-push鉤子,並在此處爲您的企業重命名本地標籤。

+0

預推送掛鉤正在客戶端執行,因爲它應該按照git手冊執行。你在說什麼地圖? –

+0

只需在該鉤子上重命名標籤,然後他們有機會被推送。 – blue112

+0

這就是我所做的。我在該鉤子上重命名了標籤。 –

2

不是核心的git專家,但這裏是我的假設:當您使用--tags標誌時,在執行掛鉤之前,所有的ref都已存儲在內存中。從聯機幫助頁混帳推:

--tags 
     All refs under refs/tags are pushed, in addition to refspecs explicitly listed on the command line. 

由於裁判在內存中已經存在,你推前鉤改變標籤名稱/刪除和創建新的標籤沒有任何效果。

IMO,爲了照顧這種情況,如果在更改所有標籤名稱後,即使一個標籤命名錯誤,也可以簡單地修改預推鉤以使其失敗。之後,再次運行預推。

或者,您可以有一個自定義命令 - 一個git別名,根據您的要求重命名所有標記,並且調用git push --tags。檢查How to embed bash script directly inside a git alias

+0

失敗'git push'並強制用戶再次推送是一個非常糟糕的解決方案。 –

+0

@EgorSkriptunoff是的,這是一個可憐的黑客。雖然Git別名可以爲你解決這個問題。 –

+0

你是否建議創建一個自定義的git命令並**教**所有的開發者使用它?這根本不是解決方案。標記重命名必須是完全自動的。 –