git commit message的規范與校驗

git commit message格式

  • git每次提交代碼,都必須寫commit message(提交說明),用來說明本次提交的目的,否則不允許提交。
 git commit -m "hello world"

上面代碼的-m 參數,就是用來指定commit message的。

  • commit message的寫法規范有許多,本文介紹目前使用最廣的,比較合理和系統化的一種規范:Angular 規范。
一、Commit message 格式
  <type>(<scope>): <subject>
  <空行>
  <body>
  <空行>
  <footer>

其中,Header 是必需的,Body 和 Footer 可以省略。

1.1 Header

Header部分只有一行,包括三個字段:type (必需)、scope(可選)、subject(必需)

  • type

type 用于說明commit的類別,允許使用以下7個標識。

   feat:新功能(feature)
   fix:修補bug
   docs:文檔(documentation)
   style: 格式(不影響代碼運行的變動)
   refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
   test:增加測試
   chore:構建過程或輔助工具的變動
  • scope

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

  • subject

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

注意事項:

  1. 以動詞開頭,使用第一人稱現在時,比如change,而不是changed或changes
  2. 第一個字母小寫
  3. 結尾不加句號(.)
1.2 Body

Body 部分是對本次 commit 的詳細描述,可以分成多行。(換行用\n)

1.3 Footer

Footer 部分只用于兩種情況。

  • 不兼容變動

如果當前代碼與上一個版本不兼容,則 Footer 部分以BREAKING CHANGE開頭,后面是對變動的描述、以及變動理由和遷移方法。

  • 關閉Issue

如果當前 commit 針對某個issue,那么可以在 Footer 部分關閉這個 issue。

  Closes #234

也可以一次關閉多個 issue 。

  Closes #123, #245, #992

二、Commitizen

我們知道了提交規范,就需要通過工具生成和約束。通過借助工具commitizen/cz-cli的安裝之后,就會產生規范性的提示語句,幫助我們形成規范的commit message。

Commitizen是一個撰寫合格 Commit message 的工具。

全局安裝,命令如下:

  npm install -g commitizen cz-conventional-changelog

查看是否安裝成功

  npm ls -g -depth=0
1.png

全局模式下, 需要 ~/.czrc 配置文件, 為 commitizen 指定 Adapter比如: cz-conventional-changelog (一個符合 Angular團隊規范的 preset)。

  echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

安裝成功后,在對應的git項目中,凡是用到git commit命令,一律改為使用git cz.這時,就會出現選項,用來生成符合格式的 Commit message。

2.png

三、校驗Commit message 是否符合規范

Commitlint

commitlint用于檢查我們的commit message是否符合提交規范,如果不符合,則直接拒絕提交。

全局安裝

  npm install -g @commitlint/cli @commitlint/config-conventional

生成配置文件

  echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

你也可以在commitlint.config.js制定提交message規范

  "module.exports = {extends: ['@commitlint/config-conventional']}"

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      "feat", "fix", "docs", "style", "refactor", "test", "chore", "revert"
    ]],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never']
  }
};

上面我們就完成了commitlint的安裝與提交規范的制定。但檢驗commit message的最佳方式是結合git hook,所以需要配合Husky。

Husky

husky繼承了Git下所有的鉤子,在觸發鉤子的時候,husky可以阻止不合法的commit,push等等。

創建package.json文件
進入到git項目中,執行

  npm init --yes

會生成項目對應項目的package.json

進入項目中,安裝husky

  npm install husky

安裝成功后需要在項目的package.json中配置:

  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS"
    }
  }

然后我們正常操作git

  git add .
  git commit -m "test"

上面message不符合提交規范,所以會報錯如下:


3.png

起到了校驗的作用。

四、生成Change Log

如果你的所有 Commit 都符合 Angular 格式,那么發布新版本時, Change log 就可以用腳本自動生成

生成的文檔包括以下三個部分。

  • New features
  • Bug fixes
  • Breaking changes

每個部分都會羅列相關的 commit ,并且有指向這些 commit 的鏈接。當然,生成的文檔允許手動修改,所以發布前,你還可以添加其他內容。

conventional-changelog 就是生成 Change log 的工具。

安裝changelog

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

進入git項目目錄下,執行命令:

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

以上命令中參數-p angular用來指定使用的 commit message 標準為angular,參數-i CHANGELOG.md表示生成的 changelog輸出到 CHANGELOG.md 文件中。
命令執行完會在項目中生成CHANGELOG.md文件

4.png

注意:上面這條命令產生的 changelog 是基于上次 tag 版本(本地的tag版本)之后的變更(Feature、Fix、Breaking Changes等等)所產生的,如果你想生成之前所有 commit 信息產生的 changelog 則需要使用這條命令:

  conventional-changelog -p angular -i CHANGELOG.md -w -r 0
7.png

由于命令過長,可以在package.json中配置scripts

  
{
  "scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
  }
}

以后,直接運行下面的命令即可。

  npm run changelog

standard-version 也是生成 Change log 的工具。

正常情況下,版本發布流程如下:

  1. git pull origin master
  2. 根據 pacakage.json 中的 version 更新版本號,更新 changelog
  3. git add -A,然后git commit
  4. git tag打版本操作
  5. push版本tag和master分支到遠程倉庫

conventional-changelog工具需要在手動修改了pacakage.json版本號,生成了changelog之后,手動commit及打tag。但standard-version工具會自動完成2、3、4項的工作。如果再配合本地的shell腳本,則可以自動的完成一系列的版本發布工作。

安裝(推薦全局安裝)

  npm i -g standard-version

在package.json中配置:

  "scirpt": {
    ...,
    "release": "standard-version"
}

使用:

  npm run release

最終會在git項目中生成CHANGELOG.md文件

6.png

跟conventional-changelog生成的文件差不多。

更詳細的用法:

--first-release, -f 第一次打版本

  standard-version -f

生成與package.json中版本號一致的tag。本地不能存在一樣版本號的tag。

--release-as, -r 指定版本號

默認情況下,工具會自動根據 主版本(major),次版本( minor) or 修訂版(patch) 規則生成版本號,例如如果你package.json 中的version 為 4.3.1, 那么執行后版本號則是:4.4.0。

standard-version -r minor
10.png
8.png

查看生成的tag:自動生成v4.4.0


9.png

查看提交記錄:修改已經自動提交


11.png

最后提交本地代碼與tag

  git push origin master
  git push origin --tags

會在github上看到提交記錄與tag。

也可以固定版本:

  standard-version -r 5.0.0
  standard-version -r 5.0.0-test

會生成v5.0.0和5.0.0-test版本

--prerelease, -p 預發版本命名

用來生成預發版本, 如果當期的版本號是 4.4.0,例如

  standard-version -p
  standard-version -p alpha
  standard-version -p test

會生成v4.4.1-0、v4.4.1-alpha.0、v4.4.1-test.0。其中alphatest代表預發布版本的名稱。

12.png

--tag-prefix, -t 版本 tag 前綴

默認有一個前綴v,如果不想有任何前綴,直接用-t即可。
當前版本4.4.1

  standard-version -t "stable-"
  standard-version -t "test-"

生成:test-5.0.0、stable-5.1.0,其中 test是第一次作為前綴使用,所以會生成一個主版本。

綜合使用:

  standard-version -t 'stable-' -r 6.1.0

生成 stable-6.1.0

--dry-run

  standard-version --dry-run

此命令會在允許你在后臺查看將運行哪些步驟,不會修改package.json、changlog,也不會提交任何代碼及生成tag。可以其他命令結合使用。

  standard-version -r 9.0.0 --dry-run

可用于查看該命令是否滿足你的需求。


13.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容