如何统计Git项目中所有文件的修订次数?有无对应Git命令?
没问题,这其实是Git里挺实用的一个统计需求,我来给你几个靠谱的解决方案,完全满足你统计所有作者修改次数、输出「次数 文件名」格式的要求:
方法1:快速统计文件修改提交次数
直接在项目根目录运行这条命令,它会遍历所有分支的所有提交,统计每个文件被修改的提交次数(包含所有作者的操作):
git log --all --numstat | awk '{if ($1 != "" && $2 != "") {count[$3]++}} END {for (file in count) print count[file], file}' | sort -nr
拆解一下各部分的作用:
git log --all:遍历仓库所有分支的所有提交,不会漏掉任何历史记录--numstat:输出每个提交中文件的增删行数,格式为「新增行数 删除行数 文件名」awk脚本:过滤掉日志里的空行,累加每个文件在提交中出现的次数(也就是被修改的次数)sort -nr:按修改次数从多到少排序,方便快速定位最常改动的文件
如果你想统计的是文件累计的增删行数总和,而不是提交次数,可以把awk部分改成这样:
git log --all --numstat | awk '{if ($1 != "" && $2 != "") {sum[$3] += $1 + $2}} END {for (file in sum) print sum[file], file}' | sort -nr
方法2:处理文件重命名的精确统计
如果你的项目里存在文件重命名的情况,方法1会把重命名前后的文件当成两个独立文件统计。用下面的命令可以识别文件的历史轨迹,把重命名前后的修改次数合并:
git rev-list --all | xargs -I {} git diff --name-only {} ^{} | awk '{count[$1]++} END {for (file in count) print count[file], file}' | sort -nr
简单说明:
git rev-list --all:列出仓库所有提交的哈希值xargs + git diff:逐个对比每个提交和它的父提交,提取出本次提交修改过的文件awk统计每个文件的修改次数,这样重命名后的文件会继承之前的修改记录
以上所有命令都会统计所有作者的修改操作,不需要额外指定作者范围,完全符合你的需求。
内容的提问来源于stack exchange,提问作者OvidiuPPP
相关产品推荐
相关产品推荐

