Это основной алгоритм, который git использует для отслеживания изменений в конкретном файле. Вот почему «git log - some / path / to / file.txt» является сравнительно медленной операцией по сравнению со многими другими системами SCM, где это было бы просто (например, в CVS, P4 и др. Каждый файл репо является файлом сервера с история файла).
Это не займет много времени, чтобы оценить, хотя: количество, которое вы когда-либо должны хранить в памяти, довольно мало. Вы уже упомянули основной момент: помните, что идентификаторы дерева, идущие вниз по пути, быстро устраняют коммиты, которые даже не затрагивают это поддерево. Древовидные объекты редко бывают такими большими, как каталоги в файловой системе (что неудивительно).
Используете ли вы индекс пакета? Если нет, то вам нужно распаковать весь пакет, чтобы выяснить это, поскольку деревья могут находиться в конце длинной цепочки дельта. Если у вас есть индекс, вам все равно придется применять дельты для получения объектов дерева, но, по крайней мере, вы сможете быстро их найти. Сохраняйте кэш примененных дельт, поскольку деревья, очевидно, часто используют одни и те же или похожие базы - большинство изменений объекта дерева просто изменяют 20 байтов от предыдущего объекта дерева. Так что если для получения дерева T1 вам нужно начать с объекта T8 и применить Td7, чтобы получить T7, T6 ... и т. Д., Вполне вероятно, что на эти другие деревья T2-8 снова будут ссылаться.