Я тільки розширення на відповідь по @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
(їх хешей, ймовірно), що він містить