---
title: Commit標準化及CHANGELOG.md自動生成
tags: git commit
---
# Commit標準化及CHANGELOG.md自動生成
[Angular CHANGELOG.md](https://github.com/angular/angular/blob/master/CHANGELOG.md)
Git commit時每次都需要添加描述,通常在描述中我們會簡單的描述當前提交的目的。而Commit message做得好就有以下好處。
1. 提供較詳細且可閱讀的版本內容供閱讀
2. 過濾部分commit,以便於快速查找
3. 直接從commit message生成 CHANGELOG.md。這也是我們接下來談到的內容。
## Commit Description 自動生成
#### Step 1 下載npm包
該動作會在本機上提供git cz互動式生成commit message的指令(如果已安裝在全域則該動作可跳過)
。但該指令需要配置模板與規則,所以接下來我們進行下一步來配置這部分。
```shell
npm install commitizen -g
```
#### Step 2 在專案根目錄裡執行已下命令,使其支援angular的commit message格式。
```shell
commitizen init cz-conventional-changelog --save --save-exact
```
#### Step 3 之後git commit就可以改成以下指令來進行
```shell
git cz
```
## Commit Description 驗證
#### Step 1 下載npm包
每一次提交的訊息都需要經過較驗,這是避免在合作的專案上有非標準化的提交訊息。進而丟失這些更新的訊息在未來生成的CHANGELOG.md中。所以接下來我們會透過husky來提供commit執行後的生命週期鉤子,並檢查該commit訊息中是否符合格式。
```shell
npm install validate-commit-msg --save-dev
npm install husky --save-dev
```
> **注意:validate-commit-msg已標記為棄用,可使用commitlint取代。**
#### Step 2 package.json新增githook腳本,使用validate-commit-msg進行驗證
```json
"script": {
"commitmsg": "validate-commit-msg"
}
```
或是husky新版建議的寫法
```json
"husky": {
"hooks": {
"commit-msg": "validate-commit-msg"
}
}
```
## 利用Commit訊息生成 CHANGELOG.md @deprecated
#### Step 1 下載npm包
這邊的步驟採用conventional-changelog-cli所提供的conventional-changelog指令,當然目前在網上還有其他方法可以生成 CHANGELOG,而且更為方便。這邊我們先舉一個比較繁瑣的方式,理解了之後也可以選擇較為方便的方式生成。
```shell
npm install conventional-changelog-cli -g
```
#### Step 2 使用以下指令來建立 CHANGELOG,且只會在CHANGELOG頭部更新內容
```shell
conventional-changelog -p angular -i CHANGELOG.md -s -r 0
```
## 官方建議操作流程
[conventional-changelog-cli](https://www.npmjs.com/package/conventional-changelog-cli)
#### 添加lifecycle hook
```json
{
"script":{
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md"
}
}
```
#### 如何進行版本號更新?
1. git cz(commit)
2. pull tag
3. npm version major/minor/patch
4. git push
## 注意
1. 生成 CHANGELOG.md 之前,必需用npm version [type] 更新版本號(在Git上tag出版本號)。否則change log的內容不會有版本的分別。
2. 用npm version打版本號時,該版本號之前的更新會被歸類在該版本號內。
3. tag版本號避免出現第三個"."",如 XX.XX.XX.XX 0.1.12.20200810,生成的changelog會出現所有變更都在最後一個版本號內。
4. tag版本之後的更新並不會立即生成在CHANGELOG.md上面,除非下一次tag version出現。
5. husky本身提供自動更新husky config,僅需執行已下指令。
```shell
npx --no-install husky-upgrade
```
## 使用standard-version完成提交流水線
#### 使用的好處有
1. 上版本號
2. 更新 CHANGELOG.md(依據versionrc設定)
3. commit
#### Step 1 下載npm包
```shell
npm install standard-version --save-dev
```
#### Step 2 添加.versionrc or .versionrc.json
```json=
{
"changelogHeader": "# Changelog ",
"compareUrlFormat": "...",
"commitUrlFormat": "...",
"issueUrlFormat": "...",
"type": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "chore", "hidden": true },
{ "type": "docs", "section": "Document", "hidden": true },
{ "type": "style", "hidden": true },
{ "type": "refactor", "hidden": true },
{ "type": "perf", "hidden": true },
{ "type": "build", "hidden": true },
{ "type": "test", "hidden": true }
]
}
```
#### Step 3 之後就可以用npm
- [Standard Version README.md](https://github.com/conventional-changelog/standard-version)
- [conventional-changelog-config-spec README.md](https://github.com/conventional-changelog/conventional-changelog-config-spec/tree/master/versions/2.1.0)
1. 參考Standard Version的說明文件表示可用.versionrc或.versionrc.json或.versionrc.js作為config設定檔。
2. config設定檔內容如何配置請看conventional-changelog-config-spec README.md
## 參考網址
- [(推薦閱讀)(知乎)优雅的提交你的 Git Commit Message](https://zhuanlan.zhihu.com/p/34223150)
- [(掘金)针对具体项目配置commit规范和changelog](https://juejin.im/post/6844903993009766414#heading-7)
- [Commit message 和 Change log 编写指南<最初參考,但版本過舊。概念部分依舊可以參考>](http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html)
- [(掘金)规范你的 commit message 并且根据 commit 自动生成 CHANGELOG.md](https://juejin.im/post/5bd2debfe51d457abc710b57)
- [(CSDN)npm version常用命令及用法示例](https://blog.csdn.net/weixin_40817115/article/details/90384398)
- [(ITREAD01)規範你的 commit message 並且根據 commit 自動生成 CHANGELOG](https://www.itread01.com/lfccl.html)
- [自訂義repository url or bugs url](https://developer.aliyun.com/mirror/npm/package/conventional-changelog-custom-config)