47 votes

Git : Comment estimer la contribution d'une personne à mon projet en termes de lignes de code ajoutées/changées ?

J'ai un dépôt GIT et je veux calculer combien de lignes de code ont été ajoutées/modifiées par une personne ou un groupe de personnes pendant une période donnée. Est-il possible de calculer avec git ?

4 votes

Ne l'utilisez pas pour estimer la "performance", voir blogs.msdn.com/b/oldnewthing/archive/2010/11/16/10091537.aspx

1 votes

Merci pour votre commentaire, je n'avais pas l'intention de mesurer le salaire d'une personne avec ce type de mesure. Cela sera fait pour avoir une vue d'ensemble du travail d'une personne, et personne ne saura jamais que j'en fais une.

6 votes

Ce n'est pas la taille des lignes qui compte, c'est la façon dont vous les utilisez.

85voto

abyx Points 15304

Vous pouvez utiliser git log et un peu de shell-fu :

git log --shortstat --author "Aviv Ben-Yosef" --since "2 weeks ago" --until "1 week ago" \
    | grep "files\? changed" \
    | awk '{files+=$1; inserted+=$4; deleted+=$6} END \
           {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

Explication : git log --shortstat affiche une courte statistique sur chaque commit, qui, entre autres, montre le nombre de fichiers modifiés, de lignes insérées et supprimées. Nous pouvons ensuite filtrer cette statistique pour un commit spécifique ( --author "Your Name" ) et un intervalle de temps ( --since "2 weeks ago" --until "1 week ago" ).

Maintenant, afin de résumer les statistiques au lieu de voir l'entrée par commit, nous utilisons un script shell pour le faire. Premièrement, nous utilisons grep pour ne filtrer que les lignes avec les diffs. Ces lignes ressemblent à ceci :

 8 files changed, 169 insertions(+), 81 deletions(-)

ou ceci :

 1 file changed, 4 insertions(+), 4 deletions(-)

Nous les additionnons ensuite en utilisant awk pour chaque ligne, nous additionnons les fichiers modifiés (1er mot), les lignes insérées (4ème mot) et les lignes supprimées (6ème mot), puis nous les imprimons après avoir fait la somme de tout cela.

Edit : des slashs avant ont été ajoutés dans le snippet du haut afin qu'il puisse être copié et collé dans une ligne de commande.

1 votes

Je pense que vous avez besoin de signes "=" entre --author et --since et --until.

0 votes

Merci pour cela ! Je l'ai un peu modifié et j'en ai fait une fonction shell. Elle est disponible ici : gist.github.com/pstadler/4722416

5 votes

Cela fonctionne très bien tant qu'il y a des insertions. Dans le cas où il n'y aurait que des suppressions, elles compteraient comme des insertions, parce que le 4ème mot sur 8 files changed, 81 deletions est une suppression, pas une insertion.

18voto

Dogbert Points 44003

Vous pouvez générer des statistiques en utilisant Gitstats . Il y a une section 'Auteurs' qui inclut le nombre de lignes ajoutées/supprimées par les 20 premiers auteurs (20 premiers par nombre de commit).

Edit : Il y a aussi Git : Blame Statistics

2 votes

Pouvez-vous nous dire à quoi ressemble l'utilisation de base ?

4voto

GreenRaccoon23 Points 1471

Exécutez cette commande :

git log --pretty=format:'' --numstat --author 'Lu4' | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}';

Cette commande est très proche de la commande intelligente dans La réponse d'abyx mais il gère également le cas limite trouvé par Wallace Sidhrée . Parfois, un commit implique uniquement des suppressions (c'est-à-dire aucune insertion). La commande dans La réponse d'abyx lit incorrectement ces suppressions comme des insertions. La commande ici les lit correctement car elle utilise --numstat au lieu de --shortstat . Contrairement à --shortstat , --numstat comprend à la fois les insertions et les suppressions pour ces commits.

Notez que les deux commandes incluent les fichiers binaires dans le décompte des fichiers mais excluent le nombre de lignes insérées et supprimées à l'intérieur de ces binaires.


Voici une autre astuce utile. Créez un fichier appelé gitstats avec ce contenu :

#!/usr/bin/env bash

git log --pretty=format:'' --numstat "$@" | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}';

Ensuite, vous pouvez exécuter cette commande avec toutes les options supplémentaires pour git log que vous voulez. Voici quelques exemples :

./gitstats;
./gitstats --since '1 month ago';
./gitstats --since '1 month ago' --until '1 day ago';
./gitstats --author 'Lu4' --since '1 month ago' --until '1 day ago';

(Le fichier peut être nommé autrement que gitstats bien sûr.)

3voto

1P0 Points 21

Pour des dates particulières, vous pouvez utiliser --since "2012-08-27" --until "2012-09-01".

Comme

git log --shortstat --author "Fabian" --since "2012-08-27" --until "2012-09-01" | grep "fichiers modifiés" | awk '{files+=$1 ; inserted+=$4 ; supprimé+=$6} END {print "files changed", files, "lines inserted :", inserted, "lines deleted :", deleted}''

Vérifiez cette explication

http://gitref.org/inspect/

2voto

Walterwhites Points 97

Vous pouvez le faire :

1) Courir :

nano contribution.sh

2) remplir :

if [ $# -eq 1 ]
then
        git log --author=$1 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - > logs.txt
        cat logs.txt
else
        echo "ERROR: you should pass username at argument"
fi

3) Exécuter :

chmod +x contribution.sh

4) Maintenant vous pouvez voir votre contribution avec :

./contribution.sh your_git_username

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X