簡介:commit message應該如何寫才更清晰明了?團隊開發中有沒有遇到過讓人頭疼的git commit?本文分享在git commit規范建設上的實踐,規定了commit message的格式,并通過webhook在提交時進行監控,避免不規范的代碼提交,

背景
因為某盤的限速功能真的是讓我一個腦袋兩個大,實在沒辦法了,就把一些資料上傳到了我的git上,今天從git上扒東西的時候,家里的小朋友跟我說,你這好像一個大的網盤呀,我突然靈機一動,對啊,git用明白了真的是很厲害呀,但是git的提交也是很讓人頭疼的,像我個人作業還好,但是一個專案的開發,肯定需要很多人,每個人都會向上提交,而Git每次提交代碼都需要寫commit message,否則就不允許提交,一般來說,commit message應該清晰明了,說明本次提交的目的,具體做了什么操作……但是在日常開發中,大家的commit message千奇百怪,中英文混合使用、fix bug等各種籠統的message司空見怪,這就導致后續代碼維護成本特別大,有時自己都不知道自己的fix bug修改的是什么問題,基于以上這些問題,我們希望通過某種方式來監控用戶的git commit message,讓規范更好的服務于質量,提高大家的研發效率,
規范建設
規范梳理
初期我們在互聯網上搜索了大量有關git commit規范的資料,但只有Angular規范是目前使用最廣的寫法,比較合理和系統化,并且有配套的工具(IDEA就有插件支持這種寫法),最后綜合阿里巴巴高德地圖相關部門已有的規范總結出了一套git commit規范,
commit message格式
<type>(<scope>): <subject>
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將是如下的格式:
fix(DAO):用戶查詢缺少username屬性
feat(Controller):用戶查詢介面開發
以上就是我們梳理的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規范也是如此,確實也是很有必要的,幾乎不花費額外精力和時間,但在之后查找問題的效率卻很高,作為一名程式員,我們更應注重代碼和流程的規范性,永遠不要在質量上將就,
關于開發規則,阿里也整理相當多的開發手冊,我這里也收集了一部分,現在分享給大家,需要的,git來吧
https://gitee.com/biwangsheng/personal.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53093.html
標籤:Java
