钩子-如何让Git版本管理走向规范化
钩子的作用就是当某个特定事件发生时,触发一个特定的动作执行。钩子存放在代码仓库的.git/hooks下,初始化的代码仓库中会带有一些示例代码,它们以sample作为后缀,删除这个后缀,就可以激活了。脚本命名中,以pre-前缀开始的钩子通过约束条件决定是否让操作发生,而以post-前缀开始的钩子只能用于通知。.git/hooks下默认的脚本是用shell(#!/bin/sh)和perl(#!/usr/bin/perl)编写的,如果更熟悉其他语言,同样也可以用python等实现。
钩子使用场景举例(一):
需求:在开发跨平台项目的时候,使用非ACSII文件名会导致错误,比如文件系统编码不同导致fopen函数无法打开中文命名的文件。
实现:在开发人员将代码提交到本地仓库之前,检查提交的文件中是否包含非ACSII字符。
触发:git commit操作
默认pre-commit脚本:
① 获取本地仓库最新的提交索引HEAD
② 获取本地仓库配置信息,是否允许ACSII
③ 当本地配置文件不允许非ACSII字符,且暂存区新增文件命名包含非ACSII字符时,使git commit操作失败,给出错误提示。
如果想对修改的文件也同时进行约束,将—diff-filter=AM即可。
操作演示:
钩子使用场景举例(二):
需求:项目组希望提交信息合规,以便于通过提交信息直观了解提交内容。开发人员需要在每次提交时按照固定的格式书写message,如以【功能描述】【提交人】开头的描述信息。
实现:自动修改开发人员书写的message信息,使其合规。
触发:git commit操作
自定义commit-msg脚本:
操作演示:
钩子的作用范围
一个开发人员定义无法推送到远端服务器,因此,不能被其他成员克隆,可是说钩子是本地化的。如果组内想共享钩子,可以在仓库中创建一个.git文件夹之外的路径,用于保存和版本管理,不过这样做显然有点繁琐。
因此,很多远端仓库服务器也加入了推送约束,在华为云DevCloud的CodeHub中,可以看到每个仓库的设置界面,都可以进行条件配置,通过定义匹配的正则表达式管理推送的合规性。
- 点赞
- 收藏
- 关注作者
评论(0)