编写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
相关产品推荐
相关产品推荐

