1. 如何規(guī)范你的Git commit?

        共 3980字,需瀏覽 8分鐘

         ·

        2020-08-30 18:28


        點擊「閱讀原文」查看良許原創(chuàng)精品視頻。


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


        背景

        Git每次提交代碼都需要寫commit message,否則就不允許提交。一般來說,commit message應該清晰明了,說明本次提交的目的,具體做了什么操作……但是在日常開發(fā)中,大家的commit message千奇百怪,中英文混合使用、fix bug等各種籠統(tǒng)的message司空見怪,這就導致后續(xù)代碼維護成本特別大,有時自己都不知道自己的fix bug修改的是什么問題?;谝陨线@些問題,我們希望通過某種方式來監(jiān)控用戶的git commit message,讓規(guī)范更好的服務于質量,提高大家的研發(fā)效率。

        規(guī)范建設

        規(guī)范梳理

        初期我們在互聯(lián)網上搜索了大量有關git commit規(guī)范的資料,但只有Angular規(guī)范是目前使用最廣的寫法,比較合理和系統(tǒng)化,并且有配套的工具(IDEA就有插件支持這種寫法)。最后綜合阿里巴巴高德地圖相關部門已有的規(guī)范總結出了一套git commit規(guī)范。

        commit message格式

        <type>(<scope>): <subject>

        type(必須)

        用于說明git commit的類別,只允許使用下面的標識。

        feat:新功能(feature)。

        fix/to:修復bug,可以是QA發(fā)現(xiàn)的BUG,也可以是研發(fā)自己發(fā)現(xiàn)的BUG。


        • fix:產生diff并自動修復此問題。適合于一次提交直接修復問題




        • to:只產生diff不自動修復此問題。適合于多次提交。最終修復問題提交時使用fix



        docs:文檔(documentation)。

        style:格式(不影響代碼運行的變動)。

        refactor:重構(即不是新增功能,也不是修改bug的代碼變動)。

        perf:優(yōu)化相關,比如提升性能、體驗。

        test:增加測試。

        chore:構建過程或輔助工具的變動。

        revert:回滾到上一個版本。

        merge:代碼合并。

        sync:同步主線或分支的Bug。

        scope(可選)

        scope用于說明 commit 影響的范圍,比如數(shù)據(jù)層、控制層、視圖層等等,視項目不同而不同。

        例如在Angular,可以是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。如果你的修改影響了不止一個scope,你可以使用*代替。

        subject(必須)

        subject是commit目的的簡短描述,不超過50個字符。


        • 建議使用中文(感覺中國人用中文描述問題能更清楚一些)。


        • 結尾不加句號或其他標點符號。


        根據(jù)以上規(guī)范git commit message將是如下的格式:

        fix(DAO):用戶查詢缺少username屬性 feat(Controller):用戶查詢接口開發(fā)

        以上就是我們梳理的git commit規(guī)范,那么我們這樣規(guī)范git commit到底有哪些好處呢?


        • 便于程序員對提交歷史進行追溯,了解發(fā)生了什么情況。


        • 一旦約束了commit message,意味著我們將慎重的進行每一次提交,不能再一股腦的把各種各樣的改動都放在一個git commit里面,這樣一來整個代碼改動的歷史也將更加清晰。


        • 格式化的commit message才可以用于自動化輸出Change log。


        監(jiān)控服務

        通常提出一個規(guī)范之后,為了大家更好的執(zhí)行規(guī)范,就需要進行一系列的拉通,比如分享給大家這種規(guī)范的優(yōu)點、能帶來什么收益等,在大家都認同的情況下最好有一些強制性的措施。當然git commit規(guī)范也一樣,前期我們分享完規(guī)范之后考慮從源頭進行強制攔截,只要大家提交代碼的commit message不符合規(guī)范,直接不能提交。但由于代碼倉庫操作權限的問題,我們最終選擇了使用webhook通過發(fā)送警告的形式進行監(jiān)控,督促大家按照規(guī)范執(zhí)行代碼提交。除了監(jiān)控git commit message的規(guī)范外,我們還加入了大代碼量提交監(jiān)控和刪除文件監(jiān)控,減少研發(fā)的代碼誤操作。

        整體流程



        • 服務注冊:服務注冊主要完成代碼庫相關信息的添加。


        • 重復校驗:防止merge request再走一遍驗證流程。


        • 消息告警:對不符合規(guī)范以及大代碼量提交、刪除文件等操作發(fā)送告警消息。


        • DB:存項目信息和git commit信息便于后續(xù)統(tǒng)計commit message規(guī)范率。


        webhook是作用于代碼庫上的,用戶提交git commit,push到倉庫的時候就會觸發(fā)webhook,webhook從用戶的commit信息里面獲取到commit message,校驗其是否滿足git commit規(guī)范,如果不滿足就發(fā)送告警消息;如果滿足規(guī)范,調用gitlab API獲取提交的diff信息,驗證提交代碼量,驗證是否有重命名文件和刪除文件操作,如果存在以上操作還會發(fā)送告警消息,最后把所有記錄都入庫保存。

        以上就是我們整個監(jiān)控服務的相關內容,告警信息通過如下形式發(fā)送到對應的釘釘群里:




        我們也有整體git commit的統(tǒng)計,統(tǒng)計個人的提交次數(shù)、不規(guī)范次數(shù)、不規(guī)范率等如下圖:


        未來思考

        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進行監(jiān)控就是一種server端的hook,相當于post-receive。這種方式并不能阻止代碼的提交,它只是通過告警的形式來約束用戶的行為,但最終不規(guī)范的commit message還是被提交到了服務器,不利于后面change log的生成。由于公司代碼庫權限問題,我們目前只能添加這種post-receive類型的webhook。如大家有更高的代碼庫權限,可以采用server端pre-receive類型的webhook,直接拒絕不規(guī)范的git commit message。只要git commit規(guī)范了,我們甚至可以考慮把代碼和bug、需求關聯(lián)等等。

        當然這塊我們也可以考慮客戶端的pre-commit,pre-commit在git add提交之后,然后執(zhí)行git commit時執(zhí)行,腳本執(zhí)行沒錯就繼續(xù)提交,反之就會駁回??蛻舳薵it hooks位于每個git項目下的隱藏文件.git中的hooks文件夾里。我們可以通過修改這塊的配置文件添加我們的規(guī)則校驗,直接阻止不規(guī)范message的提交,也可以通過客戶端commit-msg類型的hook進行攔截,把不規(guī)范扼殺在萌芽之中。修改每個git項目下面.git目錄中的hooks文件大家肯定覺得浪費時間,其實這里可以采用配置全局git template來完成。但是這又會涉及到hooks配置文件同步的問題。hooks配置文件在本地,如何讓hooks配置文件的修改能同步到所有使用的項目又成為一個問題。所以使用服務端hook還是客戶端hook需要根據(jù)具體需求做適當?shù)臋嗪狻?/span>

        git hook不光可以用來做規(guī)范限制,它還可以做更多有意義的事情。一次git commit提交的信息量很大,有作者信息、代碼庫信息、commit等信息。我們的監(jiān)控服務就根據(jù)作者信息做了git commit的統(tǒng)計,這樣不僅可以用來監(jiān)控commit message的規(guī)范性,也可以用來監(jiān)控大家的工作情況。我們也可以把git commit和相關的bug關聯(lián)起來,我們查看bug時就可以查看解決這個bug的代碼修改,很有利于相關問題的追溯。當然我們用同樣的方法也可以把git commit和相關的需求關聯(lián)起來,比如我們定義一種格式feat *786990(需求的ID),然后在git commit的時候按照這種格式提交,webhook就可以根據(jù)這種格式把需求和git commit進行關聯(lián),也可以用來追溯某個需求的代碼量,當然這個例子不一定合適,但足以證明git hook功能之強大,可以給我們的流程規(guī)范帶來很大的便利。

        總結

        編碼規(guī)范、流程規(guī)范在軟件開發(fā)過程中是至關重要的,它可以使我們在開發(fā)過程中少走很多彎路。Git commit規(guī)范也是如此,確實也是很有必要的,幾乎不花費額外精力和時間,但在之后查找問題的效率卻很高。作為一名程序員,我們更應注重代碼和流程的規(guī)范性,永遠不要在質量上將就。
        ?

        良許個人微信


        添加良許個人微信即送3套程序員必讀資料


        → 精選技術資料共享

        → 高手如云交流社群





        本公眾號全部博文已整理成一個目錄,請在公眾號里回復「m」獲?。?/span>

        推薦閱讀:

        為什么建議大家使用 Linux 開發(fā)?爽?。。。。。?!

        美國如果把根域名服務器封了,中國會從網絡上消失?

        運用sed命令高效地刪除文件的特定行


        5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內回復「1024」,即可免費獲?。?!


        瀏覽 56
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 国产美女啪啪啪 | 日韩婷婷| 黄片在线看入口 | 日日夜精品 | 五月天婷婷综合在线播放 |