Mark Ku's Blog
在 ChatGPT 開啟在 Claude 開啟

利用 PowerShell 搭配 git log 指令,自動擷取兩個 Git tag 間的 commit 記錄,生成版本化 Release Note,解決人工撰寫耗時問題。若遇中文亂碼,可透過 git config --global i18n.commitencoding big5 及調整系統語系編碼解決。

優化開發流程系列,再也不用人工撰寫 Release Notes,本篇用Powershell 及 git log

問題

在功能開發完成,要準備部署到下一個環境時,目前都需要『人工記錄』異動了什麼項目,好讓功能在下一個環境發生問題時,可以快速追朔釋出那些功能所造成;為了讓開發人員專注在開發,我這邊用了Power Shell ,做了一個自動化腳本 在產生 Git tag ,並產生Release Note。

目前的版號機制

透過 git tag 去 trigger Cicd 主動去Build
b-3.0.1 => b-3.0.2
b為beta 環境,3.0為大版號,最後的數字則是小版號。

在撰寫腳本前,得先了解 Git 相關的指令

找出這兩個 Tag 間 Commit 了那些 Log

git log --pretty="%s (%h - %an)" "b-0.0.1..b-0.0.2" | grep -i -E '(bug|feature|support|study|task|design) #[0-9]+ '

P.S.後面可以加篩選條件,去找出相對應的log

找到我們上一個在 Beta 環境的版號

git describe --tags --abbrev=0 --match  "b-[0-9]*

實作中,遇到在power shell 中執行 git log 中文字顯示都是亂碼

  1. 因為git 預設編碼是 utf-8,而且們的Commit Message ,需要透過 git 指令設定為big5。
git config --global core.quotepath false 
git config --global gui.encoding big5
git config --global i18n.commit.encoding big5
git config --global i18n.logoutputencoding big5 
  1. 如果是英文作業系統,需要到控制台>系統管理>地區設定調整語系編碼。 Windows系統地區設定為中文繁體台灣

P.S. 也可以透過 chcp 950 指令來測試作業系統,是不是支援 big5 編碼

執行畫面

  1. 執行時,顯示上一版的 Beta 版號,並要求輸入此次進 Beta 的版號 PowerShell顯示上一版號並輸入新版號

  2. 執行完成 PowerShell顯示ReleaseNote產生成功訊息

  3. 成果 會將 Git log commit message ,自動附加在Release Note 的最上方 記事本顯示自動生成的 Release Notes 內容

Auto generate release note script

在過程開發過程中,我原先用了 DOS 指令去撰寫,真的寫的有點太痛苦,後來聽同事的建議採用 Power Shell,確實程式碼簡潔的很多,也節省了很多時間及力氣。

git config --global core.quotepath false 
git config --global gui.encoding big5
git config --global i18n.commit.encoding big5
git config --global i18n.logoutputencoding big5 
$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

$lastVersion = git describe --tags --abbrev=0 --match  "b-[0-9]*"
Write-Host "Last Version $lastVersion"

$newTag = Read-Host 'Please Enter New Git Tag Name. EX:b-3.0.48  '
# $lastVersion = Read-Host 'Please Enter lastVersion  '


# $newTag= "b-3.0.1"
# $lastVersion = git describe --tags --abbrev=0 --match  "b-[0-9]*"
Write-Host "$lastVersion "
git tag -f $newTag
$fullVersionNo = $newTag.Split("-")[1]
$versionCharArray =$fullVersionNo.Split(".")


$bigVersion = ($versionCharArray[0],$versionCharArray[1]) -join "."
Write-Host $bigVersion

[string[]]$lines = git log --pretty="%n|%h|%ai|%s" "$lastVersion..$newTag"
$datetimeNow = Get-Date -Format "dddd MM/dd/yyyy HH:mm K"
$owner = git config user.name
$newReleaseNote = New-Object System.Collections.ArrayList

# $newReleaseNote.Add("$lastVersion - $newTag")

$newReleaseNote.Add("Date: $datetimeNow")
$newReleaseNote.Add("Version: $fullVersionNo")
$newReleaseNote.Add("Owner: $owner")
$newReleaseNote.Add("")
$newReleaseNote.Add("Feature:")
foreach ($line in $lines) {
     $line = $line.Trim()
	 # $newReleaseNote.Add("$line")
     if ([String]::IsNullOrEmpty($line)) {
       continue
     }
     else
	 {
	 $Matches = $line.Split("|")
       $hash = $Matches[1]
       $datetime = $Matches[2]
       $subject = $Matches[3]
	   $newReleaseNote.Add("$datetime : $subject")
	   Write-Host "$hash / $datetime / $subject"
     }
     
 }
$newReleaseNote.Add("")
$newReleaseNote.Add("===================================")

@($newReleaseNote) +  (Get-Content -Encoding utf8  "./ReleaseNote/ChangeLog/$bigVersion.txt")  | Set-Content -Encoding utf8  "./ReleaseNote/ChangeLog/$bigVersion.txt"  

Write-Host "ReleaseNote 產生成功"

git config --global gui.encoding utf8
git config --global i18n.commit.encoding utf8
git config --global i18n.logoutputencoding utf8

作者

Mark Ku

10 年以上的軟體工程師,做過北美電商與 AI SaaS 訂閱收費系統。現在經營貳陸資訊有限公司(www.226network.com),幫小公司做系統、網站、LINE BOT 與 AI 自動化,也在這裡分享開發筆記與開源工具。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··655

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··574

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··318

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··234

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··231

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取
Mark Ku
··225

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1