You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:18:20