Come posso rappresentare graficamente la cronologia delle righe di codice per il repository git?

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

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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top