Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成每个文件类型的Git更改统计信息?_Git - Fatal编程技术网

如何生成每个文件类型的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

在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 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