git - 如何生成每个文件类型更改的 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(-)
这必须以某种方式成为可能,但我找不到解决方案。我已阅读此问题,并尝试使用Gitstats和RepoExplorer。
解决方案
有两种方法可以计算您想要的数据。其中一个是计算整个提交范围的差异,另一个是单独计算每个提交并对值求和。如果多次触摸文件,后者可能会大于前者。由于您没有指定,我将向您展示两者。
要计算更简单的前者,您可以使用如下命令:
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 {}^..{}
推荐阅读
- python - 如何在 Python 中将时间戳转换为浮点数?
- c++ - 具有派生参数的函数指针在不兼容的函数类型之间转换
- sharepoint-2013 - 使用 SAML 和 AD 登录的用户在共享点中搜索
- javascript - 有没有办法将带有 esp-32 cam 的 IP 地址中的照片复制到带有 html、php 或 javascript 的 Web 服务器?
- performance - 如何更改 Locust 中的故障响应时间?
- javascript - 无法修复错误 [ERR_MODULE_NOT_FOUND]:找不到模块节点 JS
- javascript - Firebase 异步响应被多次调用
- java - 使用 Quarkus Resteasy Reactive 记录实体主体
- django - 如何将权限不同的模型分配给一个对象?
- flutter - 颤振 vscode 在运行开始调试时显示安装扩展消息