1. 程式人生 > 其它 >美團 GIT Commit Log規範

美團 GIT Commit Log規範

技術標籤:軟體工程gitgithub

一、背景

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 args

Pipes with arguments like `slice:0` or `slice:0:1` should not produce
diagnostic errors.

  1. 有header、body、footer
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研發