#!/bin/bash
# 1. 获取总提交数
total_commits=$(git log --oneline | wc -l)
# 2. 获取只修改 .conf 文件的提交数
conf_only_commits=$(git log --name-only --pretty=format: | \
awk 'BEGIN{RS=""; FS="\n"} {
conf_count=0;
total_files=0;
for(i=1;i<=NF;i++) {
if($i!="") {
total_files++;
if($i ~ /\.conf$/) conf_count++
}
}
if(total_files>0 && conf_count==total_files && conf_count>0) print "1"
}' | wc -l)
# 3. 计算占比
if [ $total_commits -gt 0 ]; then
percentage=$(echo "scale=2; $conf_only_commits * 100 / $total_commits" | bc)
echo "总提交数: $total_commits"
echo "只修改.conf文件的提交数: $conf_only_commits"
echo "占比: $percentage%"
else
echo "没有找到提交记录"
fi
我来详细解释这段命令的工作原理:
命令分解
1. git log --name-only --pretty=format:
git log --name-only --pretty=format:
--name-only
: 只显示被修改的文件名--pretty=format:
: 不显示提交信息(作者、日期、消息等),只留下文件名
输出示例:
file1.txt
config.conf
main.py
test.py
settings.conf
database.conf
2. AWK 脚本详解
BEGIN{RS=""; FS="\n"}
RS=""
: 记录分隔符设为空行,这样每个提交的文件列表被当作一条记录FS="\n"
: 字段分隔符设为换行符,每个文件名是一个字段
3. 主要逻辑
{
conf_count=0; # .conf 文件计数器
total_files=0; # 总文件计数器
# 遍历当前记录的所有字段(文件名)
for(i=1;i<=NF;i++) {
if($i!="") { # 如果文件名不为空
total_files++; # 总文件数+1
if($i ~ /\.conf$/) # 如果文件名以.conf结尾
conf_count++ # .conf文件数+1
}
}
# 判断条件:总文件数>0 且 .conf文件数==总文件数 且 至少有1个.conf文件
if(total_files>0 && conf_count==total_files && conf_count>0)
print "1" # 满足条件就输出"1"
}
完整流程示例
假设有以下提交历史:
提交1:
main.py
config.conf
提交2:
settings.conf
database.conf
提交3:
readme.txt
AWK 处理过程:
处理提交1:
total_files = 2
conf_count = 1
(只有config.conf)- 条件:
2>0 && 1==2 && 1>0
→ False,不输出
处理提交2:
total_files = 2
conf_count = 2
(settings.conf + database.conf)- 条件:
2>0 && 2==2 && 2>0
→ True,输出"1"
处理提交3:
total_files = 1
conf_count = 0
- 条件:
1>0 && 0==1 && 0>0
→ False,不输出
最终结果:
- AWK 输出:
1
wc -l
统计行数:1
- 所以
conf_only_commits = 1
简化理解
这个命令的目的就是:
- 获取每个提交修改的文件列表
- 检查每个提交是否只修改了
.conf
文件 - 如果是,就计数+1
- 最后统计总数
核心判断条件: conf_count==total_files && conf_count>0
- 意思是:.conf文件数量 = 总文件数量,且至少有1个.conf文件
- 这样就确保了该提交只修改了.conf文件,没有修改其他类型的文件