📊 开源了一个 Git 代码统计神器,解决了团队代码量统计的 N 个痛点

📢 本文介绍一个全新的开源 Git 代码统计工具,支持多账户统计、智能工作量计算、缓存加速、导出报告等功能,完美解决了团队协作中代码量统计的各种痛点。

🤔 写在前面:为什么要做这个工具?

作为开发者,你是否遇到过这些场景:

痛点 1:老板要看开发成果

"这个月你写了多少代码?"

"这个项目各个成员的贡献度怎么样?"

"某某离职了,他的代码量有多少?"

传统方案的问题:

  • git log --author 只能看提交记录,看不到具体代码量
  • GitHub Insights 只能看仓库整体,无法按人员拆分
  • GitStats 等工具配置复杂,输出不直观

痛点 2:多账户统计困难

很多开发者有多个 Git 账户:

  • 公司电脑:zhangsan@company.com
  • 家里电脑:zhangsan@gmail.com
  • 临时账户:zs

传统方案: 只能一个个查,然后手动加总 😫

痛点 3:统计逻辑不合理

传统的 新增 - 删除 = 净增 存在严重问题:

python 复制代码
# 场景:重构代码
原来 1000 行代码
新增 200 行
删除 300 行
净增 = -100 ❌  # 负数?工作量为 0?

# 实际上:这是一次有价值的代码优化!

删除代码也是工作量! 但传统统计方式完全忽略了这一点。

痛点 4:统计速度慢

大型项目统计可能需要 10+ 分钟,每次调整参数都要重新等待 😤


基于这些痛点,我开发了这个 Git 代码统计工具,一次性解决所有问题!

✨ 核心功能

1️⃣ 双维度统计:累计工作量 + 当前代码量

📈 累计工作量(Historical Workload)

基于 git diff,统计历史提交中的所有变更:

  • ✅ 反映开发者的真实工作量
  • ✅ 包括已删除的代码
  • ✅ 适合评估贡献度、绩效考核

📊 当前代码量(Current Codebase)

基于 git blame,统计当前代码库中每行代码的作者:

  • ✅ 反映当前活跃的代码
  • ✅ 适合维护性评估
  • ✅ 了解代码库的构成

示例对比:

复制代码
张三的统计:
  累计工作量:15000 行(包括历史上写过但后来被删除的代码)
  当前代码量:8000 行(现在代码库中还存活的代码)
  
  ➡️ 说明:张三做了很多工作,包括重构和优化

2️⃣ 智能工作量计算算法

传统的 新增 - 删除 完全不合理,我们采用了智能算法

python 复制代码
# 根据文件变更类型采用不同策略
if 新建文件:
    工作量 = 新增 - 删除
elif 删除文件:
    工作量 = 0  # 删除整个文件不算工作量
elif 重命名文件:
    工作量 = 新增 - 删除
else:  # 修改文件 ⭐ 核心
    工作量 = 新增 × 0.9 + 删除 × 0.1

为什么是 0.9 和 0.1?

  • 新增代码 = 90% 权重(核心工作量)
  • 删除代码 = 10% 权重(体现重构、优化的价值)

实际效果:

ini 复制代码
场景 1:重构优化
  新增 200 行,删除 300 行
  传统算法:-100(工作量为 0)❌
  智能算法:200×0.9 + 300×0.1 = 210 ✅

场景 2:新功能开发
  新增 500 行,删除 50 行
  传统算法:450
  智能算法:500×0.9 + 50×0.1 = 455 ✅

场景 3:代码优化(删除冗余)
  新增 0 行,删除 200 行
  传统算法:-200(工作量为 0)❌
  智能算法:0×0.9 + 200×0.1 = 20 ✅

3️⃣ 多账户统计

一次性统计多个账户,自动汇总:

java 复制代码
输入:
  wangzc
  jusz@company.com
  xucongle
  huyulin@gmail.com

输出:
  ✅ 自动识别用户名和邮箱
  ✅ 支持详细模式(每个账户独立统计)
  ✅ 支持汇总模式(合并统计)

详细模式效果:

  • 每个账户独立的文件清单
  • 每个账户的代码类型分布(Java、Python、前端等)
  • 账户间的贡献度对比

4️⃣ 过滤合并提交(重要!)

发现的问题:

markdown 复制代码
张三执行了 git merge dev
  - 合并提交包含 100+ 个文件
  - 但这些文件不是张三写的!
  - 如果统计合并提交,张三的代码量会虚高 ❌

解决方案:

python 复制代码
# 自动跳过合并提交(有多个父提交的提交)
if len(commit.parents) > 1:
    return  # 跳过

只统计开发者真正写的代码,不统计合并操作!

5️⃣ 智能缓存机制

大型项目统计耗时?没问题!

