Подтвердить что ты не робот

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

В основном я хочу получить количество строк кода в репозитории после каждой фиксации.

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

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

[email protected]:~/$ 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
4b9b3361

Ответ 1

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

Ответ 2

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

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

Из этого вы можете написать аналогичный script тот, который вы использовали, используя эту информацию. В 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))

Ответ 4

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

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

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