ระหว่างการโคลนแรกของพื้นที่เก็บข้อมูล git แรกได้รับวัตถุ (ซึ่งชัดเจนเพียงพอ) และจากนั้นใช้เวลาประมาณ "การแก้ไข deltas" ในเวลาเดียวกัน เกิดอะไรขึ้นในช่วงโคลนนี้
ระหว่างการโคลนแรกของพื้นที่เก็บข้อมูล git แรกได้รับวัตถุ (ซึ่งชัดเจนเพียงพอ) และจากนั้นใช้เวลาประมาณ "การแก้ไข deltas" ในเวลาเดียวกัน เกิดอะไรขึ้นในช่วงโคลนนี้
คำตอบ:
Git ใช้การเข้ารหัสเดลต้าเพื่อเก็บวัตถุบางอย่างใน packfiles แต่คุณไม่ต้องการให้มีการเล่นการเปลี่ยนแปลงทุกครั้งเดียวที่เคยในไฟล์ที่กำหนดเพื่อให้ได้รับรุ่นปัจจุบันดังนั้น Git นอกจากนี้ยังมีภาพรวมเป็นครั้งคราวของเนื้อหาของไฟล์ที่เก็บไว้ได้เป็นอย่างดี "การแก้ไขเดลตา" เป็นขั้นตอนที่เกี่ยวข้องกับการทำให้แน่ใจว่าทั้งหมดนั้นยังคงที่
นี่คือบทจากส่วน "Git Internals" ของหนังสือ Pro Git ซึ่งมีให้ทางออนไลน์ซึ่งพูดถึงเรื่องนี้
git gcหรือเมื่อใดก็ตามที่ Git กำหนดว่าจำเป็น) Git จะบีบอัดไฟล์ "หลวม" ทั้งหมดลงใน packfile เพื่อประหยัดพื้นที่และไฟล์ดัชนีลงใน packfile นั้นจะถูกสร้างขึ้น ดังนั้น zlib จะบีบอัดด้วยอัลกอริทึมเดลต้าของตัวเอง แต่ Git ใช้การเข้ารหัสเดลต้าเพื่อเก็บเวอร์ชันก่อนหน้า เนื่องจากการเข้าถึงที่พบบ่อยและบ่อยที่สุดคือเวอร์ชันล่าสุดซึ่งจัดเก็บเป็นสแน็ปช็อต
ขั้นตอนgit cloneคือ:
"Resolving deltas" เป็นข้อความที่แสดงสำหรับขั้นตอนที่สองการสร้างดัชนีไฟล์แพ็ค ("git index-pack")
ไฟล์แพ็คไม่มีรหัสวัตถุจริงในนั้นมีเพียงเนื้อหาของวัตถุ ดังนั้นในการพิจารณาว่า ID วัตถุคืออะไร git ต้องทำการแตก + SHA1 ของแต่ละวัตถุในแพ็คเพื่อสร้าง ID ของวัตถุซึ่งจะถูกเขียนลงในไฟล์ดัชนี
วัตถุในแพ็คไฟล์อาจถูกจัดเก็บเป็นเดลต้าเช่นลำดับของการเปลี่ยนแปลงเพื่อทำกับวัตถุอื่น ๆ ในกรณีนี้ git จำเป็นต้องเรียกคืนวัตถุฐานใช้คำสั่งและผลลัพธ์ SHA1 วัตถุฐานเองอาจจะต้องได้รับจากการใช้ลำดับของคำสั่ง delta (แม้ว่าในกรณีของโคลนวัตถุพื้นฐานจะได้รับการพบแล้วมีข้อ จำกัด ว่าวัตถุที่ผลิตจำนวนมากจะถูกแคชในหน่วยความจำ)
โดยสรุปขั้นตอน "การแก้ไขเดลตา" เกี่ยวข้องกับการคลายการบีบอัดและการตรวจสอบฐานข้อมูล repo ทั้งหมดซึ่งไม่น่าแปลกใจใช้เวลาค่อนข้างนาน การคลายและคำนวณ SHA1 นั้นน่าจะใช้เวลามากกว่าการใช้คำสั่ง delta
ในกรณีของการดึงข้อมูลไฟล์แพ็คที่ได้รับอาจมีการอ้างอิง (เป็นฐานวัตถุเดลต้า) ไปยังวัตถุอื่น ๆ ที่คาดว่าจะได้รับคอมไพล์แล้ว ในกรณีนี้ git ที่ได้รับจะเขียนไฟล์แพ็คที่ได้รับใหม่เพื่อรวมวัตถุที่อ้างอิงเช่นนั้นเพื่อให้ไฟล์แพ็คที่เก็บไว้นั้นมีความพอเพียง นี่อาจเป็นที่ที่ข้อความ "การแก้ไขเดลตา" เกิดขึ้น
อำพันดูเหมือนจะอธิบายโมเดลวัตถุที่ Mercurial หรือการใช้ที่คล้ายกัน Git ไม่ได้จัดเก็บ deltas ระหว่างรุ่นที่ตามมาของวัตถุ แต่เป็น snapshot เต็มรูปแบบของวัตถุทุกครั้ง จากนั้นบีบอัดสแนปชอตเหล่านี้โดยใช้การบีบอัดเดลต้าพยายามหาเดลตาที่ดีในการใช้โดยไม่คำนึงว่าจะมีที่ไหนในประวัติศาสตร์