python - example - ¿Cómo puedo representar gráficamente el historial de líneas de código para git repo?
install git python (4)
Básicamente, quiero obtener el número de líneas de código en el repositorio después de cada confirmación.
La única (realmente horrible) forma que he encontrado es usar git filter-branch
para ejecutar wc -l *
, y un script que ejecuta git reset --hard
en cada commit, luego ejecuta wc -l
Para hacerlo un poco más claro, cuando se ejecuta la herramienta, daría como salida 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 muestre (como ejemplo):
me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542
He jugado con la biblioteca ''git'' de ruby, pero lo más parecido que encontré fue usar el método .lines()
en un diff, que parece que debería dar las líneas adicionales (pero no lo hace: devuelve 0 cuando 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
Lo primero que me viene a la mente es la posibilidad de que tu historial de git tenga un historial no lineal. Puede tener dificultades para determinar una secuencia razonable de confirmaciones.
Habiendo dicho eso, parece que podría mantener un registro de identificadores de commit y las líneas de código correspondientes en ese commit. 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.
¿Eso ayuda? Tengo la sensación de haber malinterpretado algo acerca de tu pregunta.
Puede obtener líneas agregadas y eliminadas con registro de git, como:
git log --shortstat --reverse --pretty=oneline
A partir de esto, puede escribir un script similar al que usó con 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))
También puede considerar gitstats , que genera este gráfico como un archivo html.
http://github.com/ITikhonov/git-loc funcionó de la caja para mí.