Git,找出提交次数最多的文件

Posted

技术标签:

【中文标题】Git,找出提交次数最多的文件【英文标题】:Git, find out which files have had the most commits 【发布时间】:2011-08-05 21:24:35 【问题描述】:

如何搜索我的 git 日志以查看哪些文件的活动最多?

【问题讨论】:

相关:***.com/questions/1265040/… 您可以使用git diff --stat revA revB 来获取所有添加删除的总和(但它不会告诉您实际触及文件的提交的绝对数量)。 该链接是针对特定作者的,但是一个命令 git log --numstat 似乎是在正确的方向,但它只是以不特定的顺序吐出每个文件的统计信息,但我们有成千上万文件。 @jason,谢谢,问题是我们需要查看 所有 曾经做过的提交,看看哪些文件有最多的提交或最多的添加/删除总计。 Finding most changed files in Git的可能重复 【参考方案1】:

这是一件很容易的事情,不小心(?):

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn | head
    给我所有分支中所有修订版的所有对象 忽略任何没有路径的结果 按路径排序 使它们独一无二(忽略 blob 哈希),为行添加重复计数的前缀 按重复计数降序排序 显示最上面的行

输出类似于

   1058 fffcba193374a85fd6a3490f800c6901218a950b src
    715 ffffe0f08798e95b66cc4ad4ff22cf10734d045e src/lib
    450 ffcfe596031a5985664e35937fff4ac9ff38dcca src/zfs-fuse
    367 ffc5d5340f95360fc9f7b739c5593dd3f92fced0 src/lib/libzpool
    202 ff92db000792044d45eec21c57a3cd21618631e7 src/lib/libsolkerncompat
    183 ff1a44edae3fd121ddd86864b589e5ab2f9ff99b src/lib/libzfscommon
    178 fec6b3a789e578983c2242b3aa5adf217cb8b887 src/lib/libzfs
    168 ffeefc9e81222d7c471bdb0911d8b98f23cff050 src/cmd
    167 fbd60bd3430765863648c52db7ceb3ffa15d5e50 src/lib/libzfscommon/include
    155 ff225f6b41f9557d683079c5f9276f497bcb06bd src/lib/libzfscommon/include/sys

你可以从这里拿走。

例如如果您只想查看文件 blob

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn |
    while read frequency sample file
    do 
       [ "blob" == "$(git cat-file -t $sample)" ] && echo -e "$frequency\t$file";
    done

输出

135 src/zfs-fuse/zfs_operations.c
84  src/zfs-fuse/zfs_ioctl.c
79  src/zfs-fuse/zfs_vnops.c
73  src/lib/libzfs/libzfs_dataset.c
67  src/lib/libzpool/spa.c
66  src/zfs-fuse/zfs_vfsops.c
62  src/cmd/zdb/zdb.c
62  CHANGES
60  src/cmd/ztest/ztest.c
60  src/lib/libzpool/arc.c

您只想查看特定范围的修订

您可以使用rev-list 部分玩个球:

git rev-list --after=2011-01-01 --until='two weeks ago' \
     tag1...remote/hotfix ^master

将仅使用指定日期范围内的修订,即在 tag1remote/hotfix 的对称集差异中并且在 master

【讨论】:

干杯。写下来我很开心 :) Laaaaarge 向在 UNIX 哲学中设计 git 的先生们表示敬意 一个很好的答案,谢谢!我将留下一个编辑以使其与 ZSH 兼容,其中使用 path 作为变量可能会导致麻烦【参考方案2】:

使用git effort [--above <value>](来自 git-extras 包)列出所有文件和相关提交的数量。

你可以限制到一个路径

【讨论】:

【参考方案3】:

我最近在一个源代码完全由 java 文件组成的项目中需要类似的东西。类似于我用作此基础的 sehe 的答案,并在我想在没有循环的情况下在一行中进行扩展。我的问题是变化最大的前 5 个文件是什么?

git rev-list --objects --all | awk '$2 ~ /\.java/' | awk 'print $2' | sort -k2 | uniq -c | sort -rn | head -n 5

分解:

    git rev-list --objects --all:给我所有分支的所有对象 awk '$2 ~ /.java/':使用正则表达式过滤掉第二个参数 ($2) 不包含短语 .java (~ /.java/) 的行 awk 'print $2':打印第二个参数 排序:按路径排序 uniq -c:使它们唯一并计算每个文件出现的次数 sort -r:倒序排序 head -n 5:将结果限制在前 5 名

输出是

130 richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java
126 richtextfx/src/main/java/org/fxmisc/richtext/StyledTextArea.java
 58 richtextfx/src/main/java/org/fxmisc/richtext/ParagraphText.java
 47 richtextfx/src/main/java/org/fxmisc/richtext/EditableStyledDocument.java
 43 richtextfx/src/main/java/org/fxmisc/richtext/skin/StyledTextAreaVisual.java

【讨论】:

【参考方案4】:

这是一个 python 脚本,您可以通过管道输出日志 --numstat 以获取结果:

import sys, re

res = 

while 1:
    line = sys.stdin.readline()
    if len(line) == 0:
        break;
    m =  re.match("([0-9]+)[ \t]+([0-9]+)[ \t]+(.*)", line)
    if m != None:
        f = m.group(3)
        if f not in res: res[f] = 'add':0, 'rem':0, 'commits':0 
        res[f]['commits'] += 1
        res[f]['add'] += int(m.group(1))
        res[f]['rem'] += int(m.group(2))

for f in res:
    r = res[f]
    print "%s %s %s %s"%(r['commits'], r['add'], r['rem'], f)

您可以根据需要对其进行修改,以按您的需要进行排序/过滤。

【讨论】:

【参考方案5】:

假设你要选择的修订范围是<range>,命令:

git log --format=%n --name-only <range>|sort|uniq -c|tail -n +2

将为您的存储库的每个文件输出提交差异中的出现次数,即更改次数,包括文件创建作为更改。保持 &lt;range&gt; 为空以获取从初始提交到您的分支 HEAD 的统计信息。

【讨论】:

以上是关于Git,找出提交次数最多的文件的主要内容,如果未能解决你的问题,请参考以下文章

找出字符串中出现次数最多的字符和次数

如何求出数组中出现次数最多的数字(C#实现)

在c#中找出一个数组中出现次数最多的元素,求各种方法,要详细的代码

如何获取数组中出现次数最多的字符串?

找出一个数组中出现次数最多的那个元素。

在100G文件中找出出现次数最多的100个IP(转)