Как я могу отобразить на графике строки истории кода для git repo?

StackOverflow https://stackoverflow.com/questions/23907

Вопрос

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

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

Решение

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

Другие советы

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

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))

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top