Wie kann ich den Codezeilenverlauf für Git Repo grafisch darstellen?
-
09-06-2019 - |
Frage
Grundsätzlich möchte ich nach jedem Commit die Anzahl der Codezeilen im Repository ermitteln.
Die einzige (wirklich beschissene) Möglichkeit, die ich gefunden habe, ist die Verwendung git filter-branch
laufen wc -l *
, und ein Skript, das ausgeführt wird git reset --hard
bei jedem Commit, dann ausgeführt wc -l
Um es etwas klarer zu machen: Wenn das Tool ausgeführt wird, gibt es die Codezeilen des allerersten Commits aus, dann die des zweiten und so weiter.Folgendes soll das Tool ausgeben (als Beispiel):
me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542
Ich habe mit der Ruby-Git-Bibliothek herumgespielt, aber am nächsten kam mir die Verwendung der .lines()
Methode auf einem Diff, die scheinbar die hinzugefügten Zeilen liefern sollte (aber nicht:es gibt 0 zurück, wenn Sie beispielsweise Zeilen löschen)
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
Lösung
Vielleicht denken Sie auch darüber nach Gitstats, wodurch dieses Diagramm als HTML-Datei generiert wird.
Andere Tipps
Sie können mit git log sowohl hinzugefügte als auch entfernte Zeilen erhalten, wie zum Beispiel:
git log --shortstat --reverse --pretty=oneline
Auf dieser Grundlage können Sie mit diesen Informationen ein ähnliches Skript schreiben wie das, das Sie erstellt haben.In 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 hat bei mir sofort funktioniert.
Das erste, was mir in den Sinn kommt, ist die Möglichkeit, dass Ihr Git-Verlauf einen nichtlinearen Verlauf hat.Möglicherweise fällt es Ihnen schwer, eine sinnvolle Reihenfolge von Commits festzulegen.
Allerdings scheint es, als könnten Sie ein Protokoll der Commit-IDs und der entsprechenden Codezeilen in diesem Commit führen.Arbeiten Sie in einem Post-Commit-Hook, beginnend mit der HEAD-Revision, rückwärts (verzweigen Sie bei Bedarf zu mehreren übergeordneten Elementen), bis alle Pfade einen Commit erreichen, den Sie bereits zuvor gesehen haben.Damit sollten Sie die Gesamtzahl der Codezeilen für jede Commit-ID erhalten.
Hilft das irgendjemandem?Ich habe das Gefühl, dass ich bei Ihrer Frage etwas falsch verstanden habe.