You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python编写Mercurial钩子防止未指定文件提交

解决Mercurial全局提交确认钩子的问题

核心方案:用Mercurial内置的ui.cmdargs获取提交参数

不用折腾sys.argv或者环境变量,Mercurial的钩子函数里可以直接通过ui对象的cmdargs属性拿到用户在hg commit之后输入的所有参数——也就是指定的文件/路径列表。如果这个列表为空,就说明用户执行的是全局提交。

完整钩子实现示例

  1. 在仓库的.hg/hgrc中添加钩子配置:
[hooks]
pre-commit = python:hooks.check_global_commit
  1. 在仓库的.hg/hooks.py中编写钩子函数(没有这个文件就新建):
def check_global_commit(ui, repo, **kwargs):
    # 检查是否有指定提交文件
    if not ui.cmdargs:
        # 询问用户确认
        confirm = ui.prompt("你正在执行全局提交,是否继续?(y/N)", default='N')
        if confirm.strip().lower() != 'y':
            ui.warn("提交已取消\n")
            # 返回非0值阻止提交
            return 1
    # 允许提交
    return 0

关键细节说明

  • ui.cmdargs:直接返回hg commit命令后的所有参数,已经过滤掉了hg、commit本身,仅保留用户指定的文件/路径,比sys.argv更精准。
  • ui.prompt():Mercurial内置的交互方法,能在命令行和其他Mercurial支持的环境中正常工作,比自己用input()更兼容。
  • 返回值:钩子函数返回0表示允许提交,非0值会直接阻止提交。

关于Mercurial API文档

Mercurial的内置API可以通过命令行查看:hg help api,里面会列出ui、repo等核心对象的可用方法和属性。另外也可以直接查看Mercurial源码中的对应模块(比如mercurial/ui.py),源码里的注释会更详细。

内容的提问来源于stack exchange,提问作者Le Laboureur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:08:21