缓存策略:

复制代码
首次统计:10 分钟 ⏱️
再次打开:0.5 秒 ⚡(从缓存读取)

缓存有效条件:
  ✅ 仓库路径相同
  ✅ 分支相同
  ✅ 用户列表相同
  ✅ 统计模式相同
  ✅ 最后一次提交相同

缓存位置:

  • Windows: C:\Users\<用户名>\.git-counter-cache\
  • macOS/Linux: ~/.git-counter-cache/

跨电脑、跨项目位置都能正确读取缓存!

6️⃣ 多格式报告导出

📊 HTML 报告(强烈推荐!)

特性:

  • 🎨 现代化的 UI 设计
  • 📑 多 Tab 页面(汇总、各账户、对比)
  • 📈 Chart.js 可视化图表
  • 📁 详细的文件清单
  • 🔍 支持浏览器内搜索、排序

适合场景: 给老板、PM 看,直观、专业

📑 Excel 报告

特性:

  • 📊 多 Sheet 页面(汇总、各账户、对比)
  • 🎨 自动列宽、样式美化
  • 📈 可进一步用 Excel 分析数据

适合场景: 需要二次加工、数据分析

7️⃣ 文件类型分类统计

自动识别 20+ 种文件类型:

python 复制代码
代码类别:
  ✅ 后端代码:Java、Python、Go、C++、C#、PHP...
  ✅ 前端代码:Vue、React、JavaScript、TypeScript、HTML、CSS...
  ✅ 移动端:Swift、Kotlin、Dart...
  ✅ 数据库:SQL
  ✅ 配置文件:XML、JSON、YAML、Properties...
  ✅ 文档:Markdown、TXT
  ✅ 其他:Shell、Dockerfile...

效果:

yaml 复制代码
张三的代码分布:
  Java 代码:8500 行(累计)/ 6200 行(当前)
  Vue 前端:3200 行(累计)/ 2800 行(当前)
  SQL 脚本:450 行(累计)/ 380 行(当前)
  配置文件:280 行(累计)/ 220 行(当前)

8️⃣ 智能过滤

过滤逻辑:

python 复制代码
# 只显示有实际贡献的文件
if added > 0 or deleted > 0 or current > 0:
    显示该文件
else:
    过滤掉(避免噪音)

报告清爽,没有无关文件!

🚀 快速开始

方式 1:使用打包好的 EXE(Windows)

  1. 下载 Git代码统计工具.exe
  2. 双击运行
  3. 选择仓库,输入账户,开始统计!

无需安装 Python 环境!

方式 2:从源码运行

bash 复制代码
# 1. 克隆项目
git clone https://gitee.com/gaoerfu/git-counter.git
cd git-counter

# 2. 创建虚拟环境
python -m venv venv
venv\Scripts\activate  # Windows
# source venv/bin/activate  # macOS/Linux

# 3. 安装依赖
pip install -r requirements.txt

# 4. 运行 GUI 版本
python git_counter_gui.py

# 或运行命令行版本
python git_counter.py --repo <仓库路径> --user <用户名>

📸 效果展示

主界面

功能区域:

  • 📁 仓库选择
  • 👤 当前 Git 用户信息(自动识别)
  • 📝 多账户输入(支持用户名、邮箱)
  • 🔄 缓存状态(加载缓存 / 重新统计)
  • 📊 统计模式(快速/详细)
  • ▶️ 开始分析按钮
  • 📋 实时日志输出
  • 📤 导出报告按钮

HTML 报告示例

Excel 报告示例

🎯 使用场景

场景 1:团队绩效评估

需求: 统计本季度各成员的代码贡献

操作:

markdown 复制代码
1. 选择项目仓库
2. 切换到目标分支(如 dev)
3. 输入所有成员的账户(用户名或邮箱)
4. 选择"详细模式"
5. 点击"开始分析"
6. 导出 HTML 报告

得到:

  • ✅ 每个成员的详细统计
  • ✅ 成员间的贡献度对比图表
  • ✅ 每个成员的代码类型分布
  • ✅ 详细的文件清单

场景 2:个人工作总结

需求: 年终总结,展示自己一年的工作成果

操作:

markdown 复制代码
1. 选择项目仓库
2. 只输入自己的账户(可输入多个,如公司邮箱+个人邮箱)
3. 选择"快速模式"(汇总多个账户)
4. 点击"开始分析"
5. 导出 Excel 报告

得到:

  • ✅ 全年累计代码量
  • ✅ 当前代码库中的活跃代码量
  • ✅ 各种编程语言的代码量
  • ✅ 可视化图表(放进 PPT)

场景 3:代码审计

需求: 了解某个项目的代码构成和维护者

操作:

