Commitizen的安裝和使用(標(biāo)準(zhǔn)化Git的Commit Message)

一、為什么需要標(biāo)準(zhǔn)化的commit message

先來(lái)看兩張圖,一張來(lái)自國(guó)際知名項(xiàng)目,一張是國(guó)內(nèi)某知名項(xiàng)目冕臭。

國(guó)際知名項(xiàng)目AngularJS
image
國(guó)內(nèi)知名項(xiàng)目MingGeJS
image

從上面兩張圖中,我想你已經(jīng)能看出一些端倪來(lái)了吧燕锥,相較而言哪種更加能促進(jìn)開(kāi)發(fā)不言自明辜贵。當(dāng)然,我舉這個(gè)國(guó)內(nèi)知名項(xiàng)目比較極端归形,不過(guò)整體而言都普遍存在Commit Message比較隨意的現(xiàn)象托慨。

Commit規(guī)范

順著思路,這一步應(yīng)該給方案了暇榴,方案就是上圖AngularJS項(xiàng)目中用到的Git Commit Guidelines厚棵。

Commit Message 格式

<type>(<scope>): <subject>
<空行>
<body>
<空行>
<footer>

上面是一次Commit后Message格式規(guī)范蕉世,分成標(biāo)題,內(nèi)容詳情婆硬,結(jié)尾三個(gè)部分讨彼,各有各的用處,沒(méi)有多余項(xiàng)柿祈。

頭部即首行,是可以直接在頁(yè)面中預(yù)覽的部分哩至,入上面圖中所示躏嚎,一共有三個(gè)部分<type>,<scope>菩貌,<subject>卢佣,含義分別如下

  • feat:新功能(feature)
  • fix:修補(bǔ)bug
  • docs:文檔(documentation)
  • style: 格式(不影響代碼運(yùn)行的變動(dòng))
  • refactor:重構(gòu)(即不是新增功能,也不是修改bug的代碼變動(dòng))
  • test:增加測(cè)試
  • chore:構(gòu)建過(guò)程或輔助工具的變動(dòng)
Type
  • feat:新功能(feature)

  • fix:修補(bǔ)bug

  • docs:文檔(documentation)

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

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

  • test:增加測(cè)試

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

Scope

用來(lái)說(shuō)明本次Commit影響的范圍虚茶,即簡(jiǎn)要說(shuō)明修改會(huì)涉及的部分。這個(gè)本來(lái)是選填項(xiàng)仇参,但從AngularJS實(shí)際項(xiàng)目中可以看出基本上也成了必填項(xiàng)了嘹叫。

Subject

用來(lái)簡(jiǎn)要描述本次改動(dòng),概述就好了诈乒,因?yàn)楹竺孢€會(huì)在Body里給出具體信息罩扇。并且最好遵循下面三條:

  • 以動(dòng)詞開(kāi)頭,使用第一人稱(chēng)現(xiàn)在時(shí)怕磨,比如change喂饥,而不是changed或changes

  • 首字母不要大寫(xiě)

  • 結(jié)尾不用句號(hào)(.)

Body

<body>里的內(nèi)容是對(duì)上面subject<subject style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">里內(nèi)容的展開(kāi),在此做更加詳盡的描述肠鲫,內(nèi)容里應(yīng)該包含修改動(dòng)機(jī)和修改前后的對(duì)比员帮。</subject>

Footer

footer里的主要放置不兼容變更Issue關(guān)閉的信息,參考下面兩個(gè)例子

image
image
Revert

此外如果需要撤銷(xiāo)之前的Commit导饲,那么本次Commit Message中必須以revert:開(kāi)頭捞高,后面緊跟前面描述的Header部分,格式不變帜消。并且棠枉,Body部分的格式也是固定的,必須要記錄撤銷(xiāo)前Commit的SHA值泡挺。

實(shí)踐利器

上面就是AngularJS目前的Commit規(guī)范辈讶,相信第一次接觸的話不免會(huì)有些頭大,這時(shí)如果有什么能Step by Step的提醒或者可視化的演示就好了娄猫。OK贱除,你來(lái)對(duì)地兒了生闲,現(xiàn)在就來(lái)說(shuō)說(shuō)如何把規(guī)范變?yōu)榭蓤?zhí)行的具體步驟!

二月幌、工欲善其事碍讯,必先利其器 - Commitizen

大量的代碼提交,必然會(huì)產(chǎn)生大量的commit log扯躺,而每一次commit是階段性的Ending捉兴,應(yīng)記錄著這一階段所完成的事以及關(guān)注點(diǎn),盡可能詳細(xì)具體录语;且提供更多的歷史信息倍啥,方便快速瀏覽;可以過(guò)濾某些commit(比如文檔改動(dòng))澎埠,便于快速查找信息虽缕;可以直接從commit生成Change log。所以log的格式就是關(guān)鍵所在蒲稳,而Commitizen可以完美的解決這些問(wèn)題氮趋。

Commitizen是什么?

是一個(gè)格式化commit message的工具江耀。它的安裝需要NPM的支持剩胁,NPM是Node.js的包管理工具,所以首先安裝node.js决记,下載對(duì)應(yīng)系統(tǒng)的包摧冀,安裝即可。
命令安裝Node.js:

brew install node

Commitizen安裝

npm install -g commitizen

安裝changelog系宫,是生成changelog的工具

