18

コミットされたファイル内の文字列を検索し、見つかった場合はコミットを停止する pre-commit フックを設定するにはどうすればよいですか?

4

3 に答える 3

24

Mercurial bookの第 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]$'探している文字列に変更するだけです。

于 2010-11-12T17:13:58.023 に答える
5

ところで、Windowsでは使用できます

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

ソースに文字列「NOCOMMIT」が含まれている場合、このフックは失敗します

于 2014-01-27T15:00:23.117 に答える
5

Ry4anの答えはほぼ正しいです:)しかし、「hg export tip」を「hg diff」に置き換える必要があります。
ヒントは最後にコミットされた変更セットですが、ローカルのコミットされていない変更に関心があるため、必要なものは diff です。私のニーズのために、hgrcに以下を追加しました

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

-S にはサブリポジトリが含まれます (必要ないかもしれませんし、まだバグがあるかもしれません)。
grep -v '^-' は、削除された行を示す行を差分から削除します。-q を削除したので、少なくとも何を削除すればよいかはわかりますが、残念ながら、この方法では発生したファイルと行番号を出力できません (パイプされているため)。誰かがそれを行うより良い方法を持っているかもしれません。

于 2011-03-03T09:56:46.873 に答える