Как внутри работает git file log? - PullRequest
1 голос
/ 10 октября 2011

Мне очень интересно, как git log -- filename работает внутри.

Проходит ли это все объекты дерева в хранилище, ищет строку имени файла и затем возвращает все сообщения журнала из коммит-объектовкоторый использует разные blob-идентификаторы?(Я не могу представить, что это работает для больших репозиториев.)

Справочная информация:

Мне нужно проиндексировать весь контент git-репозиториев с помощью Apache Lucene и мне нужна быстрая история файлов.Когда git log --filename медленная команда, может быть, лучше добавить все BLOB-идентификаторы коммита в документ Lucene-Commit-document, чтобы получить быструю историю файлов?

1 Ответ

3 голосов
/ 10 октября 2011

Это в значительной степени то, что он делает, и это довольно быстрая операция. Обычная оль git log проходит по всему дереву коммитов, так что работа - это данность. Чтобы выбрать только те коммиты, которые касаются файла, все, что ему нужно сделать, это прочитать каждый объект коммита, взять их дерево, прочитать это дерево и т. Д. До тех пор, пока он не достигнет рассматриваемого файла, и не получить SHA1 объекта BLOB , Затем он может просто проверить, совпадает ли SHA1 с предыдущим коммитом.

Конечно, не нужно проходить через все деревья, только те, которые необходимы для проверки этого блоба, а «поиск строки имени файла» немного вводит в заблуждение - данные дерева находятся в известный формат.

Так что, конечно, это займет немного больше времени, чем просто просмотр истории, но не тонна. Всего несколько дополнительных операций чтения за коммит, а не увеличение алгоритмической сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...