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

Git预提交Bash脚本:过滤指定目录文件执行Lint失败求助

问题分析与修正方案

原脚本存在几个关键问题导致功能失效:

  • 数组赋值语法错误:declare -a modifiedFiles=$(...) 会把所有文件名合并成单个数组元素,无法正确遍历每个文件。
  • 未遍历项目列表:脚本定义了projectsList但从未使用,反而引用了未定义的projectName变量,根本没实现对每个项目目录的检查逻辑。
  • jq输出带引号:直接用jq '.name'得到的是带双引号的项目名,会导致目录匹配失败,需用-r参数输出原始字符串。
  • 缺少TS文件过滤逻辑:没有判断文件是否为TypeScript类型(.ts/.tsx)。

修正后的脚本

# 获取当前PR中修改的文件列表(兼容含空格的文件名)
mapfile -t modifiedFiles < <(git diff --name-status | cut -f2)

# 获取所有项目名称(去掉jq输出的引号)
mapfile -t projectsList < <(find . -name "project.json" -exec realpath {} \; | xargs cat | jq -r '.name')

# 遍历每个项目
for projectName in "${projectsList[@]}"; do
    # 生成项目目录前缀(对应原逻辑取项目名前5个字符)
    projectDirPrefix="apps/${projectName:0:5}"
    
    # 遍历修改的文件,检查是否在当前项目目录下且为TS/TSX文件
    for fileName in "${modifiedFiles[@]}"; do
        if [[ "$fileName" == "$projectDirPrefix"* && "$fileName" =~ \.tsx?$ ]]; then
            echo "针对项目 ${projectName} 的受影响TS文件执行Lint检查"
            # 替换为你的实际Lint命令,例如:
            # eslint "$fileName"
            break 2  # 若只需触发一次Lint就退出,可保留;需检查所有匹配文件则移除
        fi
    done
done

关键改进点

  • 用mapfile -t替代直接赋值数组,更好处理含空格的文件名。
  • 遍历projectsList数组,对每个项目生成对应的目录前缀。
  • 用[[ ... ]]做更可靠的字符串前缀匹配和正则检查,精准过滤TS/TSX文件。
  • 简化代码结构,移除多余的中间变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:55:04