2016-02-03 6 views
1

Я пытаюсь извлечь журналы GIT из нескольких хранилищ, как это:Как улучшить производительность git log?

git log --pretty=format:%H\t%ae\t%an\t%at\t%s --numstat 

Для больших хранилищ (например, рельсы/рельсы) она занимает твердые 35 + секунд, чтобы сформировать журнал.

Есть ли способ улучшить эту производительность?

+0

Попробуйте '--max-count = 30' как [описано в документации git-log] (https://git-scm.com/docs/git-log). Вам действительно нужно увидеть все 56'000 коммитов для проекта рельсов? – msw

+0

@msw для этого проекта, к сожалению, да. –

ответ

3

Вы считаете, что для получения отчета о 56'000 транзакциях, генерирующих 224'000 строк (15MiB), требуется от 20 до 35 секунд. Я на самом деле думаю, что это довольно приличная производительность, но вы этого не делаете; Хорошо.

Поскольку вы генерируете отчет, используя постоянный формат из неизменной базы данных, вам нужно сделать это только один раз. После этого вы можете использовать кешированный результат git log и пропустить время, требующее много времени. Например:

git log --pretty=format:%H\t%ae\t%an\t%at\t%s --numstat > log-pretty.txt 

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

$ tail -1 log-pretty.txt 
30 0 railties/test/webrick_dispatcher_test.rb 
$ time grep railties/test/webrick_dispatcher_test.rb log-pretty.txt 
… 
30 0 railties/test/webrick_dispatcher_test.rb 

real 0m0.012s 
… 

Не плохо, введение «кэш» сократить время, необходимое от 35+ секунд до десятков миллисекунд. Это почти в 3000 раз быстрее.

+0

Не рассматривал кеширование, это прекрасно! –

3

Моя первая мысль заключалась в том, чтобы улучшить IO, но я тестировал репозиторий рельсов с помощью SSD и получил аналогичный результат: 30 секунд.

--numstat - это то, что замедляет все, иначе git-log может завершить за 1 секунду даже при форматировании. Выполнение diff дорого, поэтому, если вы можете удалить это из своего процесса, что значительно ускорит процесс. Возможно, сделайте это после факта.

В противном случае, если вы отфильтруете записи журнала, используя собственные средства поиска git-log, которые уменьшат количество записей, которые должны быть выполнены. Например, git log --grep=foo --numstat занимает всего одну секунду. They're in the docs under "Commit Limiting". Это может значительно уменьшить количество записей, которые git должен форматировать. Диапазоны пересмотра, фильтры дат, фильтры авторов, сообщение журнала grepping ... все это может повысить производительность git-log в большом хранилище при выполнении дорогостоящей операции.

Смежные вопросы