通过gitlog,查看只修改.conf的commit占总提交的占比

发布于:2025-09-08 ⋅ 阅读:(15) ⋅ 点赞:(0)
#!/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>0False,不输出

处理提交2:

  • total_files = 2
  • conf_count = 2 (settings.conf + database.conf)
  • 条件:2>0 && 2==2 && 2>0True,输出"1"

处理提交3:

  • total_files = 1
  • conf_count = 0
  • 条件:1>0 && 0==1 && 0>0False,不输出

最终结果:

  • AWK 输出:1
  • wc -l 统计行数:1
  • 所以 conf_only_commits = 1

简化理解

这个命令的目的就是:

  1. 获取每个提交修改的文件列表
  2. 检查每个提交是否只修改了 .conf 文件
  3. 如果是,就计数+1
  4. 最后统计总数

核心判断条件: conf_count==total_files && conf_count>0

  • 意思是:.conf文件数量 = 总文件数量,且至少有1个.conf文件
  • 这样就确保了该提交只修改了.conf文件,没有修改其他类型的文件

网站公告

今日签到

点亮在社区的每一天
去签到