3

我的本地 mercurial 存储库中有一些 pretxncommit 钩子,这些钩子用于检查提交消息是否包含对票证的引用和其他一些健全性检查。

我的问题是,当我尝试使用 mercurial 队列时,诸如qnew尝试运行这些钩子之类的命令并且票证检查失败之一,我看到了相同的问题histedit和类似的扩展。

为什么使用这些命令执行 pretxncommit 钩子?他们是否运行某种内部提交?

如何使这些钩子仅在提交时运行?

4

3 回答 3

2

是的,一个 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 钩子创建文件并清理它。

于 2011-10-05T02:23:16.660 回答
1

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中的函数中提到

于 2013-10-13T20:53:54.393 回答
0
  • pretxncommit 适用于 repo 中的所有更改(可记录)
  • 如果您想忽略 mq 操作,您可以查找变更集父项并查看它是否是 qparent/qbase 标记的后代或查看 WC。嗯。像(从头部弄脏,而不是从测试中弄脏) hg id -tr 。

或者(也许是谵妄)——当你使用 MQ 时,你总是使用 qtip,不是吗?

>hg parents
...
tag:         qtip
tag:         tip
..
于 2011-10-04T17:03:23.900 回答