Какой алгоритм использует git для обнаружения изменений в вашем рабочем дереве?

Речь идет о внутреннем устройстве git .

Я читал замечательную книгу 'Pro Git' и немного узнал о внутренней работе git (все о SHA1, blobs, ссылках, деревьях , коммиты и т. д. и т. д.). Между прочим, довольно умная архитектура.

Итак, чтобы поместить в контекст, git ссылается на содержимое файла как на значение SHA1, поэтому он может узнать, изменилось ли конкретное содержимое просто сравнение хеш-значений. Но мой вопрос конкретно о том, как git проверяет, изменилось ли содержимое в рабочем дереве или нет.

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

Еще одна идея - проверить дату последней модификации файла, но я думаю, что git не хранит эту информацию (когда вы клонируете репозиторий, все файлы имеют новое время)

Я уверен, что он это делает эффективным способом (git действительно быстро), кто-нибудь знает, как это достигается?

PD: Просто чтобы добавить интересную ссылку об индексе git, в частности, о том, что индекс хранит информацию о файлах временные метки, даже если у объектов дерева их нет.

49
задан Jalal 16 July 2019 в 14:47
поделиться