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

如何阻止含.hgignore匹配文件的变更集推送并同步HG ACL规则?

关于Mercurial ACL扩展与.hgignore同步的问题

1. ACL扩展能否直接读取.hgignore作为deny规则?

不行哦。Mercurial的ACL扩展本身没有内置机制自动读取.hgignore的模式并应用到[acl.deny]配置里。虽然两者的模式语法(比如通配符、正则)有重叠,但ACL的规则是静态写在hgrc文件中的,不会动态关联.hgignore的内容。

2. 有没有现成脚本同步.hgignore到[acl.deny]?

官方没有现成的同步脚本,但自己写个简单脚本很容易实现。比如用shell或Python脚本读取.hgignore的有效模式(过滤注释和空行),转换成ACL的格式写入hgrc的[acl.deny]部分。

举个shell脚本的例子,保存为sync_hgignore_to_acl.sh:

#!/bin/bash
# 先备份hgrc文件,防止出错
HGRC=".hg/hgrc"
cp "$HGRC" "$HGRC.bak"

# 移除现有[acl.deny]区块(如果存在)
sed -i '/^\[acl.deny\]/,/^\[/d' "$HGRC"

# 添加新的[acl.deny]规则
echo -e "\n[acl.deny]" >> "$HGRC"
# 读取.hgignore,跳过注释和空行,转换为ACL deny格式(*=pattern)
grep -vE '^#|^$' .hgignore | while read pattern; do
    echo "*=$pattern" >> "$HGRC"
done

echo "已同步.hgignore到[acl.deny]"

给脚本加执行权限(chmod +x sync_hgignore_to_acl.sh),运行就能完成同步。如果想自动同步,可以把这个脚本绑定到Mercurial的pre-push钩子上,每次推送前自动执行。

3. 除了手动同步,还有其他实现方法吗?

当然有,比如用Mercurial的**钩子(Hook)**直接实现检查逻辑,不用依赖ACL扩展:

方法一:pretxnchangegroup钩子(推送前拦截)

在仓库的.hg/hgrc里添加钩子配置:

[hooks]
pretxnchangegroup.check_ignored_files = python:check_ignored.hook

然后创建check_ignored.py文件放在仓库根目录:

import mercurial.match

def hook(ui, repo, node, **kwargs):
    # 获取本次推送的所有变更集范围
    start_rev = repo[None].rev()
    end_rev = repo[node].rev()
    
    for rev in range(start_rev, end_rev + 1):
        ctx = repo[rev]
        # 遍历变更集中的所有文件
        for file_path in ctx.files():
            # 使用仓库的ignore规则匹配文件
            matcher = mercurial.match.match(repo.root, '', [], repo.ignore())
            if matcher(file_path):
                ui.warn(f"❌ 推送被拒绝:文件 '{file_path}' 匹配.hgignore中的规则\n")
                return True  # 返回True终止推送
    return False  # 返回False允许推送

这样每次有人推送时,钩子会自动检查所有变更的文件,只要有匹配.hgignore的就直接拒绝推送,完全不用手动维护ACL规则。

方法二:自定义Mercurial扩展

如果你的需求更复杂,可以写一个简单的Mercurial扩展专门处理.hgignore和推送检查逻辑。不过这种方式相对繁琐,一般钩子就能满足需求了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:55