Я хочу увидеть количество удаленной/добавленной строки, сгруппированное по автору для данной ветки в истории git. есть git shortlog -s
, который показывает мне количество коммитов на автора. есть ли что-нибудь подобное, чтобы получить общий diffstat?
Показать количество измененных строк на автора в git
Ответ 1
Это старый пост, но если кто-то все еще ищет его:
установить git дополнительные функции
brew install git-extras
затем
git summary --line
Ответ 2
Поскольку вопрос 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 фиксации), а не для всех ветвей на ветки.
Ответ 3
Этот script здесь сделает это. Поместите его в authorhip.sh, chmod + x it, и вы все настроены.
#!/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 ":"
Ответ 4
Из Как подсчитать общие строки, измененные конкретным автором в репозитории Git?
Вывод следующей команды должен быть достаточно прост для отправки на script для добавления итогов:
git log --author="<authorname>" --oneline --shortstat
Это дает статистику для всех фиксаций текущего HEAD. Если вы хотите добавить статистику в другие ветки, вам нужно будет предоставить их в качестве аргументов для журнала Git.
Ответ 5
В моих репозиториях я получил много выходных данных из однолинейных плавающих элементов, поэтому для этого нужно использовать Python script:
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()
Обратите внимание, что аргументы script будут переданы в git ls-files
, поэтому, если вы хотите показывать файлы Python:
blame_stats.py '**/*.py'
Если вы хотите показывать файлы только в одном подкаталоге: blame_stats.py some_dir
И так далее.