Como posso representar graficamente as Linhas de história Código de repo git?

votos
40

Basicamente eu quero obter o número de linhas-de-código no repositório após cada commit.

As únicas maneiras (realmente ruins) que eu encontrei é usar git filter-brancha correr wc -l *, e um script que é executado git reset --hardem cada commit, em seguida, executawc -l

Para torná-lo um pouco mais claro, quando a ferramenta é executado, ele será saída as linhas de código do primeiro cometer, depois o segundo e assim por diante. Isto é o que eu quero a ferramenta para a saída (como um exemplo):

me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542

Eu brinquei com a biblioteca ruby 'git', mas o mais próximo que eu encontrei foi usando o .lines()método em um diff, que parece que deve dar as linhas adicionadas (mas não faz: ele retorna 0 quando você excluir linhas, por exemplo)

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
Publicado 23/08/2008 em 04:00
fonte usuário
Em outras línguas...                            


4 respostas

votos
23

Você também pode considerar gitstats , o que gera este gráfico como um arquivo html.

Respondeu 18/05/2010 em 05:09
fonte usuário

votos
23

Você pode obter ambas as linhas adicionadas e removidas com git log, como:

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

A partir daí, você pode escrever um script semelhante ao que você fez usando esta informação. Em 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))
Respondeu 30/08/2008 em 04:55
fonte usuário

votos
9

http://github.com/ITikhonov/git-loc funcionou direito fora da caixa para mim.

Respondeu 05/07/2010 em 17:18
fonte usuário

votos
4

A primeira coisa que salta à mente é a possibilidade de sua história git ter uma história não-linear. Você pode ter dificuldade em determinar uma sequência sensata de commits.

Dito isto, parece que você pode manter um registro de cometer ids e as linhas correspondentes de código em que cometeu. Em um post-commit gancho, a partir da revisão HEAD, trabalhar para trás (ramificação para vários pais se necessário) até que todos os caminhos de alcançar uma consolidação que você já viu antes. Isso deve lhe dar total de linhas de código para cada commit id.

Isso ajuda qualquer? Eu tenho um sentimento que eu tenha entendido mal algo sobre sua pergunta.

Respondeu 23/08/2008 em 13:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more