git?hooks的作用及创建使用示例详解_JavaScript

来源:脚本之家  责任编辑:小易  
目录
1. 什么是git hooks ?有什么用啊?1.1 是个啥1.2 有啥用?我以前没用过它不也一样好好的吗?我干嘛要用它?2. 怎么创建一个 git hooks ?2.1 首先看git hooks存在哪里2.2 创建一个pre-commit钩子2.3 触发钩子3 有用点的实战4 总结5 其他5.1 如果在mac下报以下异常5.2 常用钩子5.3 hooks可以使用什么语言?

1. 什么是git hooks ?有什么用啊?

1.1 是个啥

git大家都在用吧,相信现在没公司代码不做版本控制的吧。git hooksgit提供的,在发生特定事件时,允许用户添加自定义代码(或操作)的方式。

就像Vue中组件的生命周期钩子,比如,你想在vue组件创建后输出一行log, 你可能会这么写

export default {
    created () {
        console.log('Hello I am created.')
    }
}

1.2 有啥用?我以前没用过它不也一样好好的吗?我干嘛要用它?

你在git commit -m "feat: 修复bug=51234"时,总是提交的很规范,很明确自己提交了什么,但是团队中有人提交时只写一个git commit -m "add",你也看不出来他提交了啥,这时候就可以使用commit-msg钩子去限定下,提交信息必须符合某种格式,否则不允许提交你喜欢js代码缩进用两个空格,但是团队中有人总是两个空格和四个空格混用,十分的混乱,这时候就可以结合eslint,在提交前进行代码格式的校验

2. 怎么创建一个 git hooks ?

2.1 首先看git hooks存在哪里

git hooks其实就存在仓库根目录中的.git/hooks/目录中(.git目录可能是隐藏目录,取消隐藏即可查看),我们来看下默认的.git/hooks/目录是什么样子

发现了吗,git在初始化仓库的时候,很贴心的为你初始化了很多个xxx.sample文件(这些文件不会被执行),就是钩子的示例文件,比如pre-commit.sample就是git commit前的钩子示例文件。

2.2 创建一个pre-commit钩子

为了更容易理解,让我们设定一个场景:比如,你想在git commit 前在命令行输出一个 Hello world

.git/hooks/中将pre-commit.sample文件复制一份,删除文件后缀名,文件名变为pre-commit,删除除第一行以外的内容

#!/bin/sh
# 以下为shell语法
echo "Hello world"

2.3 触发钩子

