¿Cómo puedo graficar el historial de líneas de código para el repositorio de git?
-
09-06-2019 - |
Pregunta
Básicamente, quiero obtener la cantidad de líneas de código en el repositorio después de cada confirmación.
La única forma (realmente mala) que he encontrado es usar git filter-branch
correr wc -l *
, y un script que se ejecuta git reset --hard
en cada confirmación, luego se ejecuta wc -l
Para hacerlo un poco más claro, cuando se ejecuta la herramienta, generará las líneas de código de la primera confirmación, luego la segunda y así sucesivamente.Esto es lo que quiero que genere la herramienta (como ejemplo):
me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542
He jugado con la biblioteca Ruby 'git', pero lo más parecido que encontré fue usar el .lines()
método en una diferencia, que parece que debería dar las líneas agregadas (pero no lo hace:devuelve 0 cuando eliminas 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
Solución
También podrías considerar gitstats, que genera este gráfico como un archivo html.
Otros consejos
Es posible que obtengas líneas agregadas y eliminadas con git log, como:
git log --shortstat --reverse --pretty=oneline
A partir de esto, puedes escribir un script similar al que hiciste usando esta información.En pitón:
#!/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))
http://github.com/ITikhonov/git-loc funcionó desde el primer momento para mí.
Lo primero que me viene a la mente es la posibilidad de que su historial de git tenga un historial no lineal.Es posible que tenga dificultades para determinar una secuencia sensata de confirmaciones.
Dicho esto, parece que podría mantener un registro de los identificadores de confirmación y las líneas de código correspondientes en esa confirmación.En un gancho posterior a la confirmación, comenzando desde la revisión HEAD, trabaje hacia atrás (ramificándose a varios padres si es necesario) hasta que todas las rutas alcancen una confirmación que ya haya visto antes.Eso debería darle el total de líneas de código para cada ID de confirmación.
¿Eso ayuda en algo?Tengo la sensación de que he entendido mal algo sobre tu pregunta.