Qué estadísticas de confirmación de Git son fáciles de extraer


90

Anteriormente, disfruté de la capacidad de TortoiseSvn para generar estadísticas de confirmación simples para un repositorio SVN dado. Me pregunto qué hay disponible en Git y estoy particularmente interesado en:

  • Número de confirmaciones por usuario
  • Número de líneas cambiadas por usuario
  • actividad a lo largo del tiempo (por ejemplo, cambios semanales agregados)

¿Algunas ideas?

Respuestas:


197

De hecho, git ya tiene un comando para esto:

git shortlog

en su caso, parece que está interesado en este formulario:

git shortlog -sne

Consulte las --helpdistintas opciones.

También puede estar interesado en el proyecto GitStats . Tienen algunos ejemplos, incluidas las estadísticas del proyecto Git . Desde la página principal de GitStat:

A continuación, se muestra una lista de algunas estadísticas generadas actualmente:

  • Estadísticas generales: archivos totales, líneas, confirmaciones, autores.
  • Actividad: confirma por hora del día, día de la semana, hora de la semana, mes del año, año y mes y año.
  • Autores: lista de autores (nombre, confirmaciones (%), primera fecha de confirmación, última fecha de confirmación, edad), autor del mes, autor del año.
  • Archivos: recuento de archivos por fecha, extensiones
  • Líneas: líneas de código por fecha

1
Esto es exactamente lo que estaba buscando. Es sorprendente que realmente pueda reemplazar las líneas de código en mi ejemplo con "git shortlog -sn" Vote por esta respuesta
Jesper Rønn-Jensen

13
también git shortlog -sn --no-mergeselimine "merge commits" del recuento.
lbolla

4
febrero de 2010: ¡ Linus ataca!
naught101

25

Primero, no tiene que extraer nada (como en la extracción de red), porque tiene todo el repositorio y todo el historial localmente. Estoy bastante seguro de que hay herramientas que te darán estadísticas, pero a veces puedes ser creativo con las líneas de comando. Por ejemplo, esto (simplemente fuera de mi cabeza) le dará la cantidad de confirmaciones por usuario:

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

Otras estadísticas que solicitó pueden necesitar más reflexión. Es posible que desee ver las herramientas disponibles. Buscando en Google git statisticspuntos a la GitStatsherramienta, con la que no tengo experiencia e incluso menos idea de lo que se necesita para ejecutarla en Windows, pero puedes intentarlo.



4
git shortloges de hecho el comando correcto aquí, pero incluso sin él, el comando awk complejo anterior puede ser reemplazado por| sort | uniq -c
josch

Eso es cierto, @josch.
Michael Krelin - hacker

7

La mejor herramienta que he identificado hasta ahora es gitinspector. Da el informe establecido por usuario, por semana, etc.

Puede instalar como a continuación con npm

npm install -g gitinspector

Los detalles para obtener los enlaces están a continuación

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

los comandos de ejemplo son

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

etc


5

Gracias al hacker por responder a esta pregunta. Sin embargo, encontré que estas versiones modificadas son mejores para mi uso particular:

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

(usando awk ya que no tengo gawk en mi mac, y ordenando con el comitter más activo en la parte superior). Muestra una lista como la siguiente:

 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

No tenía idea de que tienes Mac; la mención de la tortuga me hizo pensar en Windows. Pero de todos modos, me alegro de que hayas encontrado tu camino. Mi fragmento fue solo un ejemplo y un punto de partida.
Michael Krelin - hacker

2
Esto debe ser sort -rn.
hughdbrown

@hughdbrown, para mí, -nno es necesario en sort -rn. Utilizo un mac, pero "ordenar numérico" simplemente no hace ninguna diferencia para los ejemplos que he probado
Jesper Rønn-Jensen

¿Cuál es la diferencia entre esto y git shortlog -sn?
Pejman

2

A continuación, se muestran formas de obtener estadísticas para una rama específica o dos hash.

La clave aquí es la capacidad de hacer HASH .. HASH

A continuación, estoy usando el primer hash de una rama al HEAD, que es el final de esa rama.

Mostrar el total de confirmaciones en una rama

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

Mostrar el total de confirmaciones por autor

  • git shortlog FIRST_HASH..HEAD -sne
  • Salida
  • 24 Nombre del autor
  • 9 Nombre del autor


2

Escribí un pequeño script de shell que calcula estadísticas de fusión (útil cuando se trata de un flujo de trabajo basado en ramas de características). Aquí hay un resultado de ejemplo en un pequeño repositorio:

[$]> 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

Además, si está utilizando el sistema de solicitud de extracción de GitHub, escribí github-pr-stats , que proporciona muchos más datos que git-merge-stats e incluso tiene un sistema de complementos que le permite integrarse en sus propios análisis específicos de la empresa.
Xiong Chiamiov


1

Aquí hay un script ruby ​​simple que usé para obtener el autor, agregar líneas, eliminar líneas y confirmar el recuento de git. No cubre las confirmaciones a lo largo del tiempo.

Tenga en cuenta que tengo un truco en el que ignora cualquier confirmación que agregue / elimine más de 10,000 líneas porque supongo que se trata de una importación de código de algún tipo, no dude en modificar la lógica según sus necesidades. Puede poner lo siguiente en un archivo llamado gitstats-simple.rb y luego ejecutar

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

contenido 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

Puede usar gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) para obtener actividades por autor y fecha. Esto le dará un informe como este:

gitlogged 2016-04-25 2016-04-26

que devuelve la siguiente salida

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

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

Modifique https://stackoverflow.com/a/18797915/3243930 . la salida está muy cerca de los datos gráficos 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 está utilizando github, PR Count es una aplicación de github creada para mostrar estadísticas de contribución.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.