Подтвердить что ты не робот

Git, выясните, какие файлы имели наибольшую фиксацию

Как я могу выполнить поиск в журналах git, чтобы узнать, какие файлы имели наибольшую активность?

4b9b3361

Ответ 1

Ха! что одна из этих вещей очень проста, случайно (?):

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn | head
  • дайте мне все объекты из всех ревизий во всех ветвях
  • игнорировать любые результаты без пути
  • Сортировка по пути
  • сделать их уникальными (игнорируя хеш-память), префиксные строки с подсчетом дублирования
  • сортировать по убыванию по количеству дубликатов
  • показать верхние строки

Результат, аналогичный

   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

Вы можете взять это отсюда.

например. если вы хотели видеть только файлы blobs:

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn |
    while read frequency sample path
    do 
       [ "blob" == "$(git cat-file -t $sample)" ] && echo -e "$frequency\t$path";
    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 и не в master

Ответ 2

использует git effort [--above <value>] (из пакета git -extras), чтобы отобразить все файлы и количество соответствующих обязательств.

Вы можете ограничить путь

Ответ 3

Здесь python script, который вы можете вывести из журнала --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)

Вы можете изменить его по мере необходимости, чтобы отсортировать/отфильтровать, как вы хотите.

Ответ 4

Предполагая, что диапазон изменений, которые вы хотите выбрать, <range>, команда:

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

выводит для каждого файла вашего репозитория количество вхождений в фиксации diff, то есть количество изменений, включая создание файла в качестве изменения. Держите <range> пустым, чтобы получить статистику от первоначальной фиксации вашей ветки HEAD.