Aggiornare
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Ho aggiornato alcune cose sulla strada.
Per comodità, puoi anche metterlo nel suo 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
memorizzalo da qualche parte nel tuo percorso o modifica il tuo percorso e usalo come
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
Risposta originale
Mentre la risposta accettata fa il lavoro è molto 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
è quasi istantaneo.
Per ottenere un elenco di file attualmente tracciati è possibile utilizzare
git ls-tree --name-only -r HEAD
Questa soluzione evita di chiamare fileper determinare il tipo di file e utilizza grep per abbinare l'estensione desiderata per motivi di prestazioni. Se tutti i file devono essere inclusi, rimuovili dalla riga.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
se i file possono contenere spazi, che sono dannosi per le shell puoi usare:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Fornisci un elenco di file (tramite una pipe) che puoi usare xargs per chiamare un comando e distribuire gli argomenti. I comandi che consentono l'elaborazione di più file non accettano -n1. In questo caso chiamiamo git blame --line-porcelaine per ogni chiamata usiamo esattamente 1 argomento.
xargs -n1 git blame --line-porcelain
Quindi filtriamo l'output per le occorrenze di "autore" ordinando l'elenco e contando le righe duplicate per:
grep "^author "|sort|uniq -c|sort -nr
Nota
Altre risposte filtrano effettivamente le righe che contengono solo spazi bianchi.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
Il comando sopra stamperà gli autori delle righe che contengono almeno un carattere non bianco. Puoi anche usare la corrispondenza \w*[^\w#]che escluderà anche le linee in cui il primo carattere non bianco non è un #(commento in molti linguaggi di scripting).