如何阻止含.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
相关产品推荐
相关产品推荐

