使用 Git Diff 產生程式清單
0 |
分享私房小工具程式。
正式上線流程常需交付程式碼清單及異動程式碼,過去 TFS TFVC 時代我寫過類似的工具,改用 Git 之後,先前已分享過匯出 Git Commit 檔案並維持資料夾結構的寫法,當時是使用 PowerShell 加 xcopy。這回想更上層樓,兩個願望一次滿足 - 依資料夾結構放置異動檔案並產生 Excel 清單。評估後決定用 Git.exe + PowerShell 聯手完成。
拿前幾天的 ASP.NET Core CRUD 傻瓜範例的 Github 專案來練習,我又加了兩次 Commit (330d888 新增 wwwroot/Help.html、412f446 刪除 favicon.ico) 共計九次 Commit。假設我曾在 Scaffolding 產生 CRUD 介面 (Commit 39f7a8d,Tag InitDeploy) 時部署過一次,故這次要提交 39f7a8d 到 412f446 (HEAD) 之間累積的修改異動。使用 git diff --name-status commitId1 commitId2 可以產生兩次 Commit 間的檔案變化及檔案路徑,第一欄為狀態: M 表示 Modified、A 表示 Added、D 表示 Deleted,git diff 結果即為上次部署到目前異動過的檔案: (註:完整狀態包含 Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), Type Chageed (i.e. regular file, symlink, submodule, …) (T), Unmerged (U), Unknown (X), Pairing Broken (B),目前我先關注 A、D、M 三種,其餘日後遇到再說,參考)
加上導向 Pipeline 將 git diff 結果存入 CodeList.txt:
git diff --name-status 39f7a8d HEAD > D:\CodeList.txt
CodeList.txt 可人工編輯增減項目,保留修改彈性在實務上挺重要的(本例中我便移除了 .gitignore 及 README.md),修校過的清單文字檔即為產生程式清單及複製檔案的依據。我寫了以下的 PowerShell,讀取 CodeList.txt 產生 CodeList.csv 並將檔案依其資料夾結構複製到指定的資料夾:
param (
[Parameter(Mandatory=$True)]
[string] $diffFile,
[Parameter(Mandatory=$True)]
[string] $srcFolder,
[Parameter(Mandatory=$True)]
[string] $targetFolder,
[Parameter(Mandatory=$True)]
[string] $resultFolder
)
#讀取 git diff --name-status 結果
$files = Get-Content $diffFile -Encoding UTF8
#清單陣列
$list = @()
foreach ($file in $files)
{
#使用 .NET Regex 解析取出狀態及路徑
$match = [System.Text.RegularExpressions.Regex]::Match($file, "^(?<s>[ACDMRTUXB])\s+(?<p>.+)$")
if (-not $match.Success) { continue }
$relFilePath = $match.Groups["p"].Value.Replace("/", "\")
$status = $match.Groups["s"].Value.Replace("A", "新增").Replace("M", "修改").Replace("D", "刪除")
#產生程式碼清單
$object = New-Object PSObject -Property @{
Path = $relFilePath
Desc = ""
Status = $status
Remark = ""
}
$list += $object
#複製檔案
if ($status -ne "刪除") {
#小技巧:New-Item 可一次產生所需的目錄階層,取代逐層檢查目錄是否存在及建立
New-Item -ItemType File -Path "$targetFolder\$relFilePath" -Force | Out-Null
Copy-Item "$srcFolder\$relFilePath" "$targetFolder\$relFilePath" -Force | Out-Null
}
}
#產生CSV
$list |
Select @{N='路徑';E={$_.Path}},@{N='說明';E={$_.Desc}},@{N='狀態';E={$_.Status}},@{N='備註';E={$_.Remark}} |
Export-Csv "$resultFolder\CodeList.csv" -Encoding UTF8 -NoTypeInformation
執行方式如下:
以 Excel 開啟 CodeList.csv,補上說明可作為程式清單文件:
對映的程式檔也依原有目錄結構擺放完畢:
就醬,把一項繁瑣手工半自動化,心中升起自己正在"增進人類全體之生活"的錯覺,還累積了一些 PowerShell 開發經驗,敲開薰。
Example of using PowerShell to genereate code list Excel document from git diff result.
Comments
Be the first to post a comment