【问题标题】:Reading command line arguments from Mercurial prechangegroup hook从 Mercurial prechangegroup 钩子中读取命令行参数
【发布时间】:2026-01-29 03:50:01
【问题描述】:

如果某个条件成立,我正在尝试禁止推送到 Mercurial 存储库。但是,如果用户使用push --force,则基本无论如何都会进行推送。

我知道在执行推送的机器上使用pre-push 钩子很容易做到这一点,该钩子将命令行参数传递给钩子。然而,由于钩子没有被传播,我不得不以某种方式将钩子分发给存储库的每个用户,并依赖他们不要弄乱它。

因此,我认为要走的路是在存储库服务器上设置一个prechangegroup 钩子,它检查条件并在必要时中止推送,但我无法找到获取命令行参数的方法用户从这个钩子推送时使用。有没有办法仅通过在存储库服务器上使用挂钩来完成此操作?

我知道一个可能的解决方法是使用pretxnchangegroup 挂钩,如果最新变更集的提交消息遵循某种模式,则允许推送。但是,从存储库用户的角度来看,--force 选项似乎要容易得多,因为它不会强迫他们潜在地进行虚拟提交以获取正确的消息。

【问题讨论】:

    标签: mercurial mercurial-hook


    【解决方案1】:

    抱歉,--force 命令行选项从未通过网络发送,因此它在服务器端根本不可用。你需要想办法表达“我是认真的!”带外,可以是特殊的用户名、特殊的提交消息等等。

    考虑只拥有一个没有禁止钩子的第二个服务器端存储库,并且只有在他们真正的意思时才让推送者使用它。比如:

    hg push http://your-server/repo
    .. rejected due to hook failure
    hg push http://your-server/repo-and-I-really-mean-it
    

    在服务器端,repo-and-I-really-mean-it repo 没有钩子并自动推送到普通 repo。

    【讨论】:

    • 我也很担心,但你的选择很有趣。谢谢!
    • 你将如何设置 repo-and-I-really-mean-it 以绕过普通 repo 中的钩子?