¿Hay un comando que pueda invocar que contará las líneas cambiadas por un autor específico en un repositorio de Git? Sé que debe haber formas de contar el número de confirmaciones, ya que Github hace esto para su gráfico de Impacto.
458
git://git.lwn.net/gitdm.git
.Respuestas:
El resultado del siguiente comando debería ser razonablemente fácil de enviar al script para sumar los totales:
Esto proporciona estadísticas para todos los commits en el HEAD actual. Si desea agregar estadísticas en otras ramas, deberá proporcionarlas como argumentos para
git log
.Para pasar a un script, eliminar incluso el formato "en línea" se puede hacer con un formato de registro vacío, y como comentó Jakub Narębski,
--numstat
es otra alternativa. Genera estadísticas por archivo en lugar de por línea, pero es aún más fácil de analizar.fuente
--numstat
lugar de hacerlo--shortstat
si desea agregar estadísticas un poco más fácilmente.git help log
me dice que las primeras son líneas agregadas, las segundas líneas borradas.Esto proporciona algunas estadísticas sobre el autor, modificar según sea necesario.
Usando Gawk:
Usando Awk en Mac OSX:
EDITAR (2017)
Hay un nuevo paquete en github que se ve elegante y usa bash como dependencias (probado en linux). Es más adecuado para uso directo en lugar de scripts.
Es git-quick-stats (enlace github) .
Copie
git-quick-stats
a una carpeta y agregue la carpeta a la ruta.Uso:
fuente
gawk
paraawk
hacerlo funcionar en el terminal OSXgit clone https://github.com/arzzen/git-quick-stats.git
En caso de que alguien quiera ver las estadísticas de cada usuario en su base de código, un par de mis compañeros de trabajo recientemente inventaron esta horrible frase:
(Tarda unos minutos en analizar nuestro repositorio, que tiene alrededor de 10-15k confirmaciones).
fuente
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Git fama https://github.com/oleander/git-fame-rb
es una buena herramienta para obtener el recuento de todos los autores a la vez, incluido el recuento de confirmación y archivos modificados:
También hay una versión de Python en https://github.com/casperdcl/git-fame (mencionado por @fracz):
Salida de muestra:
Pero ten cuidado: como lo mencionó Jared en el comentario, hacerlo en un repositorio muy grande llevará horas. Sin embargo, no estoy seguro de si eso podría mejorarse, teniendo en cuenta que debe procesar tantos datos de Git.
fuente
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Encontré lo siguiente útil para ver quién tenía la mayoría de las líneas que estaban actualmente en la base del código:
Las otras respuestas se han centrado principalmente en las líneas cambiadas en las confirmaciones, pero si las confirmaciones no sobreviven y se sobrescriben, es posible que hayan sido abandonadas. El encantamiento anterior también te permite ordenar todos los confirmadores por líneas en lugar de solo uno a la vez. Puede agregar algunas opciones a git blame (-C -M) para obtener mejores números que tengan en cuenta el movimiento de archivos y el movimiento de línea entre archivos, pero el comando podría ejecutarse mucho más si lo hace.
Además, si está buscando líneas cambiadas en todas las confirmaciones para todos los confirmadores, el siguiente pequeño script es útil:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
fuente
/^.*\((.*?)\s[\d]{4}/
debe ser/^.*?\((.*?)\s[\d]{4}/
para evitar paréntesis coincidentes en la fuente como autor.Para contar el número de confirmaciones de un autor determinado (o de todos los autores) en una rama determinada, puede usar git-shortlog ; vea especialmente sus
--numbered
y--summary
opciones, por ejemplo, cuando se ejecuta en el repositorio de git:fuente
v1.6.4
está aquí en este ejemplo para hacer que la salida sea determinista: será lo mismo sin importar cuándo clone y / o recupere del repositorio de git.v1.6.4
me da:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
o, si prefiere no incluir fusionesgit shortlog -sne --no-merges
-s
es--summary
,-n
es--numbered
y [nuevo]-e
es--email
mostrar correos electrónicos de autores (y contar por separado el mismo autor con diferentes direcciones de correo electrónico, teniendo en cuenta las.mailmap
correcciones). Buena llamada sobre--no-merges
.Después de mirar a Alex y la respuesta de Gerty3000 , he intentado acortar la frase :
Básicamente, usar git log numstat y no realizar un seguimiento de la cantidad de archivos modificados.
Git versión 2.1.0 en Mac OSX:
Ejemplo:
fuente
La respuesta de AaronM usando el shell one-liner es buena, pero en realidad, hay otro error, donde los espacios corromperán los nombres de usuario si hay diferentes cantidades de espacios en blanco entre el nombre de usuario y la fecha. Los nombres de usuario corruptos darán varias filas para los recuentos de usuarios y usted debe sumarlos usted mismo.
Este pequeño cambio solucionó el problema para mí:
Observe el + after \ s que consumirá todos los espacios en blanco desde el nombre hasta la fecha.
En realidad, agrego esta respuesta tanto para mi propio recuerdo como para ayudar a alguien más, ya que esta es al menos la segunda vez que busco en Google el tema :)
--show-email
agit blame -w
agregado en el correo electrónico, ya que algunas personas usan diferentesName
formatos en diferentes computadoras, y a veces dos personas con el mismo nombre están trabajando en el mismo git.fuente
unsupported file type
pero, de lo contrario, parece funcionar bien incluso con ellos (los omite).Aquí hay un breve resumen que genera estadísticas para todos los autores. Es mucho más rápido que la solución anterior de Dan en https://stackoverflow.com/a/20414465/1102119 (la mía tiene una complejidad de tiempo O (N) en lugar de O (NM) donde N es el número de confirmaciones y M el número de autores )
fuente
--no-show-signature
, de lo contrario, las personas que firman sus compromisos no serán contadas.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"
. (Tenga en cuenta que estoy en Windows; puede que necesite usar diferentes tipos de citas)@mmrobins @AaronM @ErikZ @JamesMishra proporcionaron variantes que tienen un problema en común: le piden a git que produzca una mezcla de información no destinada al consumo de scripts, incluido el contenido de la línea del repositorio en la misma línea, luego combina el desorden con una expresión regular .
Este es un problema cuando algunas líneas no son texto UTF-8 válido, y también cuando algunas líneas coinciden con la expresión regular (esto sucedió aquí).
Aquí hay una línea modificada que no tiene estos problemas. Solicita a git que genere datos de forma limpia en líneas separadas, lo que facilita el filtrado de lo que queremos de manera sólida:
Puede buscar otras cadenas, como correo de autor, committer, etc.
Quizás primero
export LC_ALL=C
(suponiendobash
) forzar el procesamiento a nivel de bytes (esto también acelera enormemente el grep de las configuraciones regionales basadas en UTF-8).fuente
Se dio una solución con ruby en el medio, perl está un poco más disponible por defecto aquí es una alternativa usando perl para las líneas actuales por autor.
fuente
Además de la respuesta de Charles Bailey , es posible que desee agregar el
-C
parámetro a los comandos. De lo contrario, los cambios de nombre de archivo cuentan como muchas adiciones y eliminaciones (tantas como el archivo tenga líneas), incluso si el contenido del archivo no se modificó.Para ilustrar, aquí hay un commit con muchos archivos que se mueven de uno de mis proyectos, cuando uso el
git log --oneline --shortstat
comando:Y aquí el mismo commit usando el
git log --oneline --shortstat -C
comando que detecta copias de archivos y renombra:En mi opinión, este último da una visión más realista de cuánto impacto ha tenido una persona en el proyecto, porque renombrar un archivo es una operación mucho más pequeña que escribir el archivo desde cero.
fuente
puedes usar whodid ( https://www.npmjs.com/package/whodid )
y
o simplemente escriba
entonces puedes ver un resultado como este
fuente
-g
tenía que llegar antes de que el nombre del paquete, enmacOS
. Simplemente tratando de ayudar.Aquí hay un script rápido de ruby que acota el impacto por usuario en una consulta de registro dada.
Por ejemplo, para rubinius :
la secuencia de comandos:
fuente
esta es la mejor manera y también le da una idea clara del número total de confirmaciones de todos los usuarios
fuente
Proporcioné una modificación de una respuesta breve anterior, pero no fue suficiente para mis necesidades. Necesitaba poder clasificar tanto las líneas confirmadas como las líneas en el código final. También quería un desglose por archivo. Este código no se repite, solo devolverá los resultados para un solo directorio, pero es un buen comienzo si alguien quiere ir más allá. Copie y pegue en un archivo y haga ejecutable o ejecútelo con Perl.
fuente
Para usuarios de Windows, puede usar el siguiente script por lotes que cuenta las líneas agregadas / eliminadas para el autor especificado
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
fuente
Aquí hay un gran repositorio que te hace la vida más fácil
git-quick-stats
En un mac con brew instalado
brew install git-quick-stats
correr
git-quick-stats
Simplemente elija la opción que desea de esta lista escribiendo el número que aparece y presionando enter.
fuente
Este script aquí lo hará. Póngalo en authorhip.sh, chmod + x it, y ya está todo listo.
fuente
Guarde sus registros en el archivo usando:
Para los amantes de Python:
Sus resultados serían como:
fuente
Quieres culpar a Git .
Hay una opción --show-stats para imprimir algunas, bueno, estadísticas.
fuente
blame
, pero ¿realmente no dio las estadísticas que pensé que necesitaría el OP?La pregunta para obtener información sobre un determinado autor , pero muchas de las respuestas fueron soluciones que arrojaron listas clasificadas de autores en función de sus líneas de código cambiadas.
Esto era lo que estaba buscando, pero las soluciones existentes no eran del todo perfectas. En interés de las personas que pueden encontrar esta pregunta a través de Google, he realizado algunas mejoras en ellos y los he convertido en un script de shell, que se muestra a continuación. Puede encontrar uno anotado (que continuaré manteniendo) en mi Github .
No hay dependencias ni en Perl ni en Ruby. Además, los espacios en blanco, los cambios de nombre y los movimientos de línea se tienen en cuenta en el recuento de cambio de línea. Simplemente ponga esto en un archivo y pase su repositorio Git como primer parámetro.
fuente
La mejor herramienta hasta ahora identificada es gitinspector. Proporciona el informe establecido por usuario, por semana, etc. Puede instalar como a continuación con npm
npm install -g gitinspector
Los enlaces para obtener más detalles
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
los comandos de ejemplo son
fuente
Escribí este script de Perl para lograr esa tarea.
Lo nombré
git-line-changes-by-author
y lo puse/usr/local/bin
. Debido a que está guardado en mi camino, puedo emitir el comandogit line-changes-by-author --before 2018-12-31 --after 2020-01-01
para obtener el informe para el año 2019. Como ejemplo. Y si tuviera que escribir mal el nombre git sugeriría la ortografía correcta.Es posible que desee ajustar el
_get_repo_slug
sub para que solo incluya la última parte delremote.origin.url
archivo ya que mis repositorios se guardan comoproject/repo
y es posible que no lo sea.fuente