Comment puis-je représenter graphiquement l'historique des lignes de code pour le dépôt git ?
-
09-06-2019 - |
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
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.