如何規范你的Git commit?
?? ??commit message應該如何寫才更清晰明了?團隊開發中有沒有遇到過讓人頭疼的git commit?本文分享在git commit規范建設上的實踐,規定了commit message的格式,并通過webhook在提交時進行監控,避免不規范的代碼提交。
背景
Git每次提交代碼都需要寫commit message,否則就不允許提交。一般來說,commit message應該清晰明了,說明本次提交的目的,具體做了什么操作……但是在日常開發中,大家的commit message千奇百怪,中英文混合使用、fix bug等各種籠統的message司空見怪,這就導致后續代碼維護成本特別大,有時自己都不知道自己的fix bug修改的是什么問題。基于以上這些問題,我們希望通過某種方式來監控用戶的git commit message,讓規范更好的服務于質量,提高大家的研發效率。
規范建設
規范梳理
初期我們在互聯網上搜索了大量有關git commit規范的資料,但只有Angular規范是目前使用最廣的寫法,比較合理和系統化,并且有配套的工具(IDEA就有插件支持這種寫法)。最后綜合阿里巴巴高德地圖相關部門已有的規范總結出了一套git commit規范。
commit message格式
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將是如下的格式:
以上就是我們梳理的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信息,驗證提交代碼量,驗證是否有重命名文件和刪除文件操作,如果存在以上操作還會發送告警消息,最后把所有記錄都入庫保存。
以上就是我們整個監控服務的相關內容,告警信息通過如下形式發送到對應的釘釘群里:
?? 
?? 
?? 
我們也有整體git commit的統計,統計個人的提交次數、不規范次數、不規范率等如下圖:
?? 
未來思考
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規范也是如此,確實也是很有必要的,幾乎不花費額外精力和時間,但在之后查找問題的效率卻很高。作為一名程序員,我們更應注重代碼和流程的規范性,永遠不要在質量上將就。






























