2010-11-12 98 views
14

如何設置預提交鉤子,它將在提交的文件中搜索字符串,如果發現停止提交?Mercurial pre commit hook

+0

在我看來,這將不利於分散倉庫的概念將會失敗。您的存儲庫可能會被克隆到其他系統的不同系統中,並且您的腳本可能無法在此工作。也許預先推鉤會更好?我有興趣聽到你的問題的答案。 – 2010-11-12 08:00:12

+0

我有一箇中央存儲庫,人們正在推送。我只需要確保在我推送它們之前所做的提交都是乾淨的。 – danidacar 2010-11-12 08:24:48

+0

嘗試檢查http://www.selenic.com/mercurial/hgrc.5.html#hooks – 2010-11-12 08:29:26

回答

20

the mercurial bookChapter 10覆蓋該恰好:

$ cat .hg/hgrc 
[hooks] 
pretxncommit.whitespace = hg export tip | (! egrep -q '^\+.*[ \t]$') 
$ echo 'a ' > a 
$ hg commit -A -m 'test with trailing whitespace' 
adding a 
transaction abort! 
rollback completed 
abort: pretxncommit.whitespace hook exited with status 1 
$ echo 'a' > a 
$ hg commit -A -m 'drop trailing whitespace and try again' 

在這個例子中,我們引入了一個簡單 pretxncommit鉤,用於檢查 尾隨空白。這個鉤子是 短,但不是很有幫助。如果更改將 帶有尾隨空格的行添加到任何 文件,但它不打印任何 信息,可能會幫助我們識別違規文件或行,它將退出 ,並顯示錯誤狀態。 它還有很好的屬性,不是 關注未修改的行; 只有引入新尾部 空格的行會導致問題。

只需將正則表達式從'^\+.*[ \t]$'更改爲您要查找的任何字符串即可。

+1

好的,當然我現在發現了這個例子,但它是如何工作的?爲什麼我需要 - > hg輸出提示,這是什麼回報(!egrep -q'^ \ +。* [\ t] $')? – danidacar 2010-11-12 19:40:23

+0

僅供參考,如果您沒有爲每次提交添加標籤(即通過'-A') – 2013-02-27 08:01:38

+1

這是一個對大多數開發人員來說很糟糕的例子:使用shell腳本和egrep。大多數工作環境中的開發人員對這些東西都感到不舒服 - 對於很好的近似,沒有人使用它 - 進一步沒有解釋或確定從這個例子中,哪些參數不會被傳遞到鉤子上... – jheriko 2013-09-05 15:01:50

5

Ry4an的回答幾乎正確:) 但您需要將「hg export tip」替換爲「hg diff」。
tip是最後一個提交的changeset,但對本地uncommited更改感興趣 - 所以diff是你需要的。 我需要添加以下到我hgrc

precommit.removeDebug = hg diff -S | grep -v '^-' | (! egrep '(var_dump)|(exit)|(print_r)') 

了-S包括subrepos(馬爺不需要,也可以是靜止電瓶車)。
grep -v'^ - '從diff中刪除指示已刪除行的行。 我刪除了-q,所以我至少有一個想法什麼要刪除,但不幸的是,這種方法不能打印你的文件和出現的細麻布(因爲它是管道)。也許有人有更好的方式來做到這一點。

+2

我支持我的回答。 :)本地更改已在'pretxncommit'書籍運行之前提交 - 它是在工作之後但事務提交之前提交的,因此'hg export tip'可以正常工作,並在鉤子拒絕時回滾。 – 2013-02-27 17:02:51

+0

'hg export tip'的工作正常,我同意,但純粹根據我自己非常不科學的觀察結果,'hg diff'稍微快一點。 – gzzzur 2015-05-20 09:21:33

5

順便說一句,在Windows中可以使用

[hooks] 
pretxncommit.nocommit = hg export tip | findstr NOCOMMIT && EXIT /B 1 || EXIT /B 0 

這個鉤子,如果你的源代碼中包含字符串「NOCOMMIT」