如何规范你的Git commit?

commit message应该如何写才更清晰明了?团队开发中有没有遇到过让人头疼的git commit?本文分享在git commit规范建设上的实践,规定了commit message的格式,并经过webhook在提交时进行监控,避免不规范的代码提交。git

Git每次提交代码都须要写commit message,不然就不容许提交。通常来讲,commit message应该清晰明了,说明本次提交的目的,具体作了什么操做……可是在平常开发中,你们的commit message千奇百怪,中英文混合使用、fix bug等各类笼统的message司空见怪,这就致使后续代码维护成本特别大,有时本身都不知道本身的fix bug修改的是什么问题。基于以上这些问题,咱们但愿经过某种方式来监控用户的git commit message,让规范更好的服务于质量,提升你们的研发效率。程序员

初期咱们在互联网上搜索了大量有关git commit规范的资料,但只有Angular规范是目前使用最广的写法,比较合理和系统化,而且有配套的工具(IDEA就有插件支持这种写法)。最后综合阿里巴巴高德地图相关部门已有的规范总结出了一套git commit规范。web

commit message格式服务器

<type>(<scope>): <subject>

type(必须)
用于说明git commit的类别,只容许使用下面的标识。
feat:新功能(feature)。
fix/to:修复bug,能够是QA发现的BUG,也能够是研发本身发现的BUG。
· fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
· to:只产生diff不自动修复此问题。适合于屡次提交。最终修复问题提交时使用fix
docs:文档(documentation)。
style:格式(不影响代码运行的变更)。
refactor:重构(即不是新增功能,也不是修改bug的代码变更)。
perf:优化相关,好比提高性能、体验。
test:增长测试。
chore:构建过程或辅助工具的变更。
revert:回滚到上一个版本。
merge:代码合并。
sync:同步主线或分支的Bug。
scope(可选)
scope用于说明 commit 影响的范围,好比数据层、控制层、视图层等等,视项目不一样而不一样。
例如在Angular,能够是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。若是你的修改影响了不止一个scope,你可使用*代替。架构

subject(必须)
subject是commit目的的简短描述,不超过50个字符。
建议使用中文(感受中国人用中文描述问题能更清楚一些)。
· 结尾不加句号或其余标点符号。
· 根据以上规范git commit message将是以下的格式:运维

fix(DAO):用户查询缺乏username属性 
feat(Controller):用户查询接口开发

以上就是咱们梳理的git commit规范,那么咱们这样规范git commit到底有哪些好处呢?
· 便于程序员对提交历史进行追溯,了解发生了什么状况。
· 一旦约束了commit message,意味着咱们将慎重的进行每一次提交,不能再一股脑的把各类各样的改动都放在一个git commit里面,这样一来整个代码改动的历史也将更加清晰。
· 格式化的commit message才能够用于自动化输出Change log。分布式

监控服务

一般提出一个规范以后,为了你们更好的执行规范,就须要进行一系列的拉通,好比分享给你们这种规范的优势、能带来什么收益等,在你们都认同的状况下最好有一些强制性的措施。固然git commit规范也同样,前期咱们分享完规范以后考虑从源头进行强制拦截,只要你们提交代码的commit message不符合规范,直接不能提交。但因为代码仓库操做权限的问题,咱们最终选择了使用webhook经过发送警告的形式进行监控,督促你们按照规范执行代码提交。除了监控git commit message的规范外,咱们还加入了大代码量提交监控和删除文件监控,减小研发的代码误操做。工具

总体流程


· 服务注册:服务注册主要完成代码库相关信息的添加。
· 重复校验:防止merge request再走一遍验证流程。
· 消息告警:对不符合规范以及大代码量提交、删除文件等操做发送告警消息。
· DB:存项目信息和git commit信息便于后续统计commit message规范率。
webhook是做用于代码库上的,用户提交git commit,push到仓库的时候就会触发webhook,webhook从用户的commit信息里面获取到commit message,校验其是否知足git commit规范,若是不知足就发送告警消息;若是知足规范,调用gitlab API获取提交的diff信息,验证提交代码量,验证是否有重命名文件和删除文件操做,若是存在以上操做还会发送告警消息,最后把全部记录都入库保存。oop

以上就是咱们整个监控服务的相关内容,告警信息经过以下形式发送到对应的钉钉群里:



咱们也有总体git commit的统计,统计我的的提交次数、不规范次数、不规范率等以下图:

点击获取相关报警源码文档gitlab

将来思考

git hooks分为客户端hook和服务端hook。客户端hook又分为pre-commit、prepare-commit-msg、commit-msg、post-commit等,主要用于控制客户端git的提交工做流。用户能够在项目根目录的.git目录下面配置使用,也能够配置全局git template用于我的pc上的全部git项目使用。服务端hook又分为pre-receive、post-receive、update,主要在服务端接受提交对象时进行调用。

以上这种采用webhook的形式对git commit进行监控就是一种server端的hook,至关于post-receive。这种方式并不能阻止代码的提交,它只是经过告警的形式来约束用户的行为,但最终不规范的commit message仍是被提交到了服务器,不利于后面change log的生成。因为公司代码库权限问题,咱们目前只能添加这种post-receive类型的webhook。如你们有更高的代码库权限,能够采用server端pre-receive类型的webhook,直接拒毫不规范的git commit message。只要git commit规范了,咱们甚至能够考虑把代码和bug、需求关联等等。

固然这块咱们也能够考虑客户端的pre-commit,pre-commit在git add提交以后,而后执行git commit时执行,脚本执行没错就继续提交,反之就会驳回。客户端git hooks位于每一个git项目下的隐藏文件.git中的hooks文件夹里。咱们能够经过修改这块的配置文件添加咱们的规则校验,直接阻止不规范message的提交,也能够经过客户端commit-msg类型的hook进行拦截,把不规范扼杀在萌芽之中。修改每一个git项目下面.git目录中的hooks文件你们确定以为浪费时间,其实这里能够采用配置全局git template来完成。可是这又会涉及到hooks配置文件同步的问题。hooks配置文件在本地,如何让hooks配置文件的修改能同步到全部使用的项目又成为一个问题。因此使用服务端hook仍是客户端hook须要根据具体需求作适当的权衡。

git hook不光能够用来作规范限制,它还能够作更多有意义的事情。一次git commit提交的信息量很大,有做者信息、代码库信息、commit等信息。咱们的监控服务就根据做者信息作了git commit的统计,这样不只能够用来监控commit message的规范性,也能够用来监控你们的工做状况。咱们也能够把git commit和相关的bug关联起来,咱们查看bug时就能够查看解决这个bug的代码修改,颇有利于相关问题的追溯。固然咱们用一样的方法也能够把git commit和相关的需求关联起来,好比咱们定义一种格式feat *786990(需求的ID),而后在git commit的时候按照这种格式提交,webhook就能够根据这种格式把需求和git commit进行关联,也能够用来追溯某个需求的代码量,固然这个例子不必定合适,但足以证实git hook功能之强大,能够给咱们的流程规范带来很大的便利。

总结

编码规范、流程规范在软件开发过程当中是相当重要的,它可使咱们在开发过程当中少走不少弯路。Git commit规范也是如此,确实也是颇有必要的,几乎不花费额外精力和时间,但在以后查找问题的效率却很高。做为一名程序员,咱们更应注重代码和流程的规范性,永远不要在质量上将就。

※更多文章和资料|点击后方文字直达 ↓↓↓
100GPython自学资料包
阿里云K8s实战手册
[阿里云CDN排坑指南]CDN
ECS运维指南
DevOps实践手册
Hadoop大数据实战手册
Knative云原生应用开发指南
OSS 运维实战手册
云原生架构白皮书
Zabbix企业级分布式监控系统源码文档

相关文章
相关标签/搜索