Показывать количество измененных строк на автора в git - PullRequest
27 голосов
/ 07 мая 2010

Я хочу увидеть номер удаленной / добавленной строки, сгруппированной по автору для данной ветки в истории git.git shortlog -s показывает количество коммитов на автора.Есть ли что-нибудь подобное, чтобы получить общий diffstat?

Ответы [ 6 ]

38 голосов
/ 11 ноября 2014

Это старый пост, но если кто-то все еще ищет его:

установить дополнительные функции

brew install git-extras

тогда

git summary --line

https://github.com/tj/git-extras

18 голосов
/ 07 мая 2010

Начиная с вопрос SO "Как подсчитать общее количество строк, измененных конкретным автором в репозитории Git?" не является полностью удовлетворительным, commandlinefu имеет альтернативы (хотя и не на филиал):

git ls-files | while read i; do git blame $i | sed -e 's/^[^(]*(//' -e 's/^\([^[:digit:]]*\)[[:space:]]\+[[:digit:]].*/\1/'; done | sort | uniq -ic | sort -nr

Включает двоичные файлы, что не очень хорошо, так что вы можете (удалить действительно случайные двоичные файлы):

git ls-files | grep -v "\.\(pdf\|psd\|tif\)$"

(Примечание: поскольку прокомментировал от trcarden , опция -x или --exclude не будет работать.
Из git ls-files справочной страницы , git ls-files -x "*pdf" ... исключает неотслеживаемое содержимое, если --others или --ignored были добавлены в команду git ls-files.)

Или:

git ls-files "*.py" "*.html" "*.css" 

для включения только определенных типов файлов.


Тем не менее, решение на основе "git log" должно быть лучше, например:

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

но опять-таки, это для одного пути (здесь 2 коммита), а не для всех веток в ветвях.

6 голосов
/ 14 ноября 2018

однострочный код (выбор диапазона времени поддержки):

git log --since=4.weeks --numstat --pretty="%ae %H" | sed 's/@.*//g' | awk '{ if (NF == 1){ name = $1}; if(NF == 3) {plus[name] += $1; minus[name] += $2}} END { for (name in plus) {print name": +"plus[name]" -"minus[name]}}' | sort -k2 -gr

объяснение:

git log --since=4.weeks --numstat --pretty="%ae %H" \
    | sed 's/@.*//g'  \
    | awk '{ if (NF == 1){ name = $1}; if(NF == 3) {plus[name] += $1; minus[name] += $2}} END { for (name in plus) {print name": +"plus[name]" -"minus[name]}}' \
    | sort -k2 -gr

# query log by time range
# get author email prefix
# count plus / minus lines
# sort result

вывод:

user-a: +5455 -3471
user-b: +5118 -1934
2 голосов
/ 24 октября 2014

От Как подсчитать общее количество строк, измененных конкретным автором в репозитории Git?

Вывод следующей команды должен быть достаточно прост для отправки в скрипт для суммирования:

git log --author="<authorname>" --oneline --shortstat

Это дает статистику для всех коммитов на текущем HEAD. Если вы хотите добавить статистику в другие ветки, вам нужно будет предоставить их в качестве аргументов в git log.

2 голосов
/ 11 декабря 2011

Этот скрипт здесь сделает это.Поместите его в authorhip.sh, chmod + x, и все готово.

#!/bin/sh
declare -A map
while read line; do
    if grep "^[a-zA-Z]" <<< "$line" > /dev/null; then
        current="$line"
        if [ -z "${map[$current]}" ]; then 
            map[$current]=0
        fi
    elif grep "^[0-9]" <<<"$line" >/dev/null; then
        for i in $(cut -f 1,2 <<< "$line"); do
            map[$current]=$((map[$current] + $i))
        done
    fi
done <<< "$(git log --numstat --pretty="%aN")"

for i in "${!map[@]}"; do
    echo -e "$i:${map[$i]}"
done | sort -nr -t ":" -k 2 | column -t -s ":"
1 голос
/ 22 октября 2015

В моих репозиториях я получил много мусора от однострочно плавающих строк, поэтому вот скрипт Python, чтобы сделать это правильно:

import subprocess
import collections
import sys


def get_lines_from_call(command):
    return subprocess.check_output(command).splitlines()

def get_files(paths=()):
    command = ['git', 'ls-files']
    command.extend(paths)
    return get_lines_from_call(command)

def get_blame(path):
    return get_lines_from_call(['git', 'blame', path])


def extract_name(line):
    """
    Extract the author from a line of a standard git blame
    """
    return line.split('(', 1)[1].split(')', 1)[0].rsplit(None, 4)[0]


def get_file_authors(path):
    return [extract_name(line) for line in get_blame(path)]


def blame_stats(paths=()):
    counter = collections.Counter()
    for filename in get_files(paths):
        counter.update(get_file_authors(filename))
    return counter


def main():
    counter = blame_stats(sys.argv[1:])
    max_width = len(str(counter.most_common(1)[0][1]))
    for name, count in reversed(counter.most_common()):
        print('%s %s' % (str(count).rjust(max_width), name))

if __name__ == '__main__':
    main()

Обратите внимание, что аргументы скрипта будут переданы git ls-files, поэтому, если вы хотите показать только файлы Python: blame_stats.py '**/*.py'

Если вы хотите показывать файлы только в одном подкаталоге: blame_stats.py some_dir

и т. Д.

...