Как я могу построить график истории строк кода для git repo?

В основном я хочу получить количество строк кода в хранилище после каждого коммита.

Единственный (действительно дурацкий) способ, который я нашел, это использовать 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
23.08.2008 03:00:46
4 ОТВЕТА
РЕШЕНИЕ

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

28
18.05.2010 04:09:01
он действительно выдает график из # линий, но он довольно крошечный.
Rudolf Olah 6.01.2014 21:40:27
(@omouse - он также генерирует количество строк данных по файлу данных, которые вы можете отобразить в приложении по вашему выбору)
Rich 17.12.2014 16:36:39

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

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

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

5
23.08.2008 12:39:52

Вы можете получить как добавленные, так и удаленные строки с помощью 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))
23
30.08.2008 03:55:23
if not line.strip(): continueможет быть более надежным.
jfs 14.01.2009 13:08:22
argvне используется вmain()
jfs 14.01.2009 13:11:43
(скопировано из старого ответа) Это прекрасно! Я собирался написать это на Python, но у меня была установлена ​​библиотека ruby-git, поэтому я попытался сделать это, используя это. Спасибо! С небольшими изменениями в операторе печати я могу сохранить вывод в файл .csv и поместить его в Google Docs / Spreadsheet, чтобы сгенерировать график! Он не совсем совершенен, так как он считает комментарии и строки документов как код, и я понятия не имею, как он будет обрабатывать двоичные файлы ... но, как сценарий, я могу работать в любом хранилище, без сложных перехватов после фиксации и тому подобного, Здорово!
dbr 5.07.2010 22:48:39
Регулярное выражение в этом ответе больше не работает. Сообщения журнала git иногда не содержат удалений или вставок.
John Wiseman 3.10.2012 20:00:53
Также он не соответствует 1 файлу, 1 удалению, 1 вставке. (s не обязательно)
kon psych 16.05.2017 18:40:50

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

11
5.07.2010 16:18:32