我的本地 mercurial 存储库中有一些 pretxncommit 钩子,这些钩子用于检查提交消息是否包含对票证的引用和其他一些健全性检查。
我的问题是,当我尝试使用 mercurial 队列时,诸如qnew尝试运行这些钩子之类的命令并且票证检查失败之一,我看到了相同的问题histedit和类似的扩展。
为什么使用这些命令执行 pretxncommit 钩子?他们是否运行某种内部提交?
如何使这些钩子仅在提交时运行?
我的本地 mercurial 存储库中有一些 pretxncommit 钩子,这些钩子用于检查提交消息是否包含对票证的引用和其他一些健全性检查。
我的问题是,当我尝试使用 mercurial 队列时,诸如qnew尝试运行这些钩子之类的命令并且票证检查失败之一,我看到了相同的问题histedit和类似的扩展。
为什么使用这些命令执行 pretxncommit 钩子?他们是否运行某种内部提交?
如何使这些钩子仅在提交时运行?
是的,一个 qnew 创建一个真正的提交,从而调用所有相关的提交钩子。您可以通过在应用 MQ 补丁并查看日志时暂时禁用 MQ 自己确认这一点。
没有办法让 pretxncommit 钩子只适用于一些命令,除非用其他钩子来临时装配一些东西:
$ cat .hg/hgrc
[hooks]
pre-qnew = touch .hg/skiphook
post-qnew = rm .hg/skiphook
pretxncommit = test -e .hg/skiphook || echo not skipping
$ hg rm README # make some change
$ hg qnew asdf # no hook
$ hg qpop
$ hg rm README
$ hg ci -m asdf
not skipping
在这里,我们的 pretxncommit 钩子确保特定文件在运行其(普通)钩子之前不存在,并且 pre-/post-qnew 钩子创建文件并清理它。
https://stackoverflow.com/a/19349636/350713abort_commit_to_wrong_branch中的函数
显示了一种仅在“真实”提交而不是 MQ 提交上运行挂钩的方法。这个想法是检查._committingpatchrepo
如果repo具有“_committingpatch”属性,则它是一个正在进行的 MQ 提交。相关线路是
if hasattr(repo, "_committingpatch"):
newcommit这在
http://hg.intevation.org/mercurial/crew/file/7032dcff290c/hgext/mq.py#l293中的函数中提到
或者(也许是谵妄)——当你使用 MQ 时,你总是使用 qtip,不是吗?
>hg parents
...
tag: qtip
tag: tip
..