Оновлення
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#]
який також буде виключати рядки, де перший символ, який не є пробілом, не є #
(коментар у багатьох мовах сценаріїв).