Я только расширяю ответ на @Leif Gruenwoldt
и уточняю, что находится в ссылке , предоставленной @Leif Gruenwoldt
Сделай сам ..
- Шаг 1. Создайте пустой текстовый документ (имя не имеет значения) в вашем хранилище
- Шаг 2. Подготовьте и зафиксируйте документ
- Шаг 3. Определите хэш большого двоичного объекта, выполнив
git ls-tree HEAD
- Шаг 4. Найдите хэш блоба
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Шаг 5. Избавьтесь от удивления и прочитайте ниже
Как GIT вычисляет свои хеши коммитов
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
Текст blob⎵
является постоянным префиксом, а \0
также является постоянным и является символом NULL
. <size_of_file>
и <contents_of_file>
варьируются в зависимости от файла.
См .: Каков формат файла объекта git commit?
И это все люди!
Но подождите! , вы заметили, что <filename>
не является параметром, используемым для вычисления хеша? Два файла могут иметь одинаковый хэш, если их содержимое одинаково независимо от даты и времени их создания и их имени. Это одна из причин, по которой Git обрабатывает перемещения и переименовывает лучше, чем другие системы контроля версий.
Сделай сам (Ext)
- Шаг 6. Создайте еще один пустой файл с другим
filename
в том же каталоге
- Шаг 7. Сравните хэши обоих ваших файлов.
Примечание:
В ссылке не упоминается, как хешируется объект tree
. Я не уверен в алгоритме и параметрах, однако, исходя из моих наблюдений, он, вероятно, вычисляет хэш на основе всех blobs
и trees
(их хэши, вероятно), которые он содержит