Sadece cevabı genişletiyorum @Leif Gruenwoldt
ve tarafından sağlanan referansta ne olduğunu detaylandırıyorum@Leif Gruenwoldt
Kendin Yap..
- Adım 1. Deponuzda boş bir metin belgesi (adın önemi yoktur) oluşturun
- Adım 2. Belgeyi Hazırlayın ve Teslim Edin
- 3. Adım. Blob'un karmasını çalıştırarak tanımlayın
git ls-tree HEAD
- Adım 4. Blob'un hash değerini bulun
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Adım 5. Sürprizinizden kurtulun ve aşağıyı okuyun
GIT, commit karmalarını nasıl hesaplar?
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
Metin blob⎵
sabit bir önek ve \0
aynı zamanda sabit ve NULL
karakterdir. <size_of_file>
ve<contents_of_file>
dosya bağlı olarak değişir.
Bakınız: Git commit nesnesinin dosya formatı nedir?
Ve hepsi bu kadar!
Fakat bekle! , <filename>
hash hesaplaması için kullanılan bir parametre olmadığını fark ettiniz mi? İçerikleri oluşturuldukları tarih ve saat ile adlarından aynı kayıtsızsa, iki dosya potansiyel olarak aynı hash'e sahip olabilir. Bu, Git'in hareketleri işlemesinin ve diğer sürüm kontrol sistemlerinden daha iyi yeniden adlandırmasının nedenlerinden biridir.
Kendin Yap (Dahili)
- Adım 6. Farklı bir dosya ile başka bir boş dosya oluşturun.
filename
Aynı dizinde olan
- Adım 7. Her iki dosyanın karmalarını karşılaştırın.
Not:
Bağlantı, tree
nesnenin nasıl karma hale getirildiğinden bahsetmez . Algoritma ve parametrelerden emin değilim, ancak gözlemime göre muhtemelen içerdiği tüm blobs
ve trees
(muhtemelen hash'lerine) dayalı bir hash hesaplıyor