Сведения о вопросе

Fhohir

01:05, 29th August, 2020

Теги

python   ruby   git   lines-of-code    

Как я могу построить график строк истории кода для git РЕПО?

Просмотров: 477   Ответов: 4

В принципе, я хочу получить номер lines-of-code в репозитории после каждого коммита.

Единственный (действительно дерьмовый) способ, который я нашел, - это использовать 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



  Сведения об ответе

prince

10:20, 10th August, 2020

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


  Сведения об ответе

+-*/

22:04, 2nd August, 2020

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

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

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


  Сведения об ответе

VCe znayu

02:18, 21st August, 2020

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


  Сведения об ответе

lesha

11:32, 8th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться