最近在使用commitlint校验提交git提交日志的时候遇到点奇怪的问题,在这里记录下解决方案。
windows下使用默认命令“commitlint -e $GIT_PARAMS”校验会报“GIT_PARAMS is not available globally”
这个问题的原因是windows的环境变量中没有“GIT_PARAMS”,我换成windows下的环境变量形式“%GIT_PARAMS%”还是会报同样的错误,应该是windows下的git或许根本就没把当前提交的日志信息放入%GIT_PARAMS%。继续google,发现了在.git目录下有个COMMIT_EDITMSG文件,打开一看这个文件存储了最近一次提交的日志信息,于是把“commitlint -e $GIT_PARAMS”改为“commitlint -e .git/COMMIT_EDITMSG”,问题解决,这种写法在windows和mac上都支持。
commitlint校验失败(type cannot be empty,message cannot be empty)
上面这个问题奇怪的地方就在于我明明写了type和message的,google一番毫无结果之后我决定自己调试下“commitlint -e $GIT_PARAMS”到底是怎么校验提交信息的。于是按照vscode官方文档添加“Launch via NPM”如下:(关于vscode如何调试的基础信息请自行参考vscode debugging)
- // launch.json
- {
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "type": "node",
- "request": "launch",
- "name": "Launch via NPM",
- "runtimeExecutable": "npm",
- "runtimeArgs": [
- "run-script",
- "debug"
- ],
- "port": 9229
- }
- ]
- }
- 复制代码
然后在项目的package.json添加debug脚本
- "scripts": {
- "debug": "commitlint -e .git/COMMIT_EDITMSG"
- },
- 复制代码
然后在commitlint源码上打上断点,f5启动调试,纳尼,没启动就直接退出了,什么情况。继续google,发现用node调试单文件需要添加--inspect参数,或者是--inspect-brk=port(port用来指定端口号)。这样就简单了,在node_modules的.bin目录下找到commitlint.cmd文件,进而找到commitlint的入口js文件,找到之后将npm scripts修改如下
- "scripts": {
- "debug":"node --nolazy --inspect-brk=9229 ./node_modules/@commitlint/cli/lib/cli.js -e .git/COMMIT_EDITMSG",
- }
- 复制代码
然后在cli.js中打上断点,f5启动调试就行了。
经过调试发现检验失败是因为commitlint的匹配正则没考虑到一些特殊字符,导致无法匹配,commitlint的匹配正则如下,可以看到中间部分并没有包含所有字符,而我的提交信息里面恰恰用了一个“@”字符,可以说非常尴尬了。
- ^(\w*)(?:\(([\w$.\-* ]*)\))?: (.*)$
- 复制代码