Как я могу отобразить на графике строки истории кода для git repo?
-
09-06-2019 - |
Вопрос
По сути, я хочу получить количество строк кода в репозитории после каждой фиксации.
Единственный (действительно дерьмовый) способ, который я нашел, - это использовать 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, работайте в обратном направлении (при необходимости разветвляясь на несколько родительских элементов), пока все пути не достигнут фиксации, которую вы уже видели ранее.Это должно дать вам общее количество строк кода для каждого идентификатора фиксации.
Помогает ли это кому-нибудь?У меня такое чувство, что я что-то неправильно понял в вашем вопросе.