Mettre à jour
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
J'ai mis à jour certaines choses en cours de route.
Pour plus de commodité, vous pouvez également mettre ceci dans sa propre commande:
#!/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
stocker quelque part sur votre chemin ou modifier votre chemin et l'utiliser comme
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
Réponse originale
Bien que la réponse acceptée fasse l'affaire, elle est très lente.
$ 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
est presque instantané.
Pour obtenir une liste des fichiers actuellement suivis, vous pouvez utiliser
git ls-tree --name-only -r HEAD
Cette solution évite d'appeler file
pour déterminer le type de fichier et utilise grep pour faire correspondre l'extension souhaitée pour des raisons de performances. Si tous les fichiers doivent être inclus, supprimez-les simplement de la ligne.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
si les fichiers peuvent contenir des espaces, ce qui est mauvais pour les shells, vous pouvez utiliser:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Donnez une liste de fichiers (via un canal), vous pouvez utiliser xargs pour appeler une commande et distribuer les arguments. Les commandes qui permettent de traiter plusieurs fichiers obmettent le -n1
. Dans ce cas, nous appelons git blame --line-porcelain
et pour chaque appel, nous utilisons exactement 1 argument.
xargs -n1 git blame --line-porcelain
Nous filtrons ensuite la sortie pour les occurrences de "auteur" trions la liste et comptons les lignes en double par:
grep "^author "|sort|uniq -c|sort -nr
Remarque
D'autres réponses filtrent en fait les lignes qui ne contiennent que des espaces blancs.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
La commande ci-dessus imprimera les auteurs de lignes contenant au moins un caractère non blanc. Vous pouvez également utiliser match \w*[^\w#]
qui exclura également les lignes où le premier caractère non blanc n'est pas un #
(commentaire dans de nombreux langages de script).