githook开发实践总结(代码片段)

bladestone bladestone     2022-11-29     129

关键词:

前言: Git是由Linus大牛在一周时间内开发出来的分布式版本管理系统,Linux的内核以及各类大小项目都是使用git来管理其版本以及迭代开发。本文将简要介绍其hook的功能,并通过一个特定的hook实现来展示如何来开发hook。

1 Git Hook

git在提供了一些列版本功能的功能之外,还提供了若干的扩展机制,由开发团队在其扩展点上根据需要进行定制化功能;例如,提供更为严格的提交规则检查、comment信息的检查等等。这些扩展点被成为Hook,钩子。
Git 通过Hook的方式,在特定的重要动作发生时触发自定义脚本。钩子分类:客户端的和服务器端。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
客户端的钩子,位于git项目的.git/hooks目录之下:

其中sample结尾的文件是由git提供的hook示例,需要的时候,只需将.sample的后缀移除,即可作为hook来使用。客户端的hook示例如下:

  • pre-commit 钩子在键入提交信息前运行。
  • prepare-commit-msg 钩子在启动提交信息编辑器之前,默认信息被创建之后运行
  • commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径
  • post-commit 钩子在整个提交过程完成后运行
    其余的hook,大家可以自行检索其应用场景,使用方式大同小异。
    服务端的Hook的扩展点,具体如下:
  • pre-commit: 检查每次的commit message是否有拼写错误,或是否符合某种规范。
  • pre-receive: 统一上传到远程库的代码的编码。
  • post-receive: 每当有新的提交的时候就通知项目成员(可以使用Email或SMS等方式)。
  • post-receive: 把代码推送到生产环境。
    更多的扩展信息,可以参考git的相关文档。
    在实际项目中,大家可以根据具体情况,选择在客户端/服务端部署hook

2 自定义Hook的功能需求目标

需求描述:

写一个客户端钩子,使得任何一个在master分支上的提交都必须包含JIAR的关键字,否则提交不予允许,并给出错误提示信息。如果提交发生在非master分支上,则允许提交进行(不管是否包含JIRA关键字)

Hook分析:
客户端Hook,在commit-msg中检查是否含有JIRA关键词,并检查Branch是否为Master。

3 Hook的实现类库选择

在本示例中,选用git-python作为进行git操作的扩展类库使用,其安装指令如下:

pip install git-python

当前环境使用的Python版本为:3.7.0

4 Hook的实现步骤

  1. 新增文件 commit-msg
    文件路径: .git/hook
    内容如下:
      #!/bin/sh
      python .git/hooks/commit-msg.py $1
    
  2. 新增文件 commit-msg.py
    文件所在的路径: .git/hooks
import git
import sys, re

repo = git.Repo(search_parent_directories=True)
branch = repo.active_branch

print("currnet branch name:" + branch.name)
print("Start to commit the change in git")

#Required parts
requiredRegex = "JIRA"
requiredLength = 15

#Get the commit file
commitMessageFile = open(sys.argv[1]) #The first argument is the file
commitMessage = commitMessageFile.read().strip()

if branch.name == "master":
    print("Ready to commit the change in master")
    sys.exit(0)

if len(commitMessage) < requiredLength:
    print("Commit message is less than the required 15 characters.")
    sys.exit(1)

if re.search(requiredRegex, commitMessage) is None:
    print("A JIRA Keyword must be filled with a commit")
    sys.exit(1)
    
print("Commit message is validated")
sys.exit(0)

说明:

  1. active_branch指在当前git repository的活跃分支
  2. sys.argv[1]: 从commit-msg命令中传入的用户提交的commit注释信息
  3. sys.exit(0), 0: 表示当前流程正常结束,继续向下流转; 1: 中断当前流程

5 Hook执行效果

在master branch进行提交:

即使在commit信息中未包含JIRA,仍然可以正常提交。

在Dev branch中进行提交:

从其中可以看出,commit信息中未包含JIRA的情况下,提交失败。

6 异常问题的处理

  1. 无法执行的问题
    提示信息:
  week2 git:(dev) >> git commit -m "test it for hook"
提示:因为没有将钩子 '.git/hooks/commit-msg' 设置为可执行,钩子被忽略。您可以通过
提示:配置 `git config advice.ignoredHook false` 来关闭这条警告。
[dev 32f4480] test it for hook

现象分析: commit-msg自定义的钩子在执行中权限不足,无法被执行。
解决方法:
> chmod +x commit-msg
增加文件的执行权限。

  1. 提示文件不存在的问题
    现象以及问题:
week2 git:(dev) >> git commit -m "test it for hook again"
(null): can't open file 'commit-msg.py': [Errno 2] No such file or directory

现象分析:
无法找到文件,是由于其设置的路径不正确
解决办法:
在commit-msg中将执行python文件的路径设置一下:

#!/bin/sh  
python .git/hooks/commit-msg.py $1

路径的起点是当前git repository所在的位置。

参考文档

  1. Git Hook Reference
  2. Git Hook Example

201892172018-2019-2《移动平台开发实践》第10周学习总结(代码片段)

