Mercurial pre commit hook

dan*_*car 16 mercurial

如何设置预提交挂钩,将在已提交的文件中搜索字符串,如果找到则停止提交?

Ry4*_*ase 21

第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'
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们引入了一个简单的pretxncommit钩子来检查尾随空格.这个钩子很短,但不是很有帮助.如果更改将带有尾随空格的行添加到任何文件,但它不会打印任何可能有助于我们识别有问题的文件或行的信息,则会以错误状态退出.它还具有不注意未修改线条的好处; 只有引入新尾随空格的行才会导致问题.

只需将正则表达式更改为'^\+.*[ \t]$'您要查找的任何字符串.

  • 对不起,这不是你的一杯茶@jheriko.如果您添加适用于所有平台的答案,我很乐意投票.我在高unix能力环境中工作了20年,它绝对是我认为容易的颜色. (4认同)

Jon*_*nas 5

Ry4an的答案几乎是正确的:)但你需要用"hg diff"替换"hg export tip".
tip是最后提交的变更集,但对本地未经修改的变更感兴趣 - 所以diff是你需要的.为了我的需要,我将以下内容添加到我的hgrc中

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

-S包括subrepos(maye不需要,可能还有bug).
grep -v'^ - '从diff中删除指示已删除行的行.我删除了-q,所以我至少有一个想法删除的内容,但不幸的是这种方法无法打印您的发生的文件和行号(因为它是管道).也许某人有更好的方法来做到这一点.

  • 我支持我的回答.:)本地更改已经在`pretxncommit`本书运行时提交了 - 它在工作之后但在事务提交之前,所以`hg export tip`工作正常,并且当钩子说不时它会回滚. (2认同)

Iva*_*kov 5

顺便说一句,在Windows上你可以使用

[hooks]
pretxncommit.nocommit = hg export tip | findstr NOCOMMIT && EXIT /B 1 || EXIT /B 0
Run Code Online (Sandbox Code Playgroud)

如果源包含字符串"NOCOMMIT",则此挂钩将失败