Это о внутренностях git
.
Я читал замечательную книгу "Pro Git" и немного узнал о том, как Git работает внутри (все о SHA1, BLOB-объектах, ссылках, деревьях, коммитах и т.д. И т.д.). Кстати, довольно умная архитектура.
Итак, в контексте, git ссылается на содержимое файла как значение SHA1, чтобы он мог узнать, изменился ли конкретный контент, просто сравнивая значения хеш-функции. Но мой вопрос конкретно о том, как git проверяет, изменился ли контент в рабочем дереве или нет.
Наивный подход будет заключаться в том, что каждый раз, когда вы запускаете команду как git status
или аналогичную команду, он просматривает все файлы в рабочем каталоге, вычисляет SHA1 и сравнивает его с тем, который имеет последний коммит. Но это кажется очень неэффективным для больших проектов, таких как ядро Linux.
Другая идея может заключаться в проверке даты последнего изменения файла, но я думаю, что git не хранит эту информацию (когда вы клонируете репозиторий, у всех файлов новое время)
Я уверен, что он делает это эффективно (git работает очень быстро), кто-нибудь знает, как этого добиться?
PD: Просто чтобы добавить интересную ссылку об индексе git, в частности, указав, что индекс хранит информацию о временных метках файлов, даже если объекты дерева этого не делают.