教材学习内容总结第39章要点要点1:SharedPreference在Android中我们通常使用一个轻量级的存储类——SharedPreferences来保存用户偏好的参数。android.content.SharedPreferences接口提供了用于排序和读取应用程序设置的方法。通过调用PreferenceM... 查看详情

vue3+typescript开发实践总结(代码片段)

...上家公司4月份时,上级领导分配了一个内部的党务系统开发,这个系统前端是由我一个人来开发,功能和需求也不怎么复杂的一个B端系统,直接上的Vue3+TypeScript+ElementPlus开发的,开发两周到最 查看详情

appstoreserverapi实践总结(代码片段)

...员交流群👇👇关于AppStore用户退款时并没有通知开发者,直到2020年6月苹果提供了退款通知,但是因为不是API方式,导致开发者不一定能收到退款通知。另外像用户充值成功但app没有提供金币或服务等,开... 查看详情

3dgis应用开发——基于mapboxgl的实践总结(代码片段)

...可视化项目,由于相关业务的需要,用到了Mapbox这一地图开发的神器。在此先奉上一个基于mapbox-gl实现的demo(来源:uber的deck.gl项目):下面我们从这个项目一步步来介绍Mapbox的前端GIS引擎?MapboxGLJS.一、简单了解首先,Mapbox在地... 查看详情

06-前端开发框架vue技术应用总结(代码片段)

...周期函数应用Axios方式的Ajax请求Get请求Post请求VUE组件化开发组件设计基本步骤运行分析组件类型组件间传参单页应用实践(SPA)基本步骤页头等全局组件:路由跳转路由传参安装vue脚手架脚手架文件夹结构:懒加载应用实践异步... 查看详情

通过gradleplugin实现githooks检测机制(代码片段)

...测等常规性的例行检测。面对此类需求,Git为我们提供了GitHooks机制。在每个项目根目录下,都存在一个隐藏的.git目录,目录中除了Git本身的项目代码版本控制以外,还带有一个名为hooks的目录 查看详情

《移动平台开发实践》第7周学习总结(代码片段)

201892082018-2019-2《移动平台开发实践》第7周学习总结教材学习内容总结需求:用户需求:用户提出的。产品需求:由用户需求提炼出的需求。需求分析一般步骤:挖掘真实需求;(更快的马车)目标用户使用场景想要解决的问题... 查看详情

小程序项目实践总结(代码片段)

...应用将无处不在,随时可用,但又无需安装卸载。小程序开发资料:小程序文档地址html使图片长边显示:<imagesrc=""mode="aspectFit"></image>绑定事 查看详情

icloud开发实践(代码片段)

iCloud开发实践写在前面准备工作Key-value同步文档数据同步本地数据库(CoreData)同步CloudKit使用写在前面最近在一直在研究iCloud开发相关的东西,觉得是有必要写篇总结来整理一下近段时间的一些学习成果。之前一直... 查看详情

django入门与实践1-16章总结(代码片段)

...honmanage.pyrunserverhttp://127.0.0.1:8000使用组合键Control+C来终止开发服务器。django 查看详情

小程序开发实践总结(代码片段)

...我司也不例外,我们整个前端团队这半年来基本上都是在开发小程序。前前后后也开发了四五个小程序了。总觉得要留下点什么,既是记录那些年我们踩过的坑,也是希望大家别再掉坑。那些年我们踩过的坑css样式不能引用本地... 查看详情

wireshark经典实践和面试13点总结(代码片段)

1.软件概述(谁开发的?什么时候?)wireshark是目前全球使用最广泛的开源抓包软件(前身为Ethereal),由GeraldCombs编写并与1998年以GPL开源许可证发布。能在多种平台上抓取和分析网络包。图形界面非常... 查看详情

wireshark经典实践和面试13点总结(代码片段)

1.软件概述(谁开发的?什么时候?)wireshark是目前全球使用最广泛的开源抓包软件(前身为Ethereal),由GeraldCombs编写并与1998年以GPL开源许可证发布。能在多种平台上抓取和分析网络包。图形界面非常... 查看详情

wireshark经典实践和面试13点总结(代码片段)

1.软件概述(谁开发的?什么时候?)wireshark是目前全球使用最广泛的开源抓包软件(前身为Ethereal),由GeraldCombs编写并与1998年以GPL开源许可证发布。能在多种平台上抓取和分析网络包。图形界面非常... 查看详情

kafkakafka生产问题总结及性能优化实践(代码片段)

...09;的机器,一定要上大内存JVM参数设置kafka是scala语言开发,运行 查看详情

kafkakafka生产问题总结及性能优化实践(代码片段)

...09;的机器,一定要上大内存JVM参数设置kafka是scala语言开发,运行 查看详情

vitevue3规范化与githooks

1规范化在企业级开发中,“一千个读者有一千个哈姆雷特”是很常见的事,每个程序员对技术的理解、视角和掌握程度参差不齐,导致编写的代码五花八门。规范化包括很多,我在企业实践中重点关注两个方面&#x... 查看详情

基于java的插件化集成项目实践(代码片段)

...。前言在开始之前,先看下插件系统的整体框架插件开发模拟环境“插件开发模拟环境”主要用于插件的开发和测试,一个独立项目,提供给插件开发人员使用。 查看详情