如何修正Shell脚本按日期统计Git活动无结果的问题
问题原因
你的判断是对的。Git 解析YYYY-MM-DD格式的日期参数时,会默认补全时间为当日00:00:00:--since匹配大于等于起始时间的提交,--before匹配小于结束时间的提交。两个参数传入同一个日期时,实际查询区间是[当日0点, 当日0点),属于无效空区间,自然匹配不到任何提交。
修正后可直接运行的脚本
#!/bin/bash # 拉取仓库所有去重后的提交日期,按时间正序排列 dates=$(git log --date=short --pretty=format:%ad | uniq | sort) IFS=$'\n' # 输出统计结果表头 echo "Date;Files changed;Lines added;Lines deleted;Total lines (delta);Add./Del. ratio (1:n);Commit count" for date in $dates do # 计算次日日期作为查询截止点,覆盖当日全天[当日0点, 次日0点) next_date=$(date -d "$date +1 day" +%Y-%m-%d) # 统计当日文件变更、代码增删行数据 result=$(git log --no-merges --shortstat --since="$date" --before="$next_date" | grep -E "fil(e|es) changed" | awk '{ files+=$1; inserted+=$4; deleted+=$6; delta+=$4-$6; # 处理新增行数为0的边界情况,避免除以0报错 if(inserted > 0) ratio=deleted/inserted; else ratio="N/A" } END {printf "%s;%s;%s;%s;%s", files, inserted, deleted, delta, ratio }' -) # 统计当日总提交数 countCommits=$(git rev-list --count --no-merges --since="$date" --before="$next_date" HEAD) if [[ ${result} != ';;;;' ]] then echo "$date;$result;$countCommits" fi done # 恢复shell默认的字段分隔符配置,避免影响后续命令执行 unset IFS
注:如果是macOS环境,计算次日日期的命令需要替换为
next_date=$(date -j -v+1d -f "%Y-%m-%d" "$date" +%Y-%m-%d),macOS自带的BSD date和GNU date参数规则不兼容。
主要修改点
- 新增次日日期计算逻辑,把查询区间调整为完整自然日,解决原脚本区间为空的核心问题
- 修复原脚本提交数统计错误:原逻辑用
git shortlog -sn是按作者分组统计,直接取$1只会拿到排序第一的作者的提交数,改用git rev-list --count直接统计区间内全量提交数,结果准确 - 新增除以0容错:当日无新增代码行时,增删比显示为
N/A,避免awk运行报错 - 对日期列表增加排序逻辑,输出结果按日期从早到晚排列,可读性更好
- 脚本末尾恢复默认IFS配置,避免修改shell环境变量影响后续命令执行
- 移除冗余的
echo -e参数,当前输出无特殊转义字符,不需要加该参数
内容的提问来源于stack exchange,提问作者Nat Aes
相关产品推荐
相关产品推荐

