Hvordan kan jeg plotte linjer med kode historie for git repo?

stemmer
41

I utgangspunktet ønsker jeg å få antall linjer-of-kode i depotet etter hver begå.

Den eneste (virkelig crappy) måter jeg har funnet er å bruke git filter-branchtil å kjøre wc -l *, og et skript som kjøres git reset --hardpå hver begå, kjører deretterwc -l

For å gjøre det litt klarere, når verktøyet kjøres, vil det sende ut linjer med kode av de aller første begå, da den andre og så videre. Dette er hva jeg vil verktøyet til utgang (som et eksempel):

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

Jeg har spilt rundt med rubin 'git' bibliotek, men det nærmeste jeg fant var ved hjelp av .lines()metoden på en diff, noe som virker som det skal gi den ekstra linjer (men ikke: det returnerer 0 når du sletter linjer for eksempel)

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
Publisert på 23/08/2008 klokken 03:00
kilden bruker
På andre språk...                            


4 svar

stemmer
23

Du kan også vurdere å gitstats , som genererer denne grafen som en html-fil.

Svarte 18/05/2010 kl. 04:09
kilden bruker

stemmer
23

Du kan få både til og fjernes linjer med git log, som:

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

Fra dette, kan du skrive en lignende manus til en du gjorde ved hjelp av denne info. I 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))
Svarte 30/08/2008 kl. 03:55
kilden bruker

stemmer
10

http://github.com/ITikhonov/git-loc fungert rett ut av boksen for meg.

Svarte 05/07/2010 kl. 16:18
kilden bruker

stemmer
4

Det første som hopper til hjernen er muligheten for din git historie har en ikke-lineær historie. Du kan ha problemer med å bestemme en fornuftig rekkefølge av inger.

Når det er sagt, det virker som du kunne holde en logg over forplikte IDer og de tilsvarende kodelinjer i det forplikte. I en post-commit krok, fra HEAD revisjon, jobbe bakover (forgrening til flere foreldre om nødvendig) før alle veier når en begår at du allerede har sett før. Det burde gi deg den totale linjer med kode for hver forplikte id.

Betyr det hjelpe noen? Jeg har en følelse av at jeg har misforstått noe om spørsmålet ditt.

Svarte 23/08/2008 kl. 12:39
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more