Quelles statistiques de commit Git sont faciles à extraire


90

Auparavant, j'ai apprécié la capacité de TortoiseSvn à générer des statistiques de commit simples pour un référentiel SVN donné. Je me demande ce qui est disponible dans Git et je suis particulièrement intéressé par:

  • Nombre de commits par utilisateur
  • Nombre de lignes modifiées par utilisateur
  • activité au fil du temps (par exemple, les changements hebdomadaires agrégés)

Des idées?

Réponses:


197

En fait, git a déjà une commande pour cela:

git shortlog

dans votre cas, il semble que vous soyez intéressé par ce formulaire:

git shortlog -sne

Voir les --helpdifférentes options.

Vous pouvez également être intéressé par le projet GitStats . Ils ont quelques exemples, y compris les statistiques du projet Git . Depuis la page principale de GitStat:

Voici une liste de quelques statistiques générées actuellement:

  • Statistiques générales: total de fichiers, lignes, commits, auteurs.
  • Activité: engage par heure de la journée, jour de la semaine, heure de la semaine, mois de l'année, année et mois, et année.
  • Auteurs: liste des auteurs (nom, commits (%), date du premier commit, date du dernier commit, âge), auteur du mois, auteur de l'année.
  • Fichiers: nombre de fichiers par date, extensions
  • Lignes: lignes de code par date

1
Ceci est exactement ce que je cherchais. Étonnant que vous puissiez réellement remplacer les lignes de code dans mon exemple par "git shortlog -sn" Votez pour cette réponse
Jesper Rønn-Jensen

13
git shortlog -sn --no-mergessupprimez également les "validations de fusion" du décompte.
lbolla

4
février 2010: Linus attaque!
naught101

25

Premièrement, vous n'avez rien à extraire (comme dans l'extraction réseau), car vous avez tout le référentiel et toute l'histoire localement. Je suis presque sûr qu'il existe des outils qui vous donneront des statistiques, mais parfois vous pouvez simplement être créatif avec les lignes de commande. Par exemple, ceci (juste hors de ma tête) vous donnera le nombre de commits par utilisateur:

git log --pretty=format:%ae \
| gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'

D'autres statistiques que vous avez demandées peuvent nécessiter davantage de réflexion. Vous voudrez peut-être voir les outils disponibles. Recherche de git statisticspoints sur Google pour l' GitStatsoutil, avec lequel je n'ai aucune expérience et encore moins d'idée de ce qu'il faut pour le faire fonctionner sous Windows, mais vous pouvez essayer.



4
git shortlogest en effet la bonne commande ici, mais même sans elle, la commande awk complexe ci-dessus peut être remplacée par| sort | uniq -c
josch

C'est vrai, @josch.
Michael Krelin - hacker

7

Le meilleur outil que j'ai identifié jusqu'à présent est gitinspector. Il donne le rapport d'ensemble par utilisateur, par semaine, etc.

Vous pouvez installer comme ci-dessous avec npm

npm install -g gitinspector

Les détails pour obtenir les liens sont ci-dessous

https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector

des exemples de commandes sont

gitinspector -lmrTw
gitinspector --since=1-1-2017

etc


5

Merci au hacker d'avoir répondu à cette question. Cependant, j'ai trouvé que ces versions modifiées étaient meilleures pour mon utilisation particulière:

git log --pretty=format:%an \
| awk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'\
| sort -r

