【xinsir】githook之precommit分享

个人博客: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更直观~

 
原文地址:https://www.cnblogs.com/xinsir/p/12012764.html