前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >美团 GIT Commit Log规范

美团 GIT Commit Log规范

作者头像
肉眼品世界
发布2020-12-17 14:39:53
发布2020-12-17 14:39:53
2.3K00
代码可运行
举报
文章被收录于专栏:肉眼品世界肉眼品世界
运行总次数:0
代码可运行

一、背景

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

代码语言:javascript
代码运行次数:0
复制
<types>(<scopes>): <subject>
 
<空行>
 
<body>
 
<空行>
 
<footer>
 

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

举例:

  1. 仅header:
代码语言:javascript
代码运行次数:0
复制
fix(service,dao): 修改产品类型时不过滤产品Type
 
仅header,涉及模块较多用*代替

代码语言:javascript
代码运行次数:0
复制
refactor(*): 修改DTO模型前缀
 
有header和body

代码语言:javascript
代码运行次数:0
复制
fix(language-service): Improve signature selection for pipes with args
 
Pipes with arguments like `slice:0` or `slice:0:1` should not produce
 
diagnostic errors.
 
有header、body、footer

代码语言:javascript
代码运行次数:0
复制
func(core,logic): 添加礼包审核
 
添加商品编辑审核状态和回调,blablablabla
 
PRD: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代码块

代码语言:javascript
代码运行次数:0
复制
(^(\w+)\(([\w+,.\-_*]+?)\): .+(.|\n)*)|(^Automatic merge(.|\n)*)|(^Merge (.|\n)*)
 
2、本地卡控
  • 本地hook:可自行加一个git hook,确保不合法commit log格式无法提交,在自己的工程里执行:
代码语言:javascript
代码运行次数:0
复制
#!/usr/bin/env python
 
import sys, os, re
 
from subprocess import check_output
commit_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_type
 
with 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仓库一级目录下执行:

代码语言:javascript
代码运行次数:0
复制
mv commit-msg.txt .git/hooks/commit-msg
 
chmod +x .git/hooks/commit-msg
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 肉眼品世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、约定
  • 三、Commit Log Format
    • 1、Type
    • 2、Scope
    • 3、Subject
    • 4、Body
    • 5、Footer
  • 四、规范校验
    • 1、commit log正则表达式(持续集成工具会用到):
    • 2、本地卡控
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档