8

Git Commit Log规范推荐

 3 years ago
source link: https://lesofn.com/archives/mei-tuan-c-o-m-m-i-t--l-o-g-gui-fan
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Git Commit Log规范推荐

木小丰 2020年12月13日 5,402次浏览

一、背景

Git每次提交代码都需要写commit message,一般来说,commit message应该清晰明了,说明本次提交的目的,具体做了什么操作等。但是在日常开发中,开发者提交的的commit message千奇百怪,中英文混合使用,这就导致后续代码维护成本特别大,有时自己都不知道自己的fix bug修改的是什么问题。基于以上这些问题,我们希望通过某种方式来监控用户的git commit message,让规范更好的服务于质量,提高大家的研发效率。

所有项目的Commit Log的格式精确控制,增加可读性,便于查看变更历史,形成良好的git使用习惯。规范作为git hook的commit-msg和pre-receive执行,不合法无法提交。全面执行后可自动化执行以下操作:

  • 平台工具包可根据commit log直接生成每次版本的changelog。
  • 上线申请系统自动附带本次上线的commit log。
  • 要求每次提交认真思考,保持commit log的整洁性,每次commit的局部完整性。

三、Commit Log Format

Commit Log包含三部分header、body、footer,其中header是必须的,格式固定,body在变更有必要详细解释时使用。

commit log 格式

Plain Text

<types>(<scopes>): <subject><空行><body><空行><footer>

注意:冒号后面必须有一个小写空格,types和scopes可为多个,中间用逗号分隔。

举例

  1. 仅header:
fix(service,dao): 修改产品类型时不过滤产品Type
  1. 仅header,涉及模块较多用*代替
refactor(*): 修改DTO模型前缀
  1. 有header和body
fix(language-service): Improve signature selection for pipes with argsPipes with arguments like `slice:0` or `slice:0:1` should not producediagnostic errors.
  1. 有header、body、footer
func(core,logic): 添加礼包审核添加商品编辑审核状态和回调,blablablablaPRD:https://km.sankuai.com/page/194127085

1、Type

英文,小写。必须为下列中一个或多个:

  • func: function,小功能。注意:feat改成func了,避免大家按feature这个大粒度来提交,期望是按小功能点分批提交,另外避免跟feature分支规范混淆。
  • fix: bug修复,包括编码过程中的逻辑修复,不特指线上bug修复
  • refactor: 重构代码,非bug修复和性能优化,包括编码过程中的代码结构调整,不特指重构项目
  • impr: improvement,小的代码设计改进
  • perf: 性能优化
  • apm: 仅监控打点、异常日志处理相关
  • chore: 无关紧要的改动,例如删除用不到的注解、调整日志内容等
  • jvm: 仅JVM参数变更
  • pom: 仅依赖和版本变化
  • conf: 仅配置变化,Spring配置、properties文件
  • docs: 仅文档变更
  • style: 代码格式调整,如import清理,代码格式化
  • test: 单测和自动化case相关
  • typo: 修复小的拼写错误
  • wip: work in progress,少用,用于开发中的不完整提交,新工程开始时偶尔使用

2、Scope

英文,小写。表示变更的包或模块范围,可多个组合,若涉及范围较大,可用 * 代替。各服务可以自行定义,组内同学可轻易理解。通用scope列表如下:

  • dto: dto结构变化
  • core: core包
  • service: service层代码
  • dao: dao层代码
  • sql: sql代码变更

除上述通用字段外,Scope中各方向可自行定义关键字。例如以下为商品平台中所定义字段:

  • price: 价格相关
  • stock: 库存相关
  • product: 商品相关
  • idl: IDL文件变化

3、Subject

中文。标题简述修改,结尾不要有句号。

4、Body

中文。修改的背景(为什么做这次修改),说明修改逻辑。

5、Footer

中文。可以放置需求wiki或task链接,对以后其他同学blame很有用。

四、规范校验

1、commit log正则表达式(持续集成工具会用到):

Java代码块

(^(\w+)\(([\w+,.\-_*]+?)\): .+(.|\n)*)|(^Automatic merge(.|\n)*)|(^Merge (.|\n)*)

2、本地卡控

  • 本地hook:可自行加一个git hook,确保不合法commit log格式无法提交,在自己的工程里执行:
#!/usr/bin/env pythonimport sys, os, refrom subprocess import check_outputcommit_msg_filepath = sys.argv[1]commit_type = sys.argv[2] if len(sys.argv) > 2 else ''branch = check_output(['git', 'symbolic-ref', '--short', 'HEAD']).strip()print "commit_type:", commit_typewith open(commit_msg_filepath, 'r+') as f: content = f.read() # ignore merge if content.startswith('Merge'): sys.exit(0) result = re.match('(\w+)\(([\w+,.\-_*]+?)\): .+(.|\n)*)', content) if result is None: print "ERROR: commit msg not match pattern '<type>(<scope>): <subject>'\n\t%s" % content sys.exit(1) sys.exit(0)

然后在git仓库一级目录下执行:

mv commit-msg.txt .git/hooks/commit-msgchmod +x .git/hooks/commit-msg

本博客内容均为原创,授权公共号:肉眼品世界 首发
原文链接:https://lesofn.com/archives/mei-tuan-c-o-m-m-i-t--l-o-g-gui-fan

作者简介

美团Java高级工程师,关注软件架构及职业成长,不定期分享各种技术、资源,对文章中涉及的技术感兴趣或有任何问题请关注微信交流。

公共号:Java研发


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK