Bash中Git Diff捕获含空格文件名及阻止违规文件推送问题
解决带前后空格文件名的检测与拦截问题
原脚本的核心问题
- 未遍历变更文件列表:脚本直接使用未定义的
filename变量,没有循环处理所有变更文件。 - 文件名分割错误:直接用
git diff HEAD~1 --name-only的输出赋值给变量,会把带空格的文件名拆分成多个独立条目,无法识别完整文件名。 - 误解
git diff行为:git diff --name-only本身不会去除文件名的空格,是脚本的处理方式导致丢失了空格信息。
修正后的脚本实现
使用Git的-z参数输出NULL分隔的文件名,配合循环读取确保完整捕获含空格的文件名:
#!/bin/sh # 检测变更文件中是否存在带前后空格的文件,避免Windows用户操作受阻 exitcode=0 # 使用-z参数让git输出NULL分隔的文件名,确保含空格的文件名被完整捕获 git diff HEAD~1 --name-only -z | while IFS= read -r -d '' filename; do # 去除文件名前后的空格 trimmed_filename="${filename#"${filename%%[![:space:]]*}"}" trimmed_filename="${trimmed_filename%"${trimmed_filename##*[![:space:]]}"}" # 对比原文件名和去空格后的文件名 if [ "$filename" != "$trimmed_filename" ]; then echo "错误:文件名 '$filename' 包含前导或尾随空格,此类文件会导致Windows本地用户操作受阻。" exitcode=1 fi done exit $exitcode
关键改进点
git diff的-z选项:输出的文件名以NULL字符分隔,避免空格、换行等特殊字符导致的文件名拆分问题。while IFS= read -r -d '':按NULL字符读取每个文件名,完整保留原文件名的所有字符(包括前后空格)。- 遍历所有变更文件:循环处理每个文件,不再遗漏任何需要检测的条目。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