我们刚刚创建的是提交前的钩子,那么我们要触发它,就必须得提交代码(即执行git commit

在根目录中创建一个文件 1.js

var a = 12

创建后目录结构

study
├── .git
│   ├── hooks
│   │   ├── pre-commit
└── 1.js

添加进暂存区

git add .

提交

git commit -m "我新建了一个1.js"

此时命令行输出

你看上面打出了 "Hello world",哟呼,我们创建了自己的第一个git hooks,给自己点个赞!!!!

3 有用点的实战

需求场景

假设,我们不允许在提交信息中包含"大白"这种词汇,那么我们可以怎么做?

在.git/hooks 中新建commit-msg文件, 编写 .git/hooks/commit-msg 文件内容

node版
#!/usr/bin/env node
const fs = require('fs');
// 索引 2 对应的 commit 消息文件 里面包含提交信息
// 就是你在 git commit -m "msg" 时输入的 msg
const msg = fs.readFileSync(process.argv[2], 'utf-8').trim();
// 判断 commit_msg中是否包含 "大白"
// 若包含,则中断git的流程
if (msg.indexOf('大白') > -1) {
  console.error('您的提交信息中包含【大白】这个词汇,请检查!');
  // exit 1 表示程序执行异常退出 中断git的流程 不允许提交
  process.exit(1);
} else {
    console.log('不包含')
}
shell 版
#!/bin/sh
# 获取当前提交的 commit msg 内容
# 就是你在 git commit -m "msg" 时输入的 msg
# 用 `` 可以将命令的输出结果赋值给变量 commit_msg
# $1 是git在执行钩子时提供给我们的参数,就是你在 git commit -m "msg" 时输入的 msg
commit_msg=`cat $1`
# 输出下获取到的提交注释
echo "您提交的commit_msg: $commit_msg"
# 判断 commit_msg中是否包含 "大白"
# 若包含,则中断git的流程
if [[ $commit_msg =~ "大白" ]]
then
  echo "您的提交信息中包含【大白】这个词汇,请检查!"
  # exit 1 表示程序执行异常退出 中断git的流程 不允许提交
  exit 1
else
  echo "不包含"
fi

修改 1.js

var a = 12333

添加进暂存区

git add .

提交

git commit -m "我新建了一个1.js,大白"

运行结果

4 总结

其实就是git就是在用户做特定事情的时候,去查找.git/hooks/,目录中查找对应事件的钩子文件是否存在,若存在就执行这个钩子文件中的shell脚本(上面的例子中就是git在用户执行git commit操作的时候,找到了pre-commit文件并执行了其中的shell

5 其他

5.1 如果在mac下报以下异常

hint: The ‘.git/hooks/pre-auto-gc’ hook was ignored because it’s not set as executable.
hint: You can disable this warning with git config advice.ignoredHook false.

那是因为在mac下文件默认是不可执行的,执行以下操作即可

chmod 777 .git/hooks/commit-msg

5.2 常用钩子

pre-commit 提交前
commit-msg 提交信息
pre-push push前

更多文档请参看点我去官网看

5.3 hooks可以使用什么语言?

用于编写 git hooks 的脚本语言是没有限制的,你可以用 nodejsshellpythonruby等脚本语言,非常的灵活方便。文中我使用的是shell

以上就是git hooks的作用及创建使用示例详解的详细内容,更多关于git hooks创建使用的资料请关注真格学网其它相关文章!

您可能感兴趣的文章:在?Swift?中编写Git?Hooks脚本的方法使用eslint和githooks统一前端风格的技巧vue-cli创建的项目中的gitHooks原理解析

  • 本文相关:
  • js前端使用canvas搞一个手势识别
  • 微信小程序 页面滑动事件的实例详解
  • 微信小程序手势操作之单触摸点与多触摸点
  • 微信小程序 http请求的session管理
  • 微信小程序 action-sheet详解及实例代码
  • js前端性能优化解决内存泄漏页面崩溃
  • javascript事件委托原理
  • 微信小程序 数据访问实例详解
  • 微信小程序promsie.all和promise顺序执行
  • javascript+html实现学生信息管理系统
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页javascript在?swift?中编写git?hooks脚本的方法使用eslint和githooks统一前端风格的技巧vue-cli创建的项目中的githooks原理解析js前端使用canvas搞一个手势识别微信小程序 页面滑动事件的实例详解微信小程序手势操作之单触摸点与多触摸点微信小程序 http请求的session管理微信小程序 action-sheet详解及实例代码js前端性能优化解决内存泄漏页面崩溃javascript事件委托原理微信小程序 数据访问实例详解微信小程序promsie.all和promise顺序执行javascript+html实现学生信息管理系统微信小程序 数组(增,删,改,查)等操作实例详解微信小程序 for 循环详解微信小程序 小程序制作及动画(animation样式)详解微信小程序 input输入框控件详解及实例(多种示例)微信小程序 input输入框详解及简单实例微信小程序 传值取值的几种方法总结微信小程序 时间格式化(util.formattime(ne微信小程序中使元素占满整个屏幕高度实现方法微信小程序 wx.request(接口调用方式)详解及实例微信小程序通过api接口将json数据展现到小程序示例微信小程序(二)window 配置详细介绍js代码检查工具eslint介绍与使用方法微信小程序 audio api详解及实例代码js实现保存文本框内容为本地文件兼容ie,chrome,火狐浏览器javascript中document.activeelement焦点元素介微信小程序 实战小程序实例微信小程序 省市区选择器实例详解(附源码下载)使用preload预加载页面资源时注意事项载入进度条 效果微信小程序(应用号)简单实例应用及实例详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved