git,找出提交最多的文件

问题描述

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

解决方法

这是很容易的事情之一,偶然地(?):
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
将仅使用指定日期范围内的修订版,这些修订版具有
tag1
remote/hotfix
的对称集合差异,并且不在主版本中     ,使用
git effort [--above <value>]
(来自git-extras包)列出所有文件和相关提交的数量。 您可以限制路径     ,这是一个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)
您可以根据需要对其进行修改,以对所需的方式进行排序/过滤。     ,假设您要选择的修订范围是
<range>
,请执行以下命令:
git log --format=%n --name-only <range>|sort|uniq -c|tail -n +2
将为存储库中的每个文件输出提交差异中发生的次数,即更改的次数,包括将文件创建为更改。保留
<range>
为空以获取最初提交到分支
HEAD
的统计信息。