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

如何在SVN pre-commit hook中添加YAML、XML文件语法校验逻辑

SVN pre-commit钩子XML/YAML语法校验落地实现

前置依赖检查

  • 服务器已安装Python 3,且已安装PyYAML依赖:执行pip install pyyaml完成安装
  • 确认svnlook实际路径,可执行which svnlook查询,和脚本内路径保持一致

提示:如果你的服务器没有配置commit-access-control.pl权限校验,可以直接注释掉脚本中对应行,不影响XML/YAML校验逻辑运行。

修改后的完整pre-commit脚本内容

直接替换你服务器hooks目录下的pre-commit文件内容(先把原pre-commit.tmpl重命名为pre-commit):

REPOS="$1"
TXN="$2"

# 配置svnlook路径,替换为你服务器实际路径
SVNLOOK=/usr/local/Cellar/subversion/1.14.1_4/bin/svnlook
# 配置Python路径,可执行which python3查询替换
PYTHON_BIN=python3

# 原有逻辑:校验提交日志不能为空
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || {
    echo "ERROR: 提交日志不能为空,必须包含文字说明" >&2
    exit 1
}

# 原有逻辑:提交权限校验,不需要可直接注释
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# ---------------------- 新增XML/YAML校验逻辑开始 ----------------------
# 获取本次提交所有变更的文件,过滤掉删除的文件(状态为D的跳过)
$SVNLOOK changed -t "$TXN" "$REPOS" | while read -r status file; do
    # 跳过删除的文件
    if [[ "$status" == D* ]]; then
        continue
    fi
    # 匹配YAML/XML后缀文件
    if [[ "$file" =~ \.(ya?ml|xml)$ ]]; then
        # 取出待提交的文件内容执行校验
        if [[ "$file" =~ \.ya?ml$ ]]; then
            # YAML语法校验
            $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | $PYTHON_BIN -c 'import yaml, sys; yaml.safe_load(sys.stdin)' 2>&1
            if [[ $? -ne 0 ]]; then
                echo "ERROR: YAML文件语法错误,文件路径:$file" >&2
                exit 1
            fi
        elif [[ "$file" =~ \.xml$ ]]; then
            # XML语法校验
            $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | $PYTHON_BIN -c 'import xml.etree.ElementTree as ET, sys; ET.parse(sys.stdin)' 2>&1
            if [[ $? -ne 0 ]]; then
                echo "ERROR: XML文件语法错误,文件路径:$file" >&2
                exit 1
            fi
        fi
    fi
done

# 校验上述循环是否有错误返回
if [[ $? -ne 0 ]]; then
    exit 1
fi
# ---------------------- 新增XML/YAML校验逻辑结束 ----------------------

# 所有校验通过,放行提交
exit 0

后续配置步骤

  • 给pre-commit文件添加执行权限:chmod +x /path/to/svn/repo/hooks/pre-commit
  • 测试验证:提交包含语法错误的YAML/XML文件,确认提交会被拦截且返回对应错误提示;提交语法正确的文件可正常提交即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:39:04