首页 > 解决方案 > 如何生成每个文件类型更改的 Git 统计信息?

问题描述

在 git 存储库中,每个文件类型添加和删除了多少行代码?最好能够为过去的X提交请求这些统计信息。所以说我会为过去的100 提交请求这个,我的预期结果是这样的:

.css, 100 files changed,  2879 insertions(+), 1134 deletions(-)
.js,   17 files changed,   415 insertions(+),  502 deletions(-)
.php,   6 files changed,   478 insertions(+),  176 deletions(-)
.py,   10 files changed,   156 insertions(+),   56 deletions(-)

这必须以某种方式成为可能,但我找不到解决方案。我已阅读此问题,并尝试使用GitstatsRepoExplorer

标签: git

解决方案


有两种方法可以计算您想要的数据。其中一个是计算整个提交范围的差异,另一个是单独计算每个提交并对值求和。如果多次触摸文件,后者可能会大于前者。由于您没有指定,我将向您展示两者。

要计算更简单的前者,您可以使用如下命令:

git diff --numstat BASE_COMMIT.. | ruby -rset -e '
  x = {}
  while gets
    line = $_.chomp.split("\t")
    chunks = line[2].split(".")
    next if chunks.length == 1
    type = chunks[-1]
    x[type] ||= [0, 0, Set.new]
    2.times { |i| x[type][i] += line[i].to_i }
    x[type][2] << line[2]
  end
  x.sort_by { |(k, v)| k }.each do |(type, (add, del, set))|
    puts ".#{type} #{set.length} files changed, #{add} insertions(+), #{del} deletions(-)"
  end'

这用于git diff --numstat处理来自BASE_COMMIT当前分支的提交并运行操作。如果要处理最后一次X提交,请编写HEAD~X. 请注意,这会忽略没有后缀的文件,并将二进制文件视为没有添加或删除行。它也不会产生对齐的列,但您可以根据需要添加它。您还可以使用不同的语言或脚本来代替单行。

如果要对所有单独的提交求和,则将git diff调用替换为:

git rev-list BASE_COMMIT.. | xargs -I{} git diff --numstat {}^..{}

推荐阅读