2008-08-23 5 views
40

Básicamente quiero obtener el número de líneas de código en el repositorio después de cada confirmación.¿Cómo puedo representar gráficamente el historial de líneas de código para git repo?

Las únicas maneras (realmente horrible) que he encontrado es utilizar git filter-branch para funcionar wc -l *, y un script que se ejecuta git reset --hard en cada confirmación, a continuación, se ejecuta wc -l

Para que sea un poco más claro, cuando la herramienta está ejecutar, generará las líneas de código de la primera confirmación, luego la segunda y así sucesivamente. Esto es lo que quiero que la herramienta de salida (como ejemplo):

[email protected]:~/$ gitsloc --branch master 
10 
48 
153 
450 
1734 
1542 

He jugado un poco con el rubí 'git' biblioteca, pero el más cercano que encontré fue con el método .lines() en un diff, que parece que debería dar a las líneas añadidas (pero no: devuelve 0 cuando se elimina líneas, por ejemplo)

require 'rubygems' 
require 'git' 

total = 0 
g = Git.open(working_dir = '/Users/dbr/Desktop/code_projects/tvdb_api')  

last = nil 
g.log.each do |cur| 
    diff = g.diff(last, cur) 
    total = total + diff.lines 
    puts total 
    last = cur 
end 

Respuesta

23

También puede considerar gitstats, que genera este gráfico como un archivo HTML.

+0

efectivamente produce un gráfico de # de líneas pero es bastante pequeño. –

+2

(@omouse - también emite un # de líneas por archivo de datos de fecha, que puede graficar en una aplicación de su elección) – Rich

4

lo primero que salta a la mente es la posibilidad de su historial git tener una historia no lineal. Puede tener dificultades para determinar una secuencia razonable de confirmaciones.

Dicho esto, parece que se podría mantener un registro de los identificadores de cometer y las correspondientes líneas de código en esa confirmación. En un enganche post-commit, comenzando desde la revisión HEAD, trabaje hacia atrás (ramificándose a múltiples padres si es necesario) hasta que todas las rutas alcancen una confirmación que ya haya visto antes. Eso debería proporcionarle las líneas de código totales para cada identificación de confirmación.

ayuda esto a alguna? Tengo la sensación de haber malinterpretado algo acerca de tu pregunta.

23

líneas Usted puede obtener tanto añadidas y eliminadas con git log, como:

git log --shortstat --reverse --pretty=oneline 

partir de esto, se puede escribir un guión similar a la que hizo uso de esta información. En Python:

#!/usr/bin/python 

""" 
Display the per-commit size of the current git branch. 
""" 

import subprocess 
import re 
import sys 

def main(argv): 
    git = subprocess.Popen(["git", "log", "--shortstat", "--reverse", 
         "--pretty=oneline"], stdout=subprocess.PIPE) 
    out, err = git.communicate() 
    total_files, total_insertions, total_deletions = 0, 0, 0 
    for line in out.split('\n'): 
    if not line: continue 
    if line[0] != ' ': 
     # This is a description line 
     hash, desc = line.split(" ", 1) 
    else: 
     # This is a stat line 
     data = re.findall(
     ' (\d+) files changed, (\d+) insertions\(\+\), (\d+) deletions\(-\)', 
     line) 
     files, insertions, deletions = (int(x) for x in data[0]) 
     total_files += files 
     total_insertions += insertions 
     total_deletions += deletions 
     print "%s: %d files, %d lines" % (hash, total_files, 
             total_insertions - total_deletions) 


if __name__ == '__main__': 
    sys.exit(main(sys.argv)) 
+0

'err' será siempre' None' en el código. – jfs

+0

'if not line.strip(): continue' podría ser más robusto. – jfs

+0

'argv' no se usa en' main() ' – jfs

Cuestiones relacionadas