Existe-t-il une commande que je peux invoquer qui comptera les lignes modifiées par un auteur spécifique dans un référentiel Git? Je sais qu'il doit y avoir des moyens de compter le nombre de validations comme le fait Github pour leur graphique d'impact.
458
git://git.lwn.net/gitdm.git
.Réponses:
La sortie de la commande suivante devrait être raisonnablement facile à envoyer au script pour additionner les totaux:
Cela donne des statistiques pour tous les commits sur la HEAD actuelle. Si vous souhaitez ajouter des statistiques dans d'autres branches, vous devrez les fournir comme arguments
git log
.Pour passer à un script, la suppression même du format "en ligne" peut être effectuée avec un format de journal vide, et comme l'a commenté Jakub Narębski,
--numstat
est une autre alternative. Il génère des statistiques par fichier plutôt que par ligne, mais est encore plus facile à analyser.la source
--numstat
place de--shortstat
si vous souhaitez ajouter des statistiques un peu plus facilement.git help log
me dit que les premières lignes sont ajoutées, les secondes supprimées.Cela donne quelques statistiques sur l'auteur, modifiez au besoin.
Utilisation de Gawk:
Utilisation d'Awk sur Mac OSX:
EDIT (2017)
Il y a un nouveau paquet sur github qui a l'air lisse et utilise bash comme dépendances (testé sur linux). Il est plus adapté à une utilisation directe qu'à des scripts.
C'est git-quick-stats (lien github) .
Copiez
git-quick-stats
dans un dossier et ajoutez le dossier au chemin.Usage:
la source
gawk
pourawk
le faire fonctionner dans le terminal OSXgit clone https://github.com/arzzen/git-quick-stats.git
Au cas où quelqu'un voudrait voir les statistiques de chaque utilisateur dans sa base de code, quelques-uns de mes collègues ont récemment proposé cet horrible one-liner:
(Prend quelques minutes pour parcourir notre repo, qui a environ 10-15k commits.)
la source
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Git fame https://github.com/oleander/git-fame-rb
est un bel outil pour obtenir le nombre de tous les auteurs à la fois, y compris le nombre de fichiers de validation et de fichiers modifiés:
Il existe également une version Python sur https://github.com/casperdcl/git-fame (mentionnée par @fracz):
Exemple de sortie:
Mais attention: comme mentionné par Jared dans le commentaire, le faire sur un très grand référentiel prendra des heures. Je ne sais pas si cela pourrait être amélioré, étant donné qu'il doit traiter autant de données Git.
la source
git fame --branch=dev --timeout=-1 --exclude=Pods/*
J'ai trouvé ce qui suit utile pour voir qui avait le plus de lignes actuellement dans la base de code:
Les autres réponses se sont principalement concentrées sur les lignes modifiées dans les commits, mais si les commits ne survivent pas et sont remplacés, ils peuvent simplement avoir été désabonnés. L'incantation ci-dessus vous permet également de trier tous les committers par lignes au lieu d'un seul à la fois. Vous pouvez ajouter quelques options à git blame (-C -M) pour obtenir de meilleurs nombres qui prennent en compte le mouvement de fichier et le mouvement de ligne entre les fichiers, mais la commande peut s'exécuter beaucoup plus longtemps si vous le faites.
De plus, si vous recherchez des lignes modifiées dans toutes les validations pour tous les validateurs, le petit script suivant est utile:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
la source
/^.*\((.*?)\s[\d]{4}/
devrait être/^.*?\((.*?)\s[\d]{4}/
d'empêcher la correspondance des parenthèses dans la source en tant qu'auteur.Pour compter le nombre de validations d'un auteur donné (ou de tous les auteurs) sur une branche donnée, vous pouvez utiliser git-shortlog ; voir en particulier ses options
--numbered
et ses--summary
options, par exemple lorsqu'il est exécuté sur le dépôt git:la source
v1.6.4
c'est ici dans cet exemple pour rendre la sortie déterministe: ce sera la même peu importe quand avez-vous cloné et / ou récupéré à partir du référentiel git.v1.6.4
me donne:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
ou, si vous préférez ne pas inclure les fusionsgit shortlog -sne --no-merges
-s
est--summary
,-n
est--numbered
et [nouveau]-e
est--email
d'afficher les e-mails des auteurs (et de compter séparément le même auteur avec une adresse e-mail différente, en tenant compte des.mailmap
corrections). Bon appel--no-merges
.Après avoir regardé la réponse d' Alex et de Gerty3000 , j'ai essayé de raccourcir le one-liner:
Fondamentalement, l'utilisation de git log numstat et le non- suivi du nombre de fichiers ont changé.
Git version 2.1.0 sur Mac OSX:
Exemple:
la source
La réponse d' AaronM en utilisant le shell one-liner est bonne, mais en fait, il y a encore un autre bug, où les espaces corrompent les noms d'utilisateur s'il y a différentes quantités d'espaces blancs entre le nom d'utilisateur et la date. Les noms d'utilisateurs corrompus donneront plusieurs lignes pour le nombre d'utilisateurs et vous devez les résumer vous-même.
Ce petit changement a résolu le problème pour moi:
Notez le + après \ s qui consommera tous les espaces blancs du nom à la date.
En fait, ajouter cette réponse autant pour ma propre mémoire que pour aider quelqu'un d'autre, car c'est au moins la deuxième fois que je google sur le sujet :)
--show-email
àgit blame -w
agréger sur le courrier électronique à la place, car certaines personnes utilisent desName
formats différents sur différents ordinateurs, et parfois deux personnes portant le même nom travaillent dans le même git.la source
unsupported file type
mais sinon cela semble fonctionner correctement même avec eux (il les saute).Voici une courte ligne unique qui produit des statistiques pour tous les auteurs. C'est beaucoup plus rapide que la solution de Dan ci-dessus sur https://stackoverflow.com/a/20414465/1102119 (la mienne a la complexité temporelle O (N) au lieu de O (NM) où N est le nombre de validations et M le nombre d'auteurs ).
la source
--no-show-signature
, sinon les personnes qui signent pgp leurs commits ne seront pas comptées.count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
. (Notez que je suis sous Windows; vous devrez peut-être utiliser différents types de citations)@mmrobins @AaronM @ErikZ @JamesMishra a fourni des variantes qui ont toutes un problème en commun: ils demandent à git de produire un mélange d'informations non destinées à la consommation de scripts, y compris le contenu de la ligne du référentiel sur la même ligne, puis associent le désordre avec une expression rationnelle .
C'est un problème lorsque certaines lignes ne sont pas du texte UTF-8 valide, et aussi lorsque certaines lignes correspondent à l'expression rationnelle (cela s'est produit ici).
Voici une ligne modifiée qui n'a pas ces problèmes. Il demande à git de sortir les données proprement sur des lignes séparées, ce qui facilite le filtrage robuste de ce que nous voulons:
Vous pouvez grep pour d'autres chaînes, comme author-mail, committer, etc.
Peut-être faites d'abord
export LC_ALL=C
(en supposantbash
) pour forcer le traitement au niveau des octets (cela se produit également pour accélérer considérablement grep à partir des paramètres régionaux basés sur UTF-8).la source
Une solution a été donnée avec ruby au milieu, perl étant un peu plus disponible par défaut voici une alternative utilisant perl pour les lignes actuelles par auteur.
la source
En plus de la réponse de Charles Bailey , vous voudrez peut-être ajouter le
-C
paramètre aux commandes. Sinon, les renommages de fichiers comptent comme de nombreux ajouts et suppressions (autant que le fichier comporte des lignes), même si le contenu du fichier n'a pas été modifié.Pour illustrer, voici un commit avec beaucoup de fichiers déplacés depuis l'un de mes projets, lors de l'utilisation de la
git log --oneline --shortstat
commande:Et voici le même commit en utilisant la
git log --oneline --shortstat -C
commande qui détecte les copies de fichiers et les renomme:À mon avis, ce dernier donne une vision plus réaliste de l'impact qu'une personne a eu sur le projet, car renommer un fichier est une opération beaucoup plus petite que l'écrire à partir de zéro.
la source
vous pouvez utiliser whodid ( https://www.npmjs.com/package/whodid )
et
ou tapez simplement
alors vous pouvez voir un résultat comme celui-ci
la source
-g
devait venir avant le nom du paquet, lemacOS
. J'essaye simplement d'aider.Voici un script ruby rapide qui corrige l'impact par utilisateur contre une requête de journal donnée.
Par exemple, pour rubinius :
le scénario:
la source
c'est la meilleure façon et cela vous donne également une image claire du nombre total de commits par tous les utilisateurs
la source
J'ai fourni une modification d'une réponse courte ci-dessus, mais ce n'était pas suffisant pour mes besoins. J'avais besoin de pouvoir catégoriser les lignes validées et les lignes dans le code final. Je voulais aussi une ventilation par fichier. Ce code n'est pas récurrent, il ne renverra que les résultats pour un seul répertoire, mais c'est un bon début si quelqu'un veut aller plus loin. Copiez et collez dans un fichier et exécutez-le ou exécutez-le avec Perl.
la source
Pour les utilisateurs de Windows, vous pouvez utiliser le script de commandes suivant qui compte les lignes ajoutées / supprimées pour l'auteur spécifié
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
la source
Voici un super repo qui vous facilite la vie
git-quick-stats
Sur un Mac avec brew installé
brew install git-quick-stats
Courir
git-quick-stats
Choisissez simplement l'option que vous souhaitez dans cette liste en tapant le numéro indiqué et en appuyant sur Entrée.
la source
Ce script ici le fera. Mettez-le dans authorhip.sh, chmod + x it, et vous êtes prêt.
la source
Enregistrez vos journaux dans un fichier en utilisant:
Pour les amateurs de Python:
Vos sorties seraient comme:
la source
Vous voulez blâmer Git .
Il y a une option --show-stats pour imprimer des statistiques.
la source
blame
, mais cela n'a pas vraiment donné les statistiques dont je pensais que l'OP aurait besoin?La question posée des informations sur une spécifique auteur , mais la plupart des réponses étaient des solutions qui renvoyaient des listes classées d'auteurs en fonction de leurs lignes de code modifiées.
C'est ce que je cherchais, mais les solutions existantes n'étaient pas tout à fait parfaites. Dans l'intérêt des personnes susceptibles de trouver cette question via Google, j'ai apporté quelques améliorations à celles-ci et en ai fait un script shell, que j'affiche ci-dessous. Un annoté (que je continuerai à maintenir) peut être trouvé sur mon Github .
Il n'y a pas de dépendances sur Perl ou Ruby. De plus, les espaces blancs, les renommages et les mouvements de ligne sont pris en compte dans le nombre de changements de ligne. Mettez-le simplement dans un fichier et passez votre référentiel Git comme premier paramètre.
la source
Le meilleur outil que j'ai identifié jusqu'à présent est gitinspector. Il donne le rapport défini par utilisateur, par semaine, etc. Vous pouvez installer comme ci-dessous avec npm
npm install -g gitinspector
Les liens pour obtenir plus de détails
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
des exemples de commandes sont
la source
J'ai écrit ce script Perl pour accomplir cette tâche.
Je l'ai nommé
git-line-changes-by-author
et mis/usr/local/bin
. Parce qu'il est enregistré sur mon chemin, je peux lancer la commandegit line-changes-by-author --before 2018-12-31 --after 2020-01-01
pour obtenir le rapport pour l'année 2019. Par exemple. Et si je devais mal orthographier le nom git suggérera l'orthographe appropriée.Vous souhaiterez peut-être ajuster le
_get_repo_slug
sous - marin pour n'inclure que la dernière partie duremote.origin.url
fichier car mes référentiels sont enregistrés sousproject/repo
et le vôtre pourrait ne pas l'être.la source