2010-11-12 97 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”