Comment puis-je représenter graphiquement l'historique des lignes de code pour le dépôt git ?

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

Question

Fondamentalement, je veux obtenir le nombre de lignes de code dans le référentiel après chaque validation.

La seule façon (vraiment merdique) que j'ai trouvée est d'utiliser git filter-branch courir wc -l *, et un script qui s'exécute git reset --hard à chaque commit, puis s'exécute wc -l

Pour que ce soit un peu plus clair, lorsque l'outil est exécuté, il affichera les lignes de code du tout premier commit, puis du second et ainsi de suite.Voici ce que je veux que l'outil génère (à titre d'exemple) :

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

J'ai joué avec la bibliothèque Ruby 'git', mais la plus proche que j'ai trouvée était d'utiliser le .lines() méthode sur un diff, qui semble devoir donner les lignes ajoutées (mais ce n'est pas le cas :il renvoie 0 lorsque vous supprimez des lignes par exemple)

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
Était-ce utile?

La solution

Vous pourriez également envisager gitstats, qui génère ce graphique sous forme de fichier HTML.

Autres conseils

Vous pouvez obtenir des lignes ajoutées et supprimées avec git log, comme :

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

À partir de là, vous pouvez écrire un script similaire à celui que vous avez créé en utilisant ces informations.En 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 a fonctionné dès la sortie de la boîte pour moi.

La première chose qui me vient à l’esprit est la possibilité que votre historique Git ait un historique non linéaire.Vous pourriez avoir des difficultés à déterminer une séquence raisonnable de validations.

Cela dit, il semble que vous puissiez conserver un journal des identifiants de validation et des lignes de code correspondantes dans cette validation.Dans un hook post-commit, à partir de la révision HEAD, travaillez à rebours (en créant des branches vers plusieurs parents si nécessaire) jusqu'à ce que tous les chemins atteignent un commit que vous avez déjà vu auparavant.Cela devrait vous donner le nombre total de lignes de code pour chaque identifiant de validation.

Est-ce que ça aide quelqu'un ?J'ai le sentiment d'avoir mal compris quelque chose à propos de votre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top