自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 開發(fā)工具
團(tuán)隊(duì)開發(fā)中有沒有遇到過讓人頭疼的git commit?本文分享在git commit規(guī)范建設(shè)上的實(shí)踐,規(guī)定了commit message的格式,并通過webhook在提交時(shí)進(jìn)行監(jiān)控,避免不規(guī)范的代碼提交。

??

[[337750]]

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

背景

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

規(guī)范建設(shè)

規(guī)范梳理

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

commit message格式

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

type(必須)

用于說明git commit的類別,只允許使用下面的標(biāo)識(shí)。

feat:新功能(feature)。

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

  • fix:產(chǎn)生diff并自動(dòng)修復(fù)此問題。適合于一次提交直接修復(fù)問題
  • to:只產(chǎn)生diff不自動(dòng)修復(fù)此問題。適合于多次提交。最終修復(fù)問題提交時(shí)使用fix

docs:文檔(documentation)。

style:格式(不影響代碼運(yùn)行的變動(dòng))。

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

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

test:增加測(cè)試。

chore:構(gòu)建過程或輔助工具的變動(dòng)。

revert:回滾到上一個(gè)版本。

merge:代碼合并。

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

scope(可選)

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

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

subject(必須)

subject是commit目的的簡(jiǎn)短描述,不超過50個(gè)字符。

  • 建議使用中文(感覺中國(guó)人用中文描述問題能更清楚一些)。
  • 結(jié)尾不加句號(hào)或其他標(biāo)點(diǎn)符號(hào)。

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

fix(DAO):用戶查詢?nèi)鄙賣sername屬性 feat(Controller):用戶查詢接口開發(fā)

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

  • 便于程序員對(duì)提交歷史進(jìn)行追溯,了解發(fā)生了什么情況。
  • 一旦約束了commit message,意味著我們將慎重的進(jìn)行每一次提交,不能再一股腦的把各種各樣的改動(dòng)都放在一個(gè)git commit里面,這樣一來整個(gè)代碼改動(dòng)的歷史也將更加清晰。
  • 格式化的commit message才可以用于自動(dòng)化輸出Change log。

監(jiān)控服務(wù)

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

整體流程

??

??

  • 服務(wù)注冊(cè):服務(wù)注冊(cè)主要完成代碼庫相關(guān)信息的添加。
  • 重復(fù)校驗(yàn):防止merge request再走一遍驗(yàn)證流程。
  • 消息告警:對(duì)不符合規(guī)范以及大代碼量提交、刪除文件等操作發(fā)送告警消息。
  • DB:存項(xiàng)目信息和git commit信息便于后續(xù)統(tǒng)計(jì)commit message規(guī)范率。

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

以上就是我們整個(gè)監(jiān)控服務(wù)的相關(guān)內(nèi)容,告警信息通過如下形式發(fā)送到對(duì)應(yīng)的釘釘群里:

??

??

??

??

??

??

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

??

??

未來思考

git hooks分為客戶端hook和服務(wù)端hook??蛻舳薶ook又分為pre-commit、prepare-commit-msg、commit-msg、post-commit等,主要用于控制客戶端git的提交工作流。用戶可以在項(xiàng)目根目錄的.git目錄下面配置使用,也可以配置全局git template用于個(gè)人pc上的所有g(shù)it項(xiàng)目使用。服務(wù)端hook又分為pre-receive、post-receive、update,主要在服務(wù)端接受提交對(duì)象時(shí)進(jìn)行調(diào)用。

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

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

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

總結(jié)

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

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2020-05-12 14:57:06

git commit代碼前端

2023-07-16 23:09:55

GitType代碼

2024-08-07 10:24:04

2018-07-10 10:45:00

規(guī)范Commit項(xiàng)目

2018-07-10 11:05:18

開發(fā)者技能命令

2023-03-27 08:03:26

Git代碼控制層

2015-08-06 10:28:24

git規(guī)范流程

2016-09-23 20:04:26

2014-03-06 09:23:19

Git服務(wù)器Github

2024-06-20 08:06:30

2023-09-04 13:55:44

分支masterhotfix

2020-11-12 11:55:57

代碼GitJava

2021-01-04 13:25:10

Git開源工具

2022-03-18 09:45:43

Git分支Linux

2024-03-01 13:48:00

Git配置系統(tǒng)

2015-12-30 10:29:40

Git協(xié)作流程詳解

2015-08-07 10:22:45

Git規(guī)范流程管理策略

2022-01-17 07:50:37

Go代碼規(guī)范

2021-12-20 15:06:09

JekyllGit開源

2021-01-04 13:40:59

Git開源工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)