用js来写一个git hooks脚本来入门git hooks

前言

  • git hooks(又叫钩子)的概念相信大家都已经比较清楚了,主要是在git提交的时候,通过一系列脚本去对提交信息做一些操作或校验。
  • git的钩子有很多,我这主要说一下commit-msg这个钩子,官方对commit-msg的说法是:钩子在启动提交信息编辑器之前,默认信息被创建之后运行。
  • 讲真,这样一句话真不是看几眼就能理解,那么就有了下面,让我们通过钩子的一一些实际使用场景来帮助着理解

背景

  • 团队开发的时候,有些需要去看以及修改其他同学的代码,本来想通过commit信息去看一下哪个功能是在哪次提交的,这个功能有涉及到哪些文件的修改,git log --oneline,一看,麻了,全是111, 222的commit信息,好吧,还是慢慢去理代码逻辑吧(>|<)
  • 团队开发的时候,一般来讲会拉取一些特定分支,一般是不允许直接在这些特定分支上开发并提交代码的,大家需要基于这些特定分支,拉取自己的分支去开发代码,开发完后再往这些分支合入。

功能描述

基于上面的两个场景,下面我们就来从零编写一个git hooks脚本,在git commit加一些特定的校验

  • 1、git commit 的时候,校验当前分支是否是master分支,如果是master分支,则commit失败,并给出失败提示
  • 2、git commit 的时候,校验commit信息只能是中文或英文,且在五个字符以上

一步一步来

初始化git

  • 新建一个文件夹 git-hooks
  • 进入文件夹
  • git init 到这就生成了一个.git文件夹

hooks文件介绍

  • 进入 .git/hooks/ 的文件目录,这就是git的一些钩子文件
  • 可以看到,这些文件默认都是 .sample结尾的,代表commit的时候不会进入任何钩子,如果我们需要在哪些钩子添加脚本,只需要把 .sample的后缀去掉,commit的时候就会进入到该钩子了

commit-msg

  • 这我们先来启用commit-msg钩子,后缀去掉就行
  • 打开commit-msg文件,一堆注释加一段不熟悉的脚本,全部删掉,在第一行添加下面代码,作用是告诉系统,我们要使用node来编写脚本
javascript 复制代码
#!/usr/bin/env node

钩子验证

  • 我们先来验证一下钩子是否启用成功,修改commit-msg
javascript 复制代码
#!/usr/bin/env node

console.log("commit start")

console.log("commit end")
  • 好的钩子已经生效

编写脚本,校验master分支不允许直接提交代码

javascript 复制代码
#!/usr/bin/env node

console.log("commit start")

const child_process = require("child_process"); // 用于执行shell命令

/**
 * 校验分支 - master分支不允许直接提交代码
 */
function checkBranch() {
    const command = "git symbolic-ref --short HEAD" // 获取分支名
    const branch = child_process.execSync(command)
    if (/master/.test(branch)) {
        throw '不允许在master直接提交代码'
    }
}

checkBranch()

console.log("commit end")

验证

  • 在master commit失败,并给出对应提示
  • 切换到其他分支,commit成功

ok,第一步不允许直接在master分支提交代码已经完成了

编写脚本,commit信息只能是中文或英文,且在五个字符以上

javascript 复制代码
#!/usr/bin/env node

console.log("commit start");

const child_process = require("child_process"); // 用于执行shell命令
const fs = require("fs"); 

/**
 * 校验分支 - master分支不允许直接提交代码
 */
function checkBranch() {
  const command = "git symbolic-ref --short HEAD"; // 获取分支名
  const branch = child_process.execSync(command);
  if (/master/.test(branch)) {
    throw "不允许在master直接提交代码";
  }
}

/**
 * commit信息只能是中文或英文,且在五个字符以上
 */
function checkCommitMsg() {
  const msgPath = process.argv[2]; // 当前commit信息存储到的文件路径
  let commitMsg = fs.readFileSync(msgPath, "utf8"); // 读取文件中的commit信息
  if (!/[a-zA-Z\u4e00-\u9fa5]{5,}/.test(commitMsg)) {
    throw "commit信息只能是中文或英文,且在五个字符以上";
  }
}

checkBranch();
checkCommitMsg();

console.log("commit end");

验证

  • git commit -m '111',commit失败,并给出提示
  • 按规范填写commit信息,commit成功

结尾

ok,到这,相信大家已经对git hooks有了一些基本了解了,需要了解更多的话,可以去官方文档溜一溜: git-scm.com/docs/githoo...

相关推荐
可乐鸡翅yeah_18 分钟前
HLS流媒体首屏起播慢深度优化,从分片、索引、播放器全链路调优
开发语言·javascript·ecmascript·m3u8·m3u8在线
开开心心就好40 分钟前
低年级识字练笔顺工具,电脑和安卓端都能用
前端·javascript·网络·安全·scala·erlang·语音识别
杨利杰YJlio1 小时前
ITSK PE 26U5 测试版解读:组件完善、VMD 修复与服务器支持边界
前端·javascript·后端
夏幻灵1 小时前
Vue / React 列表渲染中的 key:为什么没有 key,Checkbox 可能“对号跑错”?
前端·javascript·vue.js
YWL1 小时前
vue-time-axis-plus进阶:双进度条+跨空白续播+播放指针,打造专业级监控回放体验
前端·javascript·vue·时间轴
岁岁种桃花儿1 小时前
Vue组件第六篇:Vue单文件组件
开发语言·前端·javascript·vue.js
yivifu1 小时前
创建支持交叉链接且鼠标悬停显示注释框的HTML文件
前端·javascript·html
爱奥尼欧2 小时前
【Git】远程分支删了本地还在、两个分支历史不相干?两招故障排解
开发语言·git
Java后端的Ai之路2 小时前
Git冲突完整排查与实战:本地修改覆盖报错到成功推送全流程复盘
开发语言·人工智能·git·python·pop
一个心烑3 小时前
配置项目git的 SSL 证书
git·网络协议·ssl