(en utilisant awk car je n'ai pas gawk sur mon mac, et en triant avec le comitter le plus actif en haut.) Il génère une liste comme ceci:

 1205 therikss
 1026 lsteinth
  771 kmoes
  720 minielse
  507 pagerbak
  269 anjohans
  205 mfoldbje
  188 nstrandb
  133 pmoller
   58 jronn
   10 madjense
    3 nlindhol
    2 shartvig
    2 THERIKSS

Je ne savais pas que vous aviez Mac - la mention de tortue m'a fait penser aux fenêtres. Mais de toute façon, je suis content que vous ayez trouvé votre chemin. Mon extrait de code n'était qu'un exemple et un point de départ.
Michael Krelin - hacker

2
Cela doit être sort -rn.
hughdbrown

@hughdbrown, pour moi, -nn'est pas nécessaire dans sort -rn. J'utilise un mac, mais "trier numérique" ne fait tout simplement aucune différence pour les exemples que j'ai essayés
Jesper Rønn-Jensen

quelle est la différence entre ceci et git shortlog -sn?
Pejman

2

Voici des moyens d'obtenir des statistiques pour une branche spécifique ou deux hachages.

la clé ici est la possibilité de faire HASH..HASH

Ci-dessous, j'utilise le premier hachage d'une branche à la tête qui est la fin de cette branche.

Afficher le total des validations dans une branche

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Sortie 53

Afficher le total des validations par auteur

  • git shortlog FIRST_HASH..HEAD -sne
  • Production
  • 24 Nom de l'auteur
  • 9 Nom de l'auteur


2

J'ai écrit un petit script shell qui calcule les statistiques de fusion (utile lorsqu'il s'agit d'un flux de travail basé sur une branche de fonctionnalité). Voici un exemple de sortie sur un petit référentiel:

[$]> git merge-stats
% of Total Merges               Author  # of Merges  % of Commits
            57.14     Daniel Beardsley            4          5.63
            42.85        James Pearson            3         30.00

De plus, si vous utilisez le système de pull request de GitHub, j'ai écrit github-pr-stats , qui fournit beaucoup plus de données que git-merge-stats et dispose même d'un système de plugins pour vous permettre de l'intégrer dans vos propres analyses spécifiques à l'entreprise.
Xiong Chiamiov


1

Voici un simple script ruby ​​que j'ai utilisé pour obtenir l'auteur, les lignes ajoutées, les lignes supprimées et le nombre de validations de git. Il ne couvre pas les engagements au fil du temps.

Notez que j'ai une astuce où il ignore tout commit qui ajoute / supprime plus de 10000 lignes car je suppose qu'il s'agit d'une importation de code d'une sorte, n'hésitez pas à modifier la logique pour vos besoins. Vous pouvez mettre ce qui suit dans un fichier appelé gitstats-simple.rb, puis exécuter

git log --numstat --pretty='%an' | ruby gitstats-simple.rb

contenu de gitstats-simple.rb

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split
  next if parts.size == 0
  if parts[0].match(/[a-z]+/)
    if who && memo[0] + memo[1] < 2000
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      map[who][2] += 1
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=line[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")


0

Vous pouvez utiliser gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) pour obtenir des activités par auteur et par date. Cela vous donnera un rapport comme celui-ci:

gitlogged 2016-04-25 2016-04-26

qui renvoie la sortie suivante

################################################################

Date: 2016-04-25

Yunan (4):
      fix attachment form for IE (#4407)
      fix (#4406)
      fix merge & indentation attachment form
      fix (#4394) unexpected after edit wo

gilang (1):
      #4404 fix orders cart


################################################################
################################################################

Date: 2016-04-26

Armin Primadi (2):
      Fix document approval logs controller
      Adding git tool to generate summary on what each devs are doing on a given day for reporting purpose

Budi (1):
      remove validation user for Invoice Processing feature

Yunan (3):
      fix attachment in edit mode (#4405) && (#4430)
      fix label attachment on IE (#4407)
      fix void method (#4427)

gilang (2):
      Fix show products list in discussion summary
      #4437 define CApproved_NR status id in order


################################################################

0

Modifiez https://stackoverflow.com/a/18797915/3243930 . la sortie est très proche des données graphiques de github.

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split("\t")
  next if parts.size == 0
  if parts[0].match(/[a-zA-Z]+|[^\u0000-\u007F]+/)
    if who
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      if memo[0] > 0 || memo[1] > 0 
        map[who][2] += 1
      end
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=parts[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")

0

Si vous utilisez github, PR Count est une application github conçue pour afficher les statistiques de contribution.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.