Atualizar
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Eu atualizei algumas coisas no caminho.
Por conveniência, você também pode colocar isso em seu próprio comando:
#!/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
armazene-o em algum lugar do seu caminho ou modifique-o e use-o como
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
Resposta original
Enquanto a resposta aceita faz o trabalho, é muito lenta.
$ 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
é quase instantâneo.
Para obter uma lista dos arquivos rastreados atualmente, você pode usar
git ls-tree --name-only -r HEAD
Essa solução evita chamadas filepara determinar o tipo de arquivo e usa grep para corresponder à extensão desejada por motivos de desempenho. Se todos os arquivos forem incluídos, remova-o da linha.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
se os arquivos puderem conter espaços, o que é ruim para os shells, você pode usar:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Dê uma lista de arquivos (através de um canal) que se pode usar xargs para chamar um comando e distribuir os argumentos. Os comandos que permitem o processamento de vários arquivos obedecem ao -n1. Nesse caso, chamamos git blame --line-porcelaine para cada chamada usamos exatamente 1 argumento.
xargs -n1 git blame --line-porcelain
Em seguida, filtramos a saída para ocorrências de "autor", classificamos a lista e contamos linhas duplicadas por:
grep "^author "|sort|uniq -c|sort -nr
Nota
Outras respostas, na verdade, filtram linhas que contêm apenas espaços em branco.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
O comando acima imprimirá autores de linhas que contenham pelo menos um caractere que não seja um espaço em branco. Você também pode usar a correspondência, \w*[^\w#]que também excluirá linhas nas quais o primeiro caractere que não seja um espaço em branco não seja #(comentário em muitas linguagens de script).