Как мне составить график истории строк кода для git repo? - PullRequest
42 голосов
/ 23 августа 2008

Обычно я хочу получить количество строк кода в хранилище после каждой фиксации.

Единственный (действительно дурацкий) способ, который я нашел, - это использовать git filter-branch для запуска wc -l * и скрипт, который запускает git reset --hard при каждом коммите, а затем запускает wc -l

Для большей ясности, когда инструмент запускается, он выводит строки кода самого первого коммита, затем второго и так далее. Вот что я хочу, чтобы инструмент вывел (как пример):

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

Я играл с библиотекой ruby ​​'git', но самым близким, что я нашел, было использование метода .lines() в diff, который, похоже, должен давать добавленные строки (но не дает: он возвращает 0, когда вы удаляете строки например)

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

Ответы [ 4 ]

25 голосов
/ 18 мая 2010

Вы также можете рассмотреть gitstats , который генерирует этот график в виде HTML-файла.

23 голосов
/ 30 августа 2008

Вы можете получить как добавленные, так и удаленные строки с помощью git log, например:

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

Исходя из этого, вы можете написать сценарий, аналогичный тому, который вы использовали, используя эту информацию. В питоне:

#!/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))
11 голосов
/ 05 июля 2010

http://github.com/ITikhonov/git-loc работал прямо из коробки для меня.

4 голосов
/ 23 августа 2008

Первое, что приходит на ум, - это вероятность того, что ваша история мерзавцев будет иметь нелинейную историю. Вам может быть трудно определить разумную последовательность коммитов.

Сказав это, кажется, что вы могли бы вести журнал идентификаторов коммитов и соответствующих строк кода в этом коммите. В хуке пост-фиксации, начиная с ревизии HEAD, работайте в обратном направлении (при необходимости переходя к нескольким родителям), пока все пути не достигнут фиксации, которую вы уже видели ранее. Это должно дать вам общее количество строк кода для каждого идентификатора коммита.

Помогает ли это кому-нибудь? У меня такое чувство, что я неправильно поняла ваш вопрос.

...