Come posso rappresentare graficamente la cronologia delle righe di codice per il repository git?
-
09-06-2019 - |
Domanda
Fondamentalmente voglio ottenere il numero di righe di codice nel repository dopo ogni commit.
L'unico modo (davvero scadente) che ho trovato è usare git filter-branch
correre wc -l *
, e uno script che viene eseguito git reset --hard
su ogni commit, quindi viene eseguito wc -l
Per renderlo un po' più chiaro, quando lo strumento viene eseguito, restituirà le righe di codice del primo commit, poi del secondo e così via.Questo è ciò che voglio che lo strumento restituisca (come esempio):
me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542
Ho giocato con la libreria "git" di Ruby, ma la cosa più vicina che ho trovato è stata usare il file .lines()
su un diff, che sembra dovrebbe fornire le righe aggiunte (ma non lo fa:restituisce 0 quando elimini righe, ad esempio)
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
Soluzione
Potresti anche considerare gitstats, che genera questo grafico come file html.
Altri suggerimenti
Potresti ottenere sia righe aggiunte che rimosse con git log, come:
git log --shortstat --reverse --pretty=oneline
Da questo, puoi scrivere uno script simile a quello che hai fatto utilizzando queste informazioni.In pitone:
#!/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 ha funzionato subito per me.
La prima cosa che mi viene in mente è la possibilità che la tua cronologia git abbia una cronologia non lineare.Potresti avere difficoltà a determinare una sequenza sensata di commit.
Detto questo, sembra che potresti tenere un registro degli ID di commit e le righe di codice corrispondenti in quel commit.In un hook post-commit, a partire dalla revisione HEAD, lavora all'indietro (ramificandosi a più genitori se necessario) finché tutti i percorsi raggiungono un commit che hai già visto prima.Questo dovrebbe darti il totale delle righe di codice per ciascun ID di commit.
Questo aiuta qualcuno?Ho la sensazione di aver frainteso qualcosa riguardo alla tua domanda.