markdown 复制代码
1. 选择项目仓库
2. 不输入账户(或输入所有参与者)
3. 选择"详细模式"
4. 导出 HTML 报告

得到:

  • ✅ 当前代码库中各成员的活跃代码量
  • ✅ 了解谁是主要维护者
  • ✅ 代码类型分布
  • ✅ 文件级别的作者信息

场景 4:项目交接

需求: 离职员工的代码量统计,方便交接

操作:

markdown 复制代码
1. 选择项目仓库
2. 输入离职员工的账户
3. 选择"详细模式"
4. 导出 Excel 报告

得到:

  • ✅ 该员工的历史贡献量
  • ✅ 当前代码库中该员工的代码量(需要交接的部分)
  • ✅ 详细的文件清单(便于分配接手人)

🔧 技术实现

技术栈

markdown 复制代码
核心:
  - GitPython:Git 仓库操作
  - Tkinter:GUI 界面

统计逻辑:
  - git diff:累计工作量统计
  - git blame:当前代码量统计

报告生成:
  - openpyxl:Excel 导出
  - Chart.js:HTML 图表
  - 自研 HTML 模板

打包:
  - PyInstaller:打包成 EXE

核心算法

1. 累计工作量统计(基于 git diff)

python 复制代码
def analyze_commit(commit):
    # 跳过合并提交
    if len(commit.parents) > 1:
        return
    
    # 获取 diff
    parent = commit.parents[0] if commit.parents else None
    diffs = parent.diff(commit, create_patch=True)
    
    for diff_item in diffs:
        # 统计新增/删除行数
        added, deleted = count_diff_lines(diff_item.diff)
        
        # 根据文件类型计算工作量
        if diff_item.new_file:
            workload = added - deleted
        elif diff_item.deleted_file:
            workload = 0
        elif diff_item.renamed_file:
            workload = added - deleted
        else:  # 修改文件
            workload = int(added * 0.9 + deleted * 0.1)
        
        stats['total'] += workload

关键点:

  • ✅ 过滤合并提交(避免虚高)
  • ✅ 区分文件类型(新建、修改、删除、重命名)
  • ✅ 智能工作量算法(体现删除代码的价值)

2. 当前代码量统计(基于 git blame)

python 复制代码
def analyze_current_code(repo, user_names, user_emails):
    # 遍历工作区所有文件
    for root, dirs, files in os.walk(repo.working_dir):
        if '.git' in root:
            continue
        
        for file in files:
            # 使用 git blame 分析每一行
            blame_data = repo.blame('HEAD', file_path)
            
            for commit, lines in blame_data:
                # 检查是否是目标用户
                if commit.author.name in user_names or \
                   commit.author.email in user_emails:
                    # 统计该用户的行数
                    stats['current'] += len(lines)

关键点:

  • ✅ 分析当前工作区的所有文件
  • ✅ 逐行识别作者
  • ✅ 支持多账户匹配

3. 缓存机制

python 复制代码
class CacheManager:
    def generate_cache_filename(self, repo_path, branch, users, stat_mode):
        # 规范化路径(确保跨平台一致)
        normalized_path = os.path.abspath(repo_path).replace('/', '\\')
        
        # 生成唯一哈希
        path_hash = hashlib.md5(normalized_path.encode()).hexdigest()[:8]
        users_hash = hashlib.md5(','.join(users).encode()).hexdigest()[:8]
        
        return f"cache_{path_hash}_{users_hash}_{branch}_{stat_mode}.json"
    
    def validate_cache(self, cache_data, current_params):
        # 验证缓存有效性
        return (
            cache_data['metadata']['repo_path'] == current_params['repo_path'] and
            cache_data['metadata']['branch'] == current_params['branch'] and
            cache_data['metadata']['users'] == current_params['users'] and
            cache_data['metadata']['last_commit_id'] == current_params['last_commit_id']
        )

关键点:

  • ✅ 路径规范化(确保一致性)
  • ✅ 多维度验证(仓库、分支、用户、提交)
  • ✅ 存储在用户目录(跨项目位置)

💡 设计亮点

1. 用户体验优化

自动识别 Git 用户

markdown 复制代码
打开仓库后,自动读取:
  - 本地 Git 配置(user.name、user.email)
  - 全局 Git 配置
  - 显示在界面上,无需手动输入

实时进度反馈

csharp 复制代码
[2025-01-15 10:23:45] 开始分析...
[2025-01-15 10:23:46] 账户1/6: 处理提交 10/523
[2025-01-15 10:23:47] 账户1/6: 处理提交 20/523
...
[2025-01-15 10:25:12] ✓ 所有账户分析完成!

智能缓存提示

ini 复制代码
✅ 发现缓存(生成于 2025-01-15 10:23:45)
   [加载缓存] [重新统计] [清除所有缓存]

