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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top