Como posso representar graficamente o histórico de linhas de código para o repositório git?
-
09-06-2019 - |
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
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.