หนังสือ Git มีบทความเกี่ยวกับสิ่งที่ดัชนีรวมถึง :
ดัชนีเป็นไฟล์ไบนารี (โดยทั่วไปเก็บไว้ใน.git/index
) ที่มีรายการเรียงลำดับของชื่อเส้นทางแต่ละคนมีสิทธิ์และ SHA1 ของวัตถุหยด; git ls-files
สามารถแสดงเนื้อหาของดัชนี:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
ปัญหา Racy คอมไพล์จะช่วยให้รายละเอียดบางอย่างเพิ่มเติมเกี่ยวกับโครงสร้างที่:
ดัชนีเป็นหนึ่งในโครงสร้างข้อมูลที่สำคัญที่สุดใน git
เพราะมันหมายถึงสถานะต้นไม้ทำงานเสมือนโดยการบันทึกรายการของเส้นทางและชื่อวัตถุของพวกเขาและทำหน้าที่เป็นพื้นที่การแสดงละครที่จะเขียนวัตถุต้นไม้ต่อไปที่จะมุ่งมั่น
สถานะคือ "เสมือน" ในแง่ที่ไม่จำเป็นต้องและมักจะไม่ตรงกับไฟล์ในแผนผังการทำงาน
หากต้องการดูเพิ่มเติม cf " git / git / เอกสาร / เทคนิค / index-format.txt ":
ไฟล์ดัชนี Git มีรูปแบบดังต่อไปนี้
หมายเลขไบนารีทั้งหมดอยู่ในลำดับไบต์ของเครือข่าย
เวอร์ชัน 2อธิบายไว้ที่นี่เว้นแต่จะระบุไว้เป็นอย่างอื่น
- ส่วนหัวขนาด 12 ไบต์ประกอบด้วย:
- ลายเซ็น 4 ไบต์:
ลายเซ็นคือ {' D
', ' I
', ' R
', ' C
'} (หมายถึง " dircache
")
- หมายเลขเวอร์ชัน 4 ไบต์: เวอร์ชัน
ปัจจุบันที่รองรับคือ 2, 3 และ 4
- จำนวนรายการดัชนี 32 บิต
- จำนวนที่เรียงลำดับรายการดัชนี
- ส่วนขยาย :
ส่วนขยายถูกระบุด้วยลายเซ็นต์
สามารถละเว้นส่วนขยายที่เป็นตัวเลือกได้หาก Git ไม่เข้าใจ
ปัจจุบัน Git รองรับต้นไม้ที่แคชและแก้ไขการเลิกทำการขยาย
- ลายเซ็นส่วนขยาย 4 ไบต์ หากไบต์แรกคือ '
A
' .. ' Z
' นามสกุลจะเป็นตัวเลือกและสามารถละเว้นได้
- ขนาดส่วนขยาย 32 บิต
- ขยายข้อมูล
- SHA-1 160 บิตเหนือเนื้อหาของไฟล์ดัชนีก่อนการตรวจสอบนี้
ความคิดเห็นmljrg :
ถ้าดัชนีเป็นสถานที่ที่จัดเตรียมการส่งมอบครั้งต่อไปทำไม "" ไม่git ls-files -s
ส่งคืนสิ่งใดหลังจากการส่งมอบ?
เนื่องจากดัชนีแสดงถึงสิ่งที่ถูกติดตามและหลังจากการคอมมิชชันสิ่งที่ถูกติดตามจะเหมือนกับการคอมมิทล่าสุด ( git diff --cached
ไม่ส่งคืนอะไร)
ดังนั้นgit ls-files -s
แสดงรายการไฟล์ทั้งหมดที่ถูกติดตาม (ชื่อวัตถุบิตโหมดและหมายเลขสเตจในเอาต์พุต)
รายการนั้น (ขององค์ประกอบที่ติดตาม) นั้นจะเริ่มต้นได้ด้วยเนื้อหาของการกระทำ
เมื่อคุณสลับสาขาเนื้อหาดัชนีจะถูกรีเซ็ตเป็นการกระทำที่อ้างอิงโดยสาขาที่คุณเพิ่งเปลี่ยนไป
Git 2.20 (Q4 2018) เพิ่มตาราง Offset Entry Index (IEOT) :
ดูกระทำ 77ff112 , กระทำ 3255089 , กระทำ abb4bb8 , กระทำ c780b9c , กระทำ 3b1d9e0 , กระทำ 371ed0d (10 ตุลาคม 2018) โดยเบนเพิร์ท (benpeart
)
ดูกระทำ 252d079 (26 กันยายน 2018) โดยNguyễnTháiNgọc Duy (pclouds
)
(ผสานโดยJunio C Hamano - gitster
- in e27bfaa , 19 Oct 2018)
ieot: เพิ่มส่วนขยายดัชนี Offset Table (IEOT) ของดัชนี
แพทช์นี้ช่วยให้สามารถจัดการกับต้นทุน CPU ในการโหลดดัชนีโดยการเพิ่มข้อมูลเพิ่มเติมไปยังดัชนีที่จะทำให้เราสามารถทำการโหลดและการแปลงรายการแคชได้อย่างมีประสิทธิภาพ
ทำได้โดยการเพิ่มส่วนขยายดัชนี (เป็นทางเลือก) ที่เป็นตารางออฟเซ็ตในบล็อกของรายการแคชในไฟล์ดัชนี
เพื่อให้การทำงานนี้สำหรับดัชนี V4 เมื่อเขียนรายการแคชมันจะ "รีเซ็ต" การบีบอัดคำนำหน้าเป็นระยะโดยการเข้ารหัสรายการปัจจุบันราวกับว่าชื่อเส้นทางสำหรับรายการก่อนหน้านั้นแตกต่างกันอย่างสมบูรณ์และบันทึกออฟเซ็ตของรายการนั้นใน IEOT .
โดยพื้นฐานด้วยดัชนี V4 จะสร้างออฟเซ็ตเป็นบล็อกของรายการที่ถูกบีบอัดคำนำหน้า
ด้วยการตั้งค่า index.threads config ใหม่การโหลดดัชนีจะเร็วขึ้น
อันเป็นผลมาจาก ( การใช้ IEOT ) กระทำ 7bd9631สะอาดขึ้นread-cache.c load_cache_entries_threaded()
ฟังก์ชั่นสำหรับ Git 2.23 (Q3 2019)
ดูกระทำ 8373037 , กระทำ d713e88 , กระทำ d92349d , กระทำ 113c29a , กระทำ c95fc72 , กระทำ 7a2a721 , กระทำ c016579 , กระทำ be27fb7 , กระทำ 13a1781 , กระทำ 7bd9631 , กระทำ 3c1dce8 , กระทำ cf7a901 , กระทำ d64db5b , กระทำ 76a7bc0 (9 พฤษภาคม 2019) โดยเจฟฟ์คิง (peff
)
(ผสานโดยJunio C Hamano - gitster
- in c0e78f7 , 13 Jun 2019)
read-cache: ปล่อยพารามิเตอร์ที่ไม่ได้ใช้จากโหลดเธรด
load_cache_entries_threaded()
ฟังก์ชั่นใช้src_offset
พารามิเตอร์ว่ามันไม่ได้ใช้ สิ่งนี้เกิดขึ้นตั้งแต่เริ่มต้นใน77ff112 ( read-cache
: รายการโหลดแคชบนเธรดผู้ปฏิบัติงาน, 2018-10-10, Git v2.20.0-rc0)
การขุดในรายการส่งเมลพารามิเตอร์นั้นเป็นส่วนหนึ่งของการวนซ้ำก่อนหน้าของซีรีย์แต่ไม่จำเป็นเมื่อรหัสสลับไปใช้ส่วนขยาย IEOT