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

编写Pre-commit Script阻止超100MB提交失败求助

搞定SVN预提交脚本拦截大文件的问题

你的问题出在错误地读取了SVN内部事务文件的大小,而不是实际提交的文件内容大小。那个$TXN.txn文件是SVN用来记录事务元数据的,和你提交的文件实际体积完全不相关。之前尝试的几个方案也没命中要点:svnlook cat | wc -c会把所有文件内容拼接后计算总大小,不仅效率低,还可能因为二进制文件的输出问题导致数值不准;svnlook filesize没指定具体文件路径,自然拿不到有效结果。

下面是能正常工作的预提交脚本,它会逐个检查本次提交中所有新增/修改的文件大小,只要有一个超过100MB就拦截:

#!/bin/sh
REPOS="$1"
TXN="$2"

# 定义大小阈值:100MB = 100 * 1024 * 1024 = 104857600字节
MAX_SIZE=104857600

# 遍历本次提交中所有新增(A)或修改(M)的文件
svnlook changed -t "$TXN" "$REPOS" | while read -r status path; do
    # 只处理新增和修改的文件
    if [ "$status" = "A" ] || [ "$status" = "M" ]; then
        # 获取当前文件的大小(字节数)
        file_size=$(svnlook filesize -t "$TXN" "$REPOS" "$path")
        
        # 比较大小,注意用-n确保数值比较有效
        if [ -n "$file_size" ] && [ "$file_size" -gt "$MAX_SIZE" ]; then
            # 转换为人类可读格式输出
            human_size=$(echo "$file_size" | awk '{printf "%.2f MB", $1/(1024*1024)}')
            echo "错误:提交的文件 '$path' 大小为 $human_size,超过了100MB的限制">&2
            exit 1
        fi
    fi
done

# 所有文件检查通过
exit 0

关键细节说明:

  • 用svnlook changed精准获取变更文件,只关注新增(A)和修改(M)的文件,忽略删除(D)的文件
  • svnlook filesize直接获取单个文件的字节数,准确且高效,不需要处理文件内容
  • 处理了路径含空格的情况:while read -r status path会正确拆分状态和文件路径(svnlook changed的输出是「状态+空格+路径」,路径中的空格会完整保留)
  • 加入了人类可读的大小输出,方便用户直观看到超标文件的体积

替换你的原有脚本后,记得给脚本加上执行权限(chmod +x pre-commit),并放到SVN仓库的hooks目录下,替换默认的pre-commit.tmpl即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:13:42