📢 本文介绍一个全新的开源 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)
- 下载
Git代码统计工具.exe - 双击运行
- 选择仓库,输入账户,开始统计!
✅ 无需安装 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
🙏 致谢
感谢以下开源项目:
- GitPython - Git 操作核心库
- openpyxl - Excel 文件处理
- Chart.js - 图表可视化
- PyInstaller - Python 打包工具
🔗 相关链接
- 🏠 项目主页:gitee.com/gaoerfu/git...
- 📖 完整文档:README.md
- 🐛 问题反馈:Issues
- 💬 讨论区:Discussions
🎉 总结
这是一个真正实用的 Git 代码统计工具,解决了团队协作中的实际痛点:
✅ 智能算法 - 删除代码也算工作量
✅ 多账户支持 - 一次性统计多个账户
✅ 双维度统计 - 累计工作量 + 当前代码量
✅ 缓存加速 - 大型项目秒开
✅ 报告导出 - HTML、Excel 多格式
✅ 过滤合并提交 - 只统计真实代码
✅ 开箱即用 - GUI 界面,无需命令行
如果你也被代码统计困扰过,不妨试试这个工具!
欢迎 Star ⭐、Fork 🍴、PR 🤝!
如果觉得有用,请点赞、收藏、分享!👍
我是 [大飞],持续分享实用的开发工具和技术文章,欢迎关注! 🚀