Cuốn sách Git chứa một bài viết về những gì một chỉ mục bao gồm :
Chỉ mục là một tệp nhị phân (thường được lưu giữ .git/index
) chứa danh sách tên đường dẫn được sắp xếp, mỗi tên có quyền và SHA1 của đối tượng blob; git ls-files
có thể cho bạn thấy nội dung của chỉ mục:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Các vấn đề Admin git cho một số chi tiết về cấu trúc:
Chỉ mục là một trong những cấu trúc dữ liệu quan trọng nhất trong git.
Nó đại diện cho trạng thái cây làm việc ảo bằng cách ghi lại danh sách các đường dẫn và tên đối tượng của chúng và đóng vai trò là khu vực tổ chức để viết ra đối tượng cây tiếp theo được cam kết.
Trạng thái là "ảo" theo nghĩa là nó không nhất thiết phải và thường không khớp với các tệp trong cây làm việc.
Để xem thêm, hãy xem " git / git / Tài liệu / kỹ thuật / index-format.txt ":
Tệp chỉ mục Git có định dạng sau
Tất cả các số nhị phân theo thứ tự byte mạng.
Phiên bản 2 được mô tả ở đây trừ khi có quy định khác.
- Một tiêu đề 12 byte bao gồm:
- Chữ ký 4 byte :
Chữ ký là {' D
', ' I
', ' R
', ' C
'} (viết tắt của " dircache
")
- Số phiên bản 4 byte :
Các phiên bản được hỗ trợ hiện tại là 2, 3 và 4.
- Số lượng mục nhập 32 bit.
- Một số mục chỉ mục được sắp xếp .
- Phần mở rộng :
Phần mở rộng được xác định bằng chữ ký.
Các tiện ích mở rộng tùy chọn có thể bị bỏ qua nếu Git không hiểu chúng.
Git hiện hỗ trợ cây được lưu trữ và giải quyết các phần mở rộng.
- Chữ ký mở rộng 4 byte. Nếu byte đầu tiên là '
A
' .. ' Z
' thì phần mở rộng là tùy chọn và có thể bỏ qua.
- Kích thước 32 bit của phần mở rộng
- Dữ liệu mở rộng
- SHA-1 160 bit so với nội dung của tệp chỉ mục trước tổng kiểm tra này.
ý kiến mljrg :
Nếu chỉ mục là nơi chuẩn bị cam kết tiếp theo, tại sao " git ls-files -s
" không trả lại gì sau khi cam kết?
Bởi vì chỉ mục đại diện cho những gì đang được theo dõi và ngay sau một cam kết, những gì đang được theo dõi giống hệt với cam kết cuối cùng ( git diff --cached
không trả về gì).
Vì vậy, git ls-files -s
liệt kê tất cả các tệp được theo dõi (tên đối tượng, bit chế độ và số giai đoạn trong đầu ra).
Danh sách đó (của phần tử được theo dõi) được khởi tạo với nội dung của một cam kết.
Khi bạn chuyển nhánh, nội dung chỉ mục được đặt lại thành cam kết được tham chiếu bởi nhánh bạn vừa chuyển sang.
Git 2.20 (Q4 2018) thêm Bảng bù cho mục nhập chỉ mục (IEOT) :
Xem cam kết 77ff112 , cam kết 3255089 , cam kết abb4bb8 , cam kết c780b9c , cam kết 3b1d9e0 , cam kết 371ed0d (ngày 10 tháng 10 năm 2018) của Ben Peart ( benpeart
) .
Xem cam kết 252d079 (ngày 26 tháng 9 năm 2018) của Nguyễn Thái Ngọc Duy ( pclouds
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết e27bfaa , ngày 19 tháng 10 năm 2018)
egot: thêm phần mở rộng Index Offset Table (IEOT)
Bản vá này cho phép giải quyết chi phí CPU khi tải chỉ mục bằng cách thêm dữ liệu bổ sung vào chỉ mục sẽ cho phép chúng tôi đa luồng hiệu quả việc tải và chuyển đổi các mục trong bộ đệm.
Nó thực hiện điều này bằng cách thêm một phần mở rộng chỉ mục (tùy chọn) là một bảng bù cho các khối mục nhập bộ đệm trong tệp chỉ mục.
Để làm việc này cho các chỉ mục V4, khi viết các mục trong bộ đệm, nó định kỳ "đặt lại" nén tiền tố bằng cách mã hóa mục nhập hiện tại như thể tên đường dẫn cho mục trước đó hoàn toàn khác nhau và lưu phần bù của mục đó trong IEOT .
Về cơ bản, với các chỉ mục V4, nó tạo ra các độ lệch thành các khối của các mục được nén tiền tố.
Với cài đặt cấu hình index.threads mới , việc tải chỉ mục giờ đây nhanh hơn.
Kết quả là ( sử dụng IEOT ), cam kết 7bd9631 dọn sạch read-cache.c load_cache_entries_threaded()
chức năng cho Git 2.23 (quý 3 năm 2019).
Xem cam 8373037 , cam kết d713e88 , cam kết d92349d , cam kết 113c29a , cam kết c95fc72 , cam kết 7a2a721 , cam kết c016579 , cam kết be27fb7 , cam kết 13a1781 , cam kết 7bd9631 , cam kết 3c1dce8 , cam kết cf7a901 , cam kết d64db5b , cam kết 76a7bc0 (ngày 09 tháng 5 năm 2019) bởi Jeff Vua ( peff
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết c0e78f7 , ngày 13 tháng 6 năm 2019)
read-cache: thả tham số không sử dụng khỏi tải luồng
Các load_cache_entries_threaded()
chức năng phải mất một src_offset
tham số mà nó không sử dụng. Điều này đã có từ khi nó ra đời vào năm 77ff112 ( read-cache
: tải các mục bộ đệm trong các luồng công nhân, 2018-10-10, Git v2.20.0-rc0).
Đi sâu vào danh sách gửi thư, tham số đó là một phần của lần lặp trước của chuỗi , nhưng trở nên không cần thiết khi mã chuyển sang sử dụng phần mở rộng IEOT.