美團 GIT Commit Log規範
一、背景
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可為多個,中間用逗號分隔。
舉例:
fix(service,dao): 修改產品型別時不過濾產品Type
refactor(*): 修改DTO模型字首
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.
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程式碼塊
(^(\w+)\(([\w+,.\-_*]+?)\): .+(.|\n)*)|(^Automatic merge(.|\n)*)|(^Merge (.|\n)*)
2、本地卡控
- 本地hook:可自行加一個git hook,確保不合法commit log格式無法提交,在自己的工程裡執行:
#!/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倉庫一級目錄下執行:
mv commit-msg.txt .git/hooks/commit-msg
chmod +x .git/hooks/commit-msg
五、宣告
本文章授權公共號:肉眼品世界 首發
原文連結:https://lesofn.com/archives/mei-tuan-c-o-m-m-i-t–l-o-g-gui-fan
作者簡介
美團Java高階工程師,關注軟體架構及職業成長,不定期分享各種技術、資源,對文章中涉及的技術感興趣或有任何問題請關注微信交流。
公共號:Java研發