2. 代码质量

异常处理

python 复制代码
# 所有 Git 操作都有异常处理
try:
    diffs = parent.diff(commit, create_patch=True)
except Exception as e:
    logging.error(f"Diff 失败: {e}")
    return

编码兼容

python 复制代码
# 支持各种文件编码
diff_text = diff_item.diff.decode('utf-8', errors='ignore')

跨平台支持

python 复制代码
# 路径处理兼容 Windows/macOS/Linux
cache_dir = os.path.join(os.path.expanduser("~"), ".git-counter-cache")

3. 性能优化

增量处理

python 复制代码
# 每处理 10 个提交更新一次进度
if i % 10 == 0:
    update_progress(i, total)

数据结构优化

python 复制代码
# 使用 defaultdict 避免重复判断
from collections import defaultdict
file_stats = defaultdict(lambda: {'added': 0, 'deleted': 0, 'current': 0})

缓存策略

python 复制代码
# 缓存存储完整统计结果
{
    'metadata': {...},
    'stats': {...},
    'file_stats': {...},
    'per_user_stats': {...}
}

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

贡献方向:

  • 🐛 Bug 修复
  • ✨ 新功能建议
  • 📖 文档完善
  • 🌍 国际化支持
  • 🎨 UI 优化

开发环境搭建:

bash 复制代码
git clone https://github.com/your-username/git-counter.git
cd git-counter
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt

📋 Roadmap

v2.2(计划中)

  • 支持 Git 仓库远程 URL 输入
  • 支持时间范围筛选(如近 3 个月)
  • 支持分支对比统计
  • 支持团队统计(多仓库汇总)

v3.0(未来)

  • Web 版本(在线使用)
  • API 接口(集成到 CI/CD)
  • 数据库存储(长期统计分析)
  • 更多可视化图表

❓ 常见问题

Q1:统计速度慢怎么办?

A:

  • 首次统计会较慢(取决于项目大小)
  • 再次打开会自动加载缓存(秒开)
  • 如果仓库特别大,建议选择特定分支统计

Q2:多账户怎么输入?

A:

css 复制代码
一行一个,支持混合输入:
  zhangsan
  lisi@company.com
  wangwu

Q3:统计结果为 0?

A: 可能的原因:

  • 输入的账户名/邮箱不匹配
  • 该账户在当前分支没有提交
  • 选择的仓库路径不正确

解决:

  • 使用 git log --author=<用户名> 验证用户名是否正确
  • 检查当前分支是否正确
  • 工具会自动显示当前仓库的 Git 用户,可参考

Q4:缓存存在哪里?

A:

  • Windows: C:\Users\<用户名>\.git-counter-cache\
  • macOS/Linux: ~/.git-counter-cache/
  • 可在 GUI 中点击"清除所有缓存"按钮清空

Q5:导出的报告在哪里?

A:

  • 默认保存在仓库根目录
  • HTML: git_stats_report_<时间戳>.html
  • Excel: git_stats_detailed_<时间戳>.xlsx

Q6:支持 SVN 吗?

A: 目前只支持 Git 仓库。SVN 的统计逻辑不同,可能会在未来版本支持。

📝 开源协议

MIT License

🙏 致谢

感谢以下开源项目:

🔗 相关链接


🎉 总结

这是一个真正实用的 Git 代码统计工具,解决了团队协作中的实际痛点:

智能算法 - 删除代码也算工作量

多账户支持 - 一次性统计多个账户

双维度统计 - 累计工作量 + 当前代码量

缓存加速 - 大型项目秒开

报告导出 - HTML、Excel 多格式

过滤合并提交 - 只统计真实代码

开箱即用 - GUI 界面,无需命令行

如果你也被代码统计困扰过,不妨试试这个工具!

欢迎 Star ⭐、Fork 🍴、PR 🤝!

如果觉得有用,请点赞、收藏、分享!👍


我是 [大飞],持续分享实用的开发工具和技术文章,欢迎关注! 🚀

相关推荐
李拾叁的摸鱼日常6 小时前
git pull --rebase 最佳实践(含详细命令+真实案例)
git
Fang XS.8 小时前
GIT命令常用方法
git
初见00110 小时前
Git时间管理大师:Reset Current Branch to Here 全解析
git·后端
Rverdoser1 天前
制作网站的价格一般由什么组成
前端·git·github
Merrick1 天前
git撤销第一次commit
git
艾莉丝努力练剑1 天前
【Git:基本操作】深度解析Git:从初始Git到熟悉基本操作
大数据·linux·c++·人工智能·git·gitee·指令
大白要努力!1 天前
将Git项目的所有远程分支打包成压缩包文件
git
牧羊人_myr1 天前
Git指令集
git