如何配置基于非Git仓库可执行文件的Pre-commit Hook?——运行Pip来源程序及任意Shell命令的方法咨询
如何将任意Shell命令或Pip安装的可执行文件配置为Pre-commit Hook
别担心,pre-commit完全支持配置自定义的Shell命令或者你通过Pip安装的可执行文件作为hook,根本不需要依赖Git仓库的插件!下面给你一步步讲怎么配置:
核心思路:使用local类型的Hook
pre-commit的local仓库类型专门用来定义本地命令,不需要拉取任何远程Git仓库,完美适配你的需求。
具体配置步骤
- 打开(或创建)项目根目录下的
.pre-commit-config.yaml文件 - 添加
local仓库的Hook配置,以下是两个实用示例:
示例1:直接运行自定义Shell命令
比如你想检查README.md里有没有TODO字样:
repos: - repo: local hooks: - id: check-readme-todo name: 检查README中的TODO entry: grep -q "TODO" README.md || (echo "发现TODO在README中!" && exit 1) language: system types: [markdown] pass_filenames: false
示例2:运行通过Pip安装的可执行文件
假设你已经用pip install black装了代码格式化工具,现在要把它作为pre-commit hook:
repos: - repo: local hooks: - id: black-format-check name: Black代码格式检查 entry: black --check language: system types: [python] pass_filenames: true
关键字段解释
repo: local:标记这是本地hook,不需要远程仓库id:给hook起一个唯一标识,方便管理name:hook的显示名称,pre-commit运行时会显示这个名字entry:要执行的命令,可以是直接的Shell命令,也可以是Pip安装的可执行文件名(只要它在系统PATH里能被找到)language: system:使用当前系统的Shell环境运行命令,确保能调用到你已安装的工具types:指定这个hook要处理的文件类型,比如python对应.py文件,markdown对应.md文件pass_filenames:是否将待提交的文件名作为参数传给entry命令。比如black需要文件名,就设为true;如果是不需要文件名的检查(比如上面的README示例),就设为false
额外小贴士
- 如果你的命令逻辑比较复杂,建议把它写到一个单独的脚本文件里(比如
./scripts/custom-check.sh),然后在entry里指向这个脚本路径,记得给脚本加执行权限:chmod +x ./scripts/custom-check.sh - 确保你的可执行文件在pre-commit运行的环境PATH中,比如用虚拟环境的话,要保证pre-commit激活了对应的虚拟环境
内容的提问来源于stack exchange,提问作者ikamen
相关产品推荐
相关产品推荐

