Ответ 1
Вы также можете рассмотреть gitstats, который генерирует этот график как html файл.
В основном я хочу получить количество строк кода в репозитории после каждой фиксации.
Единственные (действительно дрянные) способы, которые я нашел, это использовать 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
Вы также можете рассмотреть gitstats, который генерирует этот график как html файл.
Вы можете получить и добавленные и удаленные строки с журналом 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))
http://github.com/ITikhonov/git-loc работал прямо из коробки для меня.
Первое, что приходит в голову, - это возможность вашей истории git иметь нелинейную историю. Возможно, вам трудно определить разумную последовательность коммитов.
Сказав это, похоже, что вы можете сохранить журнал идентификаторов фиксации и соответствующие строки кода в этом commit. В post-commit hook, начиная с ревизии HEAD, работайте назад (разветвляясь до нескольких родителей, если необходимо), пока все пути не достигнут фиксации, которую вы уже видели раньше. Это должно дать вам общие строки кода для каждого идентификатора фиксации.
Это помогает? У меня такое чувство, что я что-то не понял о вашем вопросе.