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

