Bash过滤指定扩展名文件:pre-commit调用Rubocop排除png/svg方法
解决方案
Rubocop 显式指定输入文件时,默认会忽略配置文件中的 exclude 规则,因此必须要么提前过滤目标文件,要么开启强制排除参数,以下是3种可直接使用的实现方案:
方案1:用grep反向过滤指定后缀
最轻量化的实现,直接在文件流中去掉.png、.svg结尾的文件:
#!/usr/bin/env bash set -e git diff --staged --diff-filter=d --name-only \ | grep -vE '\.(png|svg)$' \ | xargs bundle exec rubocop
参数说明:
grep -E开启正则匹配grep -v反向过滤,即移除符合匹配规则的行- 正则
\.(png|svg)$匹配所有以.png、.svg为后缀的文件名
方案2:兼容带空格的文件名(更稳定)
如果项目中存在文件名包含空格、换行等特殊字符的场景,使用null字符作为分隔符的版本可以避免xargs拆分错误:
#!/usr/bin/env bash set -e git diff --staged --diff-filter=d --name-only -z \ | grep -vzE '\.(png|svg)$' \ | xargs -0 bundle exec rubocop
这里新增的-z(git、grep参数)和-0(xargs参数)都是指定用null字符作为文件分隔符。
方案3:直接让Rubocop强制遵守排除规则
不需要在脚本中硬写过滤规则,给Rubocop增加--force-exclusion参数即可,即使是显式传入的文件也会遵守.rubocop.yml中的exclude规则:
#!/usr/bin/env bash set -e git diff --staged --diff-filter=d --name-only | xargs bundle exec rubocop --force-exclusion
该方案的优势是所有排除规则统一维护在Rubocop配置中,后续新增排除类型不需要修改hook脚本。
内容的提问来源于stack exchange,提问作者quothmarc
相关产品推荐
相关产品推荐

