目录
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 hooks
是git
提供的,在发生特定事件时,允许用户添加自定义代码(或操作)的方式。
(资料图片)
就像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
的脚本语言是没有限制的,你可以用 nodejs
、shell
、python
、ruby
等脚本语言,非常的灵活方便。文中我使用的是shell
以上就是git hooks的作用及创建使用示例详解的详细内容,更多关于git hooks创建使用的资料请关注脚本之家其它相关文章!
X 关闭
X 关闭
- 1联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 2亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 3现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 4如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 5AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 6转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 7充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 8好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 9名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 10亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战