如何生成每个文件类型的Git更改统计信息?
在git存储库中,每个文件类型添加和删除了多少行代码?最好能够为过去的如何生成每个文件类型的Git更改统计信息?,git,Git,在git存储库中,每个文件类型添加和删除了多少行代码?最好能够为过去的X提交请求这些统计信息。因此,假设我在过去的100次commissions中请求此请求,我的预期结果如下: .css, 100 files changed, 2879 insertions(+), 1134 deletions(-) .js, 17 files changed, 415 insertions(+), 502 deletions(-) .php, 6 files changed, 478 in
X
提交请求这些统计信息。因此,假设我在过去的100次commissions中请求此请求,我的预期结果如下:
.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(-)
这一定是可能的,但我找不到解决办法。我已经阅读并尝试使用和 有两种方法可以计算所需的数据。其中一个是将提交范围的差异作为一个整体进行计算,另一个是单独计算每个提交并求和值。如果文件被多次触摸,后者可能比前者大。既然你没有具体说明,我就给你们两个看
要计算前者(更简单),可以使用如下命令:
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 log
然后您会看到提交摘要的列表。当然,这还不友好
现在,让我们限制我们的领域,假设我们对最近100次提交的统计数据感兴趣:
git log -100
现在,所讨论的提交数量是合适的。但我们仍然看不到添加和删除,让我们补救一下:
git log -100 --stat
开始好转了,对吧?让我们进一步改进它:
git log -5 --stat --format=""
好多了,好多了。现在,对于每个提交,您都有“有用的行”,即包含更改数量的行和更改格式的最后一行
9个文件更改,189个插入(+),1个删除(-)
基本上,如果您有一行包含“文件已更改”或“文件已更改”,则需要忽略它,除非您有具有该名称的文件。所有其他行都是有用的原始输入
统计算法
您需要一个数据结构,该结构将包含文件类型作为密钥和一对数字作为值。第一个数字是负数,第二个数字是正数。伪代码:
For Each ln In Lines Do
If (Not ln.Replace("files", "file").Contains("file changed")) And ln.Contains(".") Then
FileExtension = ln.Substring(ln.IndexOf(".") + 1, ln.IndexOf(" "))
If (Not Extensions.Has(FileExtension)) Then
Extensions(FileExtension) = [0, 0]
End
UsefulSubstring = ln.Substring(ln.LastIndexOf(" ") + 1)
For Each char In UsefulSubstring Do
If char = '+' Then
Extensions(FileExtension)[1] = Extensions(FileExtension)[1] + 1
Else
Extensions(FileExtension)[0] = Extensions(FileExtension)[0] + 1
End If
End For
End If
End For
此算法将构造您的输出,您需要以您喜欢的格式将其放入控制台输出中。所以,你可以用你喜欢的输入调用这个程序。您甚至可以将git log命令嵌入到项目中。这不是一个很大的任务,所以如果你在这方面投入几个小时,也许更少,你就会得到你需要的结果。非常好的答案!这可能导致如下行:scss 60个文件更改,5352个插入(+),276个删除(-)。scss}3个文件更改,38个插入(+),13个删除(-)
,注意第二行.scss
之后的}
。您了解为什么会发生这种情况吗?可能是因为重命名支持。尝试--在git diff
调用中不重命名。认为您是对的。这个答案很好。唯一缺少的是它没有考虑到文件中包含多个
,如示例.something.ext
。这是一个非常有趣的问题。您能否确认当两个提交(例如,相互取消)时,您期望的输出是什么?那么,提交和后续恢复是否应显示为进行0次插入和0次删除?
For Each ln In Lines Do
If (Not ln.Replace("files", "file").Contains("file changed")) And ln.Contains(".") Then
FileExtension = ln.Substring(ln.IndexOf(".") + 1, ln.IndexOf(" "))
If (Not Extensions.Has(FileExtension)) Then
Extensions(FileExtension) = [0, 0]
End
UsefulSubstring = ln.Substring(ln.LastIndexOf(" ") + 1)
For Each char In UsefulSubstring Do
If char = '+' Then
Extensions(FileExtension)[1] = Extensions(FileExtension)[1] + 1
Else
Extensions(FileExtension)[0] = Extensions(FileExtension)[0] + 1
End If
End For
End If
End For