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

Git特定branch基于commit级别的自定义统计实现方案咨询

基于Git Commit增量统计自定义数据的优化方案

核心思路:利用Git的diff与对象系统,只处理变更内容

不需要切换worktree或扫描整个仓库,直接通过Git命令提取每个commit的增量变更,仅分析变更的文件内容,就能高效统计TODO这类注释的演变情况。

具体实现步骤

  1. 按顺序遍历目标分支的所有commit
    用git log --reverse <分支名>可以从首次commit开始,按提交顺序遍历目标分支的所有commit,--reverse参数确保处理顺序从最早到最晚。

  2. 提取单个commit的变更文件列表
    对每个commit,执行git diff-tree -r --name-only --no-commit-id <commit哈希>^!,获取该commit中新增、修改、删除的文件路径。其中^!表示只对比当前commit与其父commit的差异。

  3. 分析变更文件的行级差异

    • 若只关注TODO数量的变化:用git diff <commit哈希>^ <commit哈希> -- <文件路径>获取文件的行变更,统计新增行(以+开头)中的TODO数量,减去删除行(以-开头)中的TODO数量,累加后更新当前commit的总TODO数。
    • 若需要精确统计当前commit的总TODO数:先统计初始commit的基准TODO数,之后每个commit仅通过增量变化更新总数,无需重复扫描全量文件。
  4. 脚本化实现示例
    以下是一个bash脚本框架,用于追踪每个commit的TODO数量:

    #!/bin/bash
    TARGET_BRANCH="main"
    # 获取初始commit并统计基准TODO数
    INIT_COMMIT=$(git rev-list --max-parents=0 $TARGET_BRANCH)
    TODO_TOTAL=$(git show $INIT_COMMIT | grep -c "TODO")
    echo "$INIT_COMMIT $TODO_TOTAL"
    
    # 遍历后续所有commit
    git log --reverse --skip=1 --format="%H" $TARGET_BRANCH | while read COMMIT_HASH; do
        # 遍历当前commit的变更文件
        git diff-tree -r --name-only --no-commit-id $COMMIT_HASH^! | while read FILE_PATH; do
            # 统计新增的TODO数量
            ADD_TODO=$(git diff $COMMIT_HASH^ $COMMIT_HASH -- $FILE_PATH | grep "^+" | grep -c "TODO")
            # 统计删除的TODO数量
            DEL_TODO=$(git diff $COMMIT_HASH^ $COMMIT_HASH -- $FILE_PATH | grep "^-" | grep -c "TODO")
            TODO_TOTAL=$((TODO_TOTAL + ADD_TODO - DEL_TODO))
        done
        echo "$COMMIT_HASH $TODO_TOTAL"
    done
    

额外优化建议

  • 过滤无关文件:在git diff-tree后添加--diff-filter=ACM,只关注新增、修改、复制的文件,跳过已删除的文件(若无需统计删除的TODO)。
  • 缓存计算结果:如果需要重复统计,可将每个commit的TODO数写入缓存文件,避免重复计算。
  • 并行处理:针对commit数量极多的场景,可尝试并行处理单个commit的diff分析,注意控制Git命令的并发量避免资源占用过高。

内容的提问来源于stack exchange,提问作者αλεχολυτ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:00:25