Mise à jour
git ls-tree -r -z --name-only HEAD -- */*.c | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
J'ai mis à jour certaines choses en cours de route.
Pour plus de commodité, vous pouvez également placer cette commande 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 | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
stockez-le quelque part dans votre chemin ou modifiez votre chemin et utilisez-le comme suit
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ée.
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 performance. Si tous les fichiers doivent être inclus, il suffit de supprimer cette option 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, qui sont mauvais pour les shells que vous pouvez utiliser :
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
En donnant une liste de fichiers (via un pipe), on peut utiliser xargs pour appeler une commande et distribuer les arguments. Les commandes qui permettent de traiter plusieurs fichiers omettent les arguments de xargs. -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 :
grep "^author "|sort|uniq -c|sort -nr
Note
D'autres réponses filtrent en fait les lignes qui ne contiennent que des espaces.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
La commande ci-dessus va imprimer les auteurs des lignes contenant au moins un caractère non blanc. Vous pouvez également utiliser match \w*[^\w#]
ce qui exclura également les lignes où le premier caractère non espace n'est pas un #
(commentaire dans de nombreux langages de script).
13 votes
Il devrait vraiment y avoir une commande intégrée pour cela... il existe des commandes pour des cas d'utilisation beaucoup moins courants.
0 votes
@CiroSantilli mais il est facile d'ajouter un shellscript invocable depuis git.
1 votes
C'est assez impressionnant code.google.com/p/gitinspector surtout si vous évaluez les travaux d'équipes d'étudiants (les grands projets ne sont pas concernés... il est lent parce qu'il rejette la faute sur chaque fichier individuel).
1 votes
@CiroSantilliTRUMPBANBAD Cette question porte sur la base de code actuelle et son origine, et non sur le nombre de lignes qu'un auteur a écrites. Imaginez que quelqu'un ajoute un énorme fichier et le supprime lors du prochain commit :
git log
compte toutes ces lignes comme des ajouts et des retraits,git blame
no0 votes
Liés : stackoverflow.com/questions/1265040/