个人博客:https://theeye.tech
博客小程序:
钩子类型
使用node编写githook,以pre-commit为例:
1.在项目下配置自动生成pre-commit文件,一般可以在启动项目的脚本下添加:
modifyPreCommit: function () { if (!fse.existsSync('.git')) { console.log('该项目下没有git配置'); return; } if (!fse.existsSync('.git/hooks')) { // 没有hooks文件,sourceTree拉下来的代码会出现这种情况 fs.mkdirSync(`.git/hooks`); } if (!fse.existsSync('.git/hooks/pre-commit')) { // 没有pre-commit,创建该文件并且添加checkVer,如果有该文件不进行操作,以免覆盖原有的设置 fse.ensureFileSync('.git/hooks/pre-commit'); fs.readFile(path.resolve(__dirname, './addPreCommit'), function (err, data) { if (err) { console.log(err); return; } const str = data.toString(); fs.writeFile('.git/hooks/pre-commit', str, function (err) { if (err) { console.log(err); return; } console.log('git pre-commit配置成功!'); cp.exec('chmod 777 .git/hooks/pre-commit'); }); }); } }
2.添加被拷贝的addPreCommit(此步骤可以兼容sourceTree的使用):
#!/usr/bin/env bash
# 支持 sourcetree
export PATH=/usr/local/bin:$PATH
node "./config/githook/pre-commit.js"
3.添加校验pre-commit.js(以校验冲突为例):
const execSync = require('child_process').execSync; const isConflictRegular = '<<<<<<< HEAD'; let results; try { // git grep 命令会执行 perl 的正则匹配所有满足冲突条件的文件 results = execSync(`git grep -n "${isConflictRegular}"`, { encoding: 'utf-8' }); results = results.trim(); } catch (e) { results = ''; } if(results!== '') { console.log('提交的文件中有冲突:'); console.log(results); process.exit(1); } else { process.exit(0); }
ps:这样的提示比较苍白,可以引用colors更直观~