Aktualizacja
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Po drodze zaktualizowałem kilka rzeczy.
Dla wygody możesz również umieścić to w swoim własnym poleceniu:
#!/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
przechowuj to gdzieś na swojej ścieżce lub zmodyfikuj swoją ścieżkę i używaj jej jak
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
Oryginalna odpowiedź
Chociaż zaakceptowana odpowiedź spełnia swoje zadanie, jest bardzo powolna.
$ 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
jest prawie natychmiastowy.
Aby uzyskać listę aktualnie śledzonych plików, możesz użyć
git ls-tree --name-only -r HEAD
To rozwiązanie pozwala uniknąć wywoływania w filecelu ustalenia rodzaju pliku i wykorzystuje grep do dopasowania pożądanego rozszerzenia ze względu na wydajność. Jeśli wszystkie pliki powinny zostać uwzględnione, po prostu usuń to z wiersza.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
jeśli pliki mogą zawierać spacje, które są szkodliwe dla powłok, możesz użyć:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Podaj listę plików (przez potok), za pomocą xargs można wywołać polecenie i rozdzielić argumenty. Polecenia, które umożliwiają przetwarzanie wielu plików, pozwalają ominąć -n1. W tym przypadku dzwonimy git blame --line-porcelaini do każdego połączenia używamy dokładnie 1 argumentu.
xargs -n1 git blame --line-porcelain
Następnie filtrujemy dane wyjściowe pod kątem wystąpienia „autora”, sortujemy listę i liczymy zduplikowane linie według:
grep "^author "|sort|uniq -c|sort -nr
Uwaga
Inne odpowiedzi faktycznie odfiltrowują wiersze zawierające tylko białe znaki.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
Powyższe polecenie spowoduje wydrukowanie autorów wierszy zawierających co najmniej jeden znak spacji. Możesz także użyć dopasowania, \w*[^\w#]które wyklucza również wiersze, w których pierwszy znak inny niż biały nie jest #(komentarz w wielu językach skryptowych).