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

Bash中Git Diff捕获含空格文件名及阻止违规文件推送问题

解决带前后空格文件名的检测与拦截问题

原脚本的核心问题

  1. 未遍历变更文件列表:脚本直接使用未定义的filename变量,没有循环处理所有变更文件。
  2. 文件名分割错误:直接用git diff HEAD~1 --name-only的输出赋值给变量,会把带空格的文件名拆分成多个独立条目,无法识别完整文件名。
  3. 误解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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:45:07