npm install -g conventional-changelog
npm install -g conventional-changelog-cli

執(zhí)行

npm ls -g -depth=0

檢驗(yàn)上面兩個(gè)工具是否安裝成功索昂,得到結(jié)果如下,表示成功:

/usr/local/lib
├── commitizen@2.9.6
├── conventional-changelog@1.1.7
├── conventional-changelog-cli@1.3.5
└── npm@5.5.1

然后扩借,運(yùn)行下面命令椒惨,使其支持Angular的Commit message格式。

commitizen init cz-conventional-changelog --save --save-exact

但是注意潮罪,因?yàn)閏ommitizen工具是基于Node.js的康谆,而我們iOS項(xiàng)目工程目錄下是沒(méi)有package.json文件,所以會(huì)報(bào)錯(cuò):

npm WARN saveError ENOENT: no such file or directory, open '/Users/Elite/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/Users/Elite/package.json'

對(duì)于此種錯(cuò)誤嫉到,創(chuàng)建一個(gè)空的package.json文件沃暗,然后進(jìn)入到項(xiàng)目目錄,執(zhí)行

npm init --yes

會(huì)生成項(xiàng)目對(duì)應(yīng)項(xiàng)目的package.json何恶,將項(xiàng)目目錄下產(chǎn)生的package.json的內(nèi)容寫(xiě)入到自己建的package.json(/User/Elite/package.json)中孽锥,如果有多個(gè)項(xiàng)目,將各項(xiàng)目生成的package.json內(nèi)容寫(xiě)入到package.json中,下面是我的配置(/User/Elite/package.json):

[{
  "name": "salary",
  "version": "1.0.0",
  "description": "> v1.0 涵蓋所有老師(非中教)的基本工資惜辑、獎(jiǎng)勵(lì)工資唬涧、懲罰工資。",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git@***.***.com:erp/salary.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "cz-conventional-changelog": "^2.1.0"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  },
  "dependencies": {}
},
{
  "name": "ats",
  "version": "1.0.0",
  "description": "composer.json composer配置 vendor 第三方類(lèi)庫(kù)",
  "main": "index.js",
  "directories": {
    "test": "tests"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git@***.***.com:ats/ats.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}]

然后進(jìn)入到你要操作的項(xiàng)目目錄盛撑,執(zhí)行

conventional-changelog -p angular -i CHANGELOG.md -s

此時(shí)項(xiàng)目中多了CHANGELOG.md文件碎节,表示生成 Change log成功了。以后抵卫,凡是用到git commit 命令的時(shí)候統(tǒng)一改為git cz,然后就會(huì)出現(xiàn)選項(xiàng)狮荔,生成符合格式的Commit Message。實(shí)例如下:

? Select the type of change that you're committing: (Use arrow keys)
? feat:     A new feature 
  fix:      A bug fix 
  docs:     Documentation only changes 
  style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) 
  refactor: A code change that neither fixes a bug nor adds a feature 
  perf:     A code change that improves performance 
  test:     Adding missing tests or correcting existing tests

然后按操作執(zhí)行介粘,即可產(chǎn)生change log轴合。如果最后產(chǎn)生一個(gè)這樣的錯(cuò)誤:

Error: Could not resolve /Users/Elite/web/node_modules/cz-conventional-changelog. 
Cannot find module '/Users/Elite/web/node_modules/cz-conventional-changelog'

只需做個(gè)軟連接即可:

ln -s /Users/Elite/node_modules /Users/Elite/web/node_modules

使用

在代碼更改后,提交commit message的時(shí)候碗短,不再使用git commit -m方法,而是git cz题涨,將會(huì)出現(xiàn)交互式選項(xiàng)偎谁,讓你選擇或者輸入信息,給你一個(gè)完善的commit message纲堵。示例動(dòng)圖:


相當(dāng)犀利

OK巡雨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市席函,隨后出現(xiàn)的幾起案子铐望,更是在濱河造成了極大的恐慌,老刑警劉巖茂附,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件正蛙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡营曼,警方通過(guò)查閱死者的電腦和手機(jī)乒验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒂阱,“玉大人锻全,你說(shuō)我怎么就攤上這事÷济海” “怎么了鳄厌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妈踊。 經(jīng)常有香客問(wèn)我了嚎,道長(zhǎng),這世上最難降的妖魔是什么响委? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任新思,我火速辦了婚禮窖梁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夹囚。我一直安慰自己纵刘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布荸哟。 她就那樣靜靜地躺著假哎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍历。 梳的紋絲不亂的頭發(fā)上舵抹,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音劣砍,去河邊找鬼惧蛹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刑枝,可吹牛的內(nèi)容都是我干的香嗓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼装畅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼靠娱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掠兄,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤像云,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蚂夕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迅诬,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年婿牍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了百框。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牍汹,死狀恐怖铐维,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慎菲,我是刑警寧澤嫁蛇,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站露该,受9級(jí)特大地震影響睬棚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一抑党、第九天 我趴在偏房一處隱蔽的房頂上張望包警。 院中可真熱鬧,春花似錦底靠、人聲如沸害晦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)壹瘟。三九已至,卻和暖如春鳄逾,著一層夾襖步出監(jiān)牢的瞬間稻轨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工雕凹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殴俱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓枚抵,卻偏偏與公主長(zhǎng)得像粱挡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俄精,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355