2012-04-12 87 views
3

我想在使用hg tag XXX時自動修改我的項目版本。如何在提交標記之前提交文件?

我已成立了一個pretag鉤在我的hgrc(注:我已刪除,以確保它輸出到汞根版本,清晰的東西):

[hooks] 
pretag.bump_version = (echo "$HG_TAG" > VERSION; hg commit -m "Updated VERSION to $HG_TAG" VERSION) 

當我創建一個新標籤:

$ hg tag 1.1 

我得到的錯誤:

warning: ignoring unknown working parent <revision_id>! 

我可以用一個標籤鉤代替,其成功s,但是那麼版本號比標籤晚了一個版本:這意味着更新到已標記的版本,然後構建將導致產品的版本號(取決於VERSION文件)將不正確。

有沒有更好的方法來處理這個問題?我已經看過SO question #2558531,但是每次更新版本號:我只想在之前更新版本號我標記存儲庫。

回答

3

切換到pre-tag而不是pretag掛鉤。鉤子pretag是一個特別的鉤子,它意識到你正在標記。相比之下,pre-tag掛鉤是一個通用的pre-*鉤子,它在標籤命令啓動之前運行,並且完全不知道它是標記 - 這意味着它也可以更早運行。 (甚至有一些預設的鉤子,例如,pre-log)。

我得到了你的例子是這樣的工作:

[hooks] 
pre-tag.bump_version = echo $HG_ARGS > VERSION; hg commit -m "updated version to $HG_ARGS" VERSION 

使用命令行只是看上去像:

[email protected]:~$ hg init tagtest 
[email protected]:~$ cd tagtest 
[email protected]:~/tagtest$ echo text > VERSION 
[email protected]:~/tagtest$ hg commit -A -m initial 
adding file 
[email protected]:~/tagtest$ hg tag --config hooks.pre-tag='echo $HG_ARGS > VERSION; hg commit -m "updated version to $HG_ARGS" VERSION' 1.1 

通知我的說法切換到$HG_ARGS因爲它是一個pre-*命令那不知道我們正在標記。詳細信息位於hgrc聯機幫助頁面中。

另請注意我在提交時只提交了VERSION文件,因爲它明確命名。您不希望意外地提交一大堆調試內容,這些調試內容只是因爲您已標記而從以前的提交中排除。

+0

謝謝瑞安。是的,我只是提交VERSION文件,但是當我在這裏輸入時,它被簡化了。 – 2012-04-12 14:09:22

+0

很酷。您可能會注意到,'tag'命令也在'$ HG_ARGS'變量中結束。如果這是個問題,你可以使用'$ {HG_ARGS#tag}'來代替它。這是一場深奧的魔術。 – 2012-04-12 14:39:32

+0

超級。我剛剛提出了'set-junk $ HG_ARGS',然後使用'$ 3'作爲標籤。你看起來更好,但在標籤值之前留下一個空格。 – 2012-04-12 22:26:09