ฉันกำลังขยายคำตอบโดย@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>
แตกต่างกันไปขึ้นอยู่กับไฟล์
ดู: รูปแบบไฟล์ของวัตถุคอมมิตคืออะไร?
และนั่นคือทุกคน!
แต่เดี๋ยวก่อน! คุณสังเกตเห็นไหมว่า<filename>
ไม่ใช่พารามิเตอร์ที่ใช้สำหรับการคำนวณแฮช ไฟล์สองไฟล์อาจมีแฮชเหมือนกันหากเนื้อหาไม่แยแสวันที่และเวลาที่สร้างและชื่อ นี่เป็นสาเหตุหนึ่งที่ Git จัดการกับการย้ายและเปลี่ยนชื่อได้ดีกว่าระบบควบคุมเวอร์ชันอื่น ๆ
ทำเอง (Ext)
- ขั้นตอนที่ 6. สร้างไฟล์เปล่าอื่นที่มีไฟล์อื่น
filename
อยู่ในไดเร็กทอรีเดียวกัน
- ขั้นตอนที่ 7. เปรียบเทียบแฮชของทั้งสองไฟล์ของคุณ
บันทึก:
ลิงก์ไม่ได้กล่าวถึงวิธีการtree
แฮชวัตถุ ฉันไม่แน่ใจในอัลกอริทึมและพารามิเตอร์อย่างไรก็ตามจากการสังเกตของฉันมันอาจจะคำนวณแฮชตามblobs
และtrees
(แฮชของพวกเขาอาจ) ที่มีอยู่ทั้งหมด