Saya hanya memperluas jawaban dengan @Leif Gruenwoldt
dan merinci apa yang ada dalam referensi yang disediakan oleh@Leif Gruenwoldt
Lakukan sendiri..
- Langkah 1. Buat dokumen teks kosong (nama tidak masalah) di repositori Anda
- Langkah 2. Tahap dan Komit dokumen
- Langkah 3. Identifikasi hash blob dengan menjalankan
git ls-tree HEAD
- Langkah 4. Temukan hash blob menjadi
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Langkah 5. Keluarkan keterkejutan Anda dan baca di bawah
Bagaimana GIT menghitung hash komitnya
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
Teks blob⎵
adalah awalan konstan dan \0
juga konstan dan merupakan NULL
karakter. The <size_of_file>
dan<contents_of_file>
bervariasi tergantung pada file.
Lihat: Apa format file dari objek git commit?
Dan itu semua!
Tapi tunggu!, apakah Anda memperhatikan bahwa <filename>
bukan merupakan parameter yang digunakan untuk komputasi hash? Dua file berpotensi memiliki hash yang sama jika isinya sama pada tanggal dan waktu pembuatan dan namanya. Inilah salah satu alasan Git menangani pemindahan dan mengganti nama dengan lebih baik daripada sistem kontrol versi lain.
Lakukan Sendiri (Ext)
- Langkah 6. Buat file kosong lain dengan yang berbeda
filename
di direktori yang sama
- Langkah 7. Bandingkan hash dari kedua file Anda.
catatan:
Tautan tidak menyebutkan bagaimana tree
objek di-hash. Saya tidak yakin dengan algoritme dan parameternya namun dari pengamatan saya mungkin menghitung hash berdasarkan semua blobs
dan trees
(hash mereka mungkin) yang dikandungnya