42 votes

Comment représenter graphiquement l’historique des lignes de code pour git repo?

Fondamentalement, je veux obtenir le nombre de lignes de code dans le dépôt après chaque commit.

Le seul (vraiment merdique) les moyens que j'ai trouvé est d'utiliser git filter-branch de la course "wc-l *", et un script qui git reset --hard sur chaque commit, puis a couru wc-l

Pour le rendre un peu plus claire, lorsque l'outil est exécuté, il est de sortie les lignes de code de la première validation, puis le deuxième et ainsi de suite.. c'est Ce que je veux de l'outil de production (à titre d'exemple):

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

J'ai joué avec le ruby 'git' de la bibliothèque, mais le plus proche que j'ai trouvé était à l'aide de l' .lignes() la méthode sur un diff, qui semble comme il devrait donner les lignes ajoutées (mais n'est pas.. elle 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

28voto

cboettig Points 2483

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

23voto

fserb Points 1885

Vous pouvez obtenir à la fois 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 utilisé avec 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))
 

11voto

MattDiPasquale Points 23842

http://github.com/ITikhonov/git-loc a fonctionné immédiatement pour moi.

5voto

Greg Hewgill Points 356191

La première chose qui saute à l'esprit est la possibilité de votre historique de git avoir une non-linéaire de l'histoire. Vous pourriez avoir de la difficulté à déterminer un bon séquence de commits.

Cela dit, il semble que vous pourriez tenir un journal de commettre l'ids et les lignes correspondantes du code qui s'engagent. Dans un post-commit hook, à partir de la TÊTE de révision, travailler à rebours (branchement à plusieurs parents si nécessaire) jusqu'à ce que tous les chemins atteindre un commit que vous avez déjà vu avant. Cela devrait vous donner le nombre de lignes de code pour chaque commit id.

Est-ce que c'tout? J'ai un sentiment que j'ai mal compris quelque chose au sujet de votre question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X