Обновление
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Я обновил некоторые вещи в пути.
для ленивых вы также можете поместить это в свою команду:
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
сохраните это где-нибудь на своем пути или измените свой путь и используйте его как
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Оригинальный ответ
Пока принятый ответ выполняет свою работу, он очень медленный.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
почти мгновенно.
Чтобы получить список отслеживаемых файлов, вы можете использовать
git ls-tree --name-only -r HEAD
Это решение позволяет избежать вызова file
для определения типа файла и использует grep для сопоставления с желаемым расширением по соображениям производительности. Если все файлы должны быть включены, просто удалите это из строки.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
если файлы могут содержать пробелы, что плохо для оболочек, вы можете использовать:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Дайте список файлов (через канал), которые можно использовать xargs для вызова команды и распределения аргументов. Команды, позволяющие обрабатывать несколько файлов, соответствуют -n1
. В этом случае мы вызываем git blame --line-porcelain
, и для каждого вызова мы используем ровно 1 аргумент.
xargs -n1 git blame --line-porcelain
Затем мы фильтруем выходные данные по появлению «автора», сортируем список и подсчитываем повторяющиеся строки по:
grep "^author "|sort|uniq -c|sort -nr
Примечание
Другие ответы фактически отфильтровывают строки, содержащие только пробелы.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
Команда выше будет печатать авторов строк, содержащих хотя бы один непробельный символ. Вы также можете использовать совпадение \w*[^\w#]
, которое также исключит строки, где первый непробельный символ не является #
(комментарий на многих языках сценариев).