使用git中的hook对提交代码中的TODO等关键字进行拦截

2,430 阅读2分钟

新人前端,记录一下学习笔记

什么是hook

  • 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。 钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks。
    1608514492083-20201221.png
  • 在代码被commit、margin、push等关键节点的时候都可以使用hook针对提交信息、代码进行检查。

利用hook检查代码中存在的TODO等关键字

  • 本地调试的时候为了方便我们会将一些代码注释掉,但是偶尔会出现忘记去掉注释的情况,导致线上代码与实际不匹配的问题。这个时候我们就可以利用hook拦截关键字来阻止这些错误被提交到线上。
  • 使用教程
  1. 在项目中安装pre-commit、husky这两个库,在项目中执行npm install pre-commit husky -D
  2. 在项目根目录中找到./.git/hooks文件夹,创建一个文件名称为: check-keyword.sh。 check-keyword.sh文件不一定要放在上面写的那个文件目录中,随意你喜欢放在哪,只要你在package.json文件中执行的路径对就行。名字也同理。
  3. 在check-keyword.sh文件中添加以下代码
#!/bin/bash
for FILE in `git diff --name-only --cached`; do
    # 忽略检查的文件
    if [[ $FILE == *".sh"* ]] ; then
        continue
    fi
    # 匹配不能上传的关键字
    grep 'TODO\|debugger\|alert(' $FILE 2>&1 >/dev/null
    if [ $? -eq 0 ]; then
        # 将错误输出
        echo -e $FILE '文件中包含了TODO、debugger、alert其中一个关键字请删除后再提交'
        exit 1
    fi
done
exit
  1. 在package.json文件中添加如下命令
 "scripts": {
   "check-keyword": "bash ./.git/hooks/check-keyword.sh",
   "check-commit": "npm run check-keyword"
 },
 "pre-commit": [
   "check-commit"
 ]

1608515091942-20201221.png

  1. 这样在执行git的commit命令时如果匹配到关键字就会进行拦截 1608515452932-20201221.png 1608515512486-20201221.png
  2. 如果想忽略某个文件的话可以在bash文件中添加想要忽略文件的正则匹配
  • 注意:bash中 [[ $FILE == *".md"* ]] 这类命令需要注意空格 1608515870509-20201221.png 1608516150028-20201221.png