Como posso representar graficamente o histórico de linhas de código para o repositório git?

StackOverflow https://stackoverflow.com/questions/23907

Pergunta

Basicamente, quero obter o número de linhas de código no repositório após cada confirmação.

A única maneira (realmente ruim) que encontrei é usar git filter-branch para correr wc -l *, e um script que executa git reset --hard em cada commit e então executa wc -l

Para deixar um pouco mais claro, quando a ferramenta for executada, ela gerará as linhas de código do primeiro commit, depois do segundo e assim por diante.Isto é o que eu quero que a ferramenta produza (como 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 encontrei foi usar o .lines() método em um diff, que parece que deveria fornecer as linhas adicionadas (mas não:retorna 0 quando você exclui 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
Foi útil?

Solução

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

Outras dicas

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

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

A partir disso, você pode escrever um script semelhante ao que você fez usando essas informações.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))

http://github.com/ITikhonov/git-loc funcionou imediatamente para mim.

A primeira coisa que vem à mente é a possibilidade de seu histórico git ter um histórico não linear.Você pode ter dificuldade em determinar uma sequência sensata de commits.

Dito isto, parece que você poderia manter um log de IDs de commit e as linhas de código correspondentes nesse commit.Em um gancho pós-commit, começando pela revisão HEAD, trabalhe de trás para frente (ramificando para vários pais, se necessário) até que todos os caminhos cheguem a um commit que você já viu antes.Isso deve fornecer o total de linhas de código para cada ID de commit.

Isso ajuda alguma coisa?Tenho a sensação de que entendi mal alguma coisa sobre sua pergunta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top