Comment puis-je «abuser» du blâme (ou d'une fonction mieux adaptée, et / ou en conjonction avec des commandes shell) pour me donner une statistique de la quantité de lignes (de code) actuellement dans le référentiel provenant de chaque committer?
Exemple de sortie:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Réponses:
Mettre à jour
J'ai mis à jour certaines choses en cours de route.
Pour plus de commodité, vous pouvez également mettre ceci dans sa propre commande:
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.
est presque instantané.
Pour obtenir une liste des fichiers actuellement suivis, vous pouvez utiliser
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.si les fichiers peuvent contenir des espaces, ce qui est mauvais pour les shells, vous pouvez utiliser:
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 appelonsgit blame --line-porcelain
et pour chaque appel, nous utilisons exactement 1 argument.Nous filtrons ensuite la sortie pour les occurrences de "auteur" trions la liste et comptons les lignes en double par:
Remarque
D'autres réponses filtrent en fait les lignes qui ne contiennent que des espaces blancs.
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).la source
echo "a\nb\nc"|xargs -n1 cmd
sera étendu àcmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
J'ai écrit un joyau appelé git-fame qui pourrait être utile.
Installation et utilisation:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Production:
la source
Explication étape par étape:
Lister tous les fichiers sous contrôle de version
Taillez la liste uniquement aux fichiers texte
Git blâme tous les fichiers texte, ignorant les changements d'espaces
Retirez les noms des auteurs
Triez la liste des auteurs et demandez à uniq de compter le nombre de lignes répétitives consécutives
Exemple de sortie:
la source
sed
version différente , la mienne ne comprend pas le-r
drapeau et a des problèmes avec l'expression régulière (se plaint de parens déséquilibrés, même lorsque j'enlève le surplus(
).sudo brew install gnu-sed
je l' ai résolu. Fonctionne comme un charme!port install gsed
pour les utilisateurs de MacPorts.sudo brew install gnu-sed
(qui a fonctionné) mais je reçois toujours des erreurs que sed ne reconnaît pas -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
fourni par le paquet git-extras est exactement ce dont vous avez besoin. Consultez la documentation sur git-extras - git-summary :Donne une sortie qui ressemble à ceci:
la source
La solution d'Erik était géniale, mais j'ai eu quelques problèmes avec les signes diacritiques (malgré le fait que mes
LC_*
variables d'environnement soient définies ostensiblement correctement) et le bruit qui fuyait sur les lignes de code qui contenaient en fait des dates. Mon sed-fu est pauvre, donc je me suis retrouvé avec cet extrait de frankenstein avec du rubis, mais cela fonctionne parfaitement pour moi sur 200 000+ LOC, et il trie les résultats:Notez également
gsed
au lieu desed
parce que c'est l'installation homebrew binaire, laissant le système sed intact.la source
git shortlog -sn
Cela affichera une liste de commits par auteur.
la source
Voici l'extrait principal de la réponse de @Alex qui fait en fait l'opération d'agrégation des lignes de blâme. Je l'ai réduit pour fonctionner sur un seul fichier plutôt que sur un ensemble de fichiers.
Je poste ceci ici parce que je reviens souvent à cette réponse et que je relis le message et que je résume les exemples pour extraire la partie que j'apprécie. Il n'est pas non plus assez générique pour mon cas d'utilisation; sa portée est pour un projet C entier.
J'aime répertorier les statistiques par fichier, obtenues via un
for
itérateur bash au lieu dexargs
trouver des xargs moins lisibles et difficiles à utiliser / à mémoriser, les avantages / inconvénients de xargs vs pour devraient être discutés ailleurs.Voici un extrait pratique qui affichera les résultats pour chaque fichier individuellement:
Et j'ai testé, exécuter cette stright dans un shell bash est sûr ctrl + c, si vous avez besoin de mettre cela dans un script bash, vous devrez peut-être intercepter sur SIGINT et SIGTERM si vous voulez que l'utilisateur puisse rompre votre boucle for.
la source
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
J'ai trouvé un léger ajustement à l'git blame
ici qui décrit plus précisément les statistiques que je cherchais. Plus précisément, l'option -M et -C -C (ce sont deux C à des fins). -M détecte les déplacements dans le fichier et -C -C détecte les lignes copiées à partir d'autres fichiers. Voir le doc ici . Par souci d'exhaustivité, -w ignore les espaces blancs.Découvrez la commande gitstats disponible sur http://gitstats.sourceforge.net/
la source
J'ai cette solution qui compte les lignes blâmées dans tous les fichiers texte (à l'exclusion des fichiers binaires, même ceux versionnés):
la source
Cela fonctionne dans n'importe quel répertoire de la structure source du dépôt, au cas où vous voudriez inspecter un certain module source.
la source
J'ai adopté la meilleure réponse à Powershell:
Il est facultatif de savoir si vous exécutez
git blame
avec le-w
commutateur, je l'ai ajouté car il ignore les changements d'espaces.Les performances sur ma machine étaient en faveur de Powershell (~ 50s vs ~ 65s pour le même repo), bien que la solution Bash fonctionnait sous WSL2
la source
J'ai créé mon propre script qui est une combinaison de @nilbus et @Alex
la source
enter code here
causait des problèmes .... est-ce que cela fonctionne correctement?Fonction Bash qui cible un seul fichier source exécuté sur MacOS.
la source