腳本架構三層設計
| 腳本 | 職責 | 輸出 |
GetStat.sh | 主控腳本,遍歷專案彙總 CSV | goluk.csv |
GetAllByMon.sh | 單專案統計:提交次數、代碼增刪行 | commit.txt detail.txt every.txt |
Getrepo.sh | 首次批次 clone 所有倉庫 | 本地鏡像目錄 |
目錄結構範例
.
├── GetStat.sh
├── cdc.txt # 專案名 + 相對目錄
├── android/
│ ├── GetAllByMon.sh
│ ├── cdc.txt # Git URL 列表
│ └── workspace-goluk/ # 已 clone 倉庫
└── firmware/
├── GetAllByMon.sh
└── ...
關鍵 Git 指令解析
1. 提交次數統計(按月)
git log --pretty='%aN' --since=2016-01-01 --until=2016-01-31 \
| sort | uniq -c | sort -k1 -nr
2. 總增刪行數
git log --author='^.*' --pretty=tformat: --numstat \
--since=2016-01-01 --until=2016-01-31 \
| awk '{add+=$1; del+=$2} END {print add, del, add-del}'
3. 個人明細增刪行
git log --pretty='tformat:%aN' --numstat \
--since=2016-01-01 --until=2016-01-31 \
| awk '!/^$/ {
if ($1 ~ /^[a-zA-Z]+$/) { # 作者行
if (NR>1) print prev, adds, dels
prev=$1; adds=0; dels=0
} else { # numstat 行
adds+=$1; dels+=$2
}
} END {print prev, adds, dels}'
彙總邏輯
# commit.txt → 每人總提交次數
awk '{sum[$2]+=$1} END {for(i in sum) print i, sum[i]}' commit.txt | sort -k2 -nr > total.txt
# every.txt → 每人總增刪行
awk '!/^$/ { ... }' every.txt \
| awk '{cnt[$1]++; adds[$1]+=$2; dels[$1]+=$3}
END {for(i in cnt) printf "%-20s %10d %10d %10d %10d\n", i, cnt[i], adds[i], dels[i], adds[i]-dels[i]}'
使用前提與注意事項
- 統計機器需具備**所有倉庫讀取權限**(SSH Key 或 Token)
cdc.txt 格式:專案名 相對目錄,**尾行不可留空**
- 分支可透過參數
$2 指定,預設 develop
- 月份參數
$1 (1-12),自動拼接 2016-MM-01 ~ 2016-MM-31
常見問題排查
| 現象 | 原因 | 對策 |
| 統計結果為 0 | 倉庫未 clone 或分支錯誤 | 先執行 Getrepo.sh,確認 git checkout $Branch 成功 |
| 作者名大小寫不一致 | Git 設定差異 | 統計前統一 git config --global user.name 或後處理合併 |
| 跨年月份統計 | 腳本僅支援單月 | 修改 --since/--until 邏輯支援年月範圍 |
將三支腳本納入 Jenkins/Cron 定時任務,即可實現團隊程式碼貢獻度自動化月報,支援多專案、多倉庫、多彎道並行開發場景。