2015-09-11 2 views
1

Я работаю над проектом, где я анализирую исходный код на каждом git push. Я ищу способы улучшить производительность/масштабируемость.Восстанавливающая версия кода «на лету» в Git

Простой реализацией будет выполнение «git checkout» на конкретной версии кода (фиксация), которую я хочу проанализировать. Это будет развертывать все файлы на жестком диске, а затем я могу читать все файлы по одному и анализировать их. Однако это связано с большим количеством ввода-вывода, и это сделало бы неэффективной попытку параллелизации алгоритма, анализирующего код.

Мое понимание внутренних элементов Git заключается в том, что git хранит файлы как объекты «blob» (которые хранятся в виде файлов на диске в папке .git). В некоторых случаях для сохранения дискового пространства может сохраняться только разность между версиями. Таким образом, по существу, не нужно делать по крайней мере одно чтение на файл.

Мне интересно, если есть способ воссоздать содержимое всех файлов из этого блоба, так же, как git делает с «git checkout», но вместо того, чтобы развернуть файлы на диске, содержимое всех файлов будет передаваться как один входной поток в алгоритм, пропуская дополнительные операции записи/чтения. Программа может затем параллельно выполнять выполнение алгоритма по мере необходимости/возможного для повышения производительности.

Любые, хотя я могу это сделать? Есть ли git "plumbing" tool/command, который может помочь с этим, или мне нужно изучить исходный код git?

+0

'git show : ' показывает вам файл при данной фиксации; возможно, вы могли бы начать там? – cmbuckley

+0

Может быть, 'git fast-export' даст вам то, что вы хотите? – larsks

+0

Спасибо за предложения, помогли. – krystalcode

ответ

0

Похоже, что лучший вариант для достижения собственной производительности и отсутствие необходимости в вызове git - это использовать библиотеку libgit2, которая реализует основные методы git и имеет несколько языковых привязок. Эквиваленты git ls-tree <treeish> и git show <treeish>:<file> на этом языке будут выполнять конкретную задачу в этом вопросе.

https://libgit2.github.com

«libgit2 представляет собой портативная, чистая реализация C из основных методов Git, предоставляемых в качестве Реентрантной вулканизующейся библиотеки с солидным API, что позволяет писать собственные приложения скорости пользовательских Git на любом языке, который поддерживает C ".

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