0%

npm script添加git pre-commit钩子

安装

npm install pre-commit –save-dev

package.json

如果你已经安装了 pre-commit, 那你就需要在你的 package.json 里面添加一个新的 pre-commit 的入口, 来表示在 commit 之前要执行的校验规则。

1
2
3
4
5
6
7
8
9
10
{
"scripts": {
"lint": "eslint ./ --cache --ignore-pattern .gitignore"
},
"pre-commit": [ "lint" ],
"devDependencies": {
"eslint": "^2.12.0",
"pre-commit": "^1.1.3"
}
}

Pre-commit 信息

可以在 pre-commit 前加一个描述日志,,这个不会造成信息混乱,清楚的知道发生了什么事。

1
2
3
4
5
6
7
8
9
10
11
{
"scripts": {
"lint": "eslint ./ --cache --ignore-pattern .gitignore",
"precommit-msg": "echo 'Pre-commit checks...' && exit 0"
},
"pre-commit": [ "precommit-msg", "lint" ],
"devDependencies": {
"eslint": "^2.12.0",
"pre-commit": "^1.1.3"
}
}

问题

  1. pre-commit 钩子没有执行成功, 还是可以在 commit 的后面加上 --no-verify 的参数来强制提交。

  2. window由于权限问题,无法在hooks下生成文件,需要以管理打开cmd,执行 node ./node_modules/pre-commit/install.js 手动生成钩子文件。

也可以添加postinstall钩子在项目安装后检查hooks下文件有没有生成,若没有则进执行生成命令:

package.json

1
2
3
4
5
{
"scripts": {
"postinstall": "node ./postinstall.js"
}
}

postinstall.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
fs.access(path.join(__dirname, './.git/hooks/pre-commit'), fs.constants.F_OK, (err) => {
if (err) {
// 未安装钩子
exec('node ./node_modules/pre-commit/install.js', {
cwd: dirname
}, (err, stdout, stderr) => {
if (err) {
console.error(`install pre-commit error: ${err}`);
return;
}
if (stdout) {
console.log(`install pre-commit stdout: ${stdout}`);
}
if (stderr) {
console.log(`install pre-commit stderr: ${stderr}`);
}
});
}
});