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

如何遍历git status列表中的.cpp文件?修复pre-commit脚本报错

脚本存在的核心问题

你的脚本共有3处会导致运行异常、逻辑不符合预期的问题:

  • 基础语法错误:[是Shell的内置测试命令,不是语法标记,它和前后的参数、结尾的]之间必须保留空格。你写的[$file == *.cpp]没有加空格,Shell会把[$file整体作为要执行的命令名解析,这就是你看到[build_script.sh: command not found报错的直接原因——当遍历到build_script.sh文件时,Shell试图执行名为[build_script.sh的命令,系统中不存在这个命令自然报错。
  • 匹配逻辑错误:即使给[加上空格,== *.cpp的写法也只是做精确字符串相等匹配,不会做.cpp后缀匹配;同时未给变量加引号的写法,遇到带空格、特殊字符的文件名时会直接拆分出错。
  • 文件获取逻辑错误:git status --porcelain | cut -b4-会把所有状态的文件都列出来,包括未暂存的修改、未跟踪的文件、已删除的文件,完全不符合你「仅获取已编辑且已暂存的.cpp文件」的需求;如果遇到重命名、复制状态的文件,切出来的路径还会包含旧文件名、箭头标记等无效内容,路径解析错误。
修正后的实现方案

获取Git暂存区文件不需要手动解析git status输出,Git本身提供了专门的命令可以直接拿到符合要求的暂存文件列表,修正后的脚本如下:

#!/bin/sh
# 只获取暂存区中新增(Add)、复制(Copy)、修改(Modify)的.cpp文件
staged_cpp_files=$(git diff --cached --name-only --diff-filter=ACM | grep '\.cpp$')

for file in $staged_cpp_files; do
    # 过滤掉暂存后又被本地删除的异常场景
    if [ -f "$file" ]; then
        echo "$file"
        # 替换为你的.cpp文件分析工具调用命令即可
    fi
done
报错对应说明

你看到的两条报错都是第一处语法错误导致的:

  1. ./build_script.sh: line 23: [build_script.sh: command not found:遍历到build_script.sh文件时,Shell尝试执行拼接出来的[build_script.sh命令,找不到对应命令抛出错误。
  2. ./build_script.sh: line 23: [pre_commit_sqo_tmp/: No such file or directory:遍历到pre_commit_sqo_tmp/路径时,Shell同样把[pre_commit_sqo_tmp/当成可执行文件查找,找不到对应路径抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:30:57