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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top