Buku Git berisi artikel tentang apa yang termasuk dalam indeks :
Indeks adalah file biner (umumnya disimpan di .git/index
) yang berisi daftar nama path yang diurutkan, masing-masing dengan izin dan SHA1 dari objek blob; git ls-files
dapat menunjukkan kepada Anda isi indeks:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Masalah Racy git memberikan beberapa detail pada struktur itu:
Indeks adalah salah satu struktur data terpenting dalam git.
Ini mewakili keadaan pohon kerja virtual dengan merekam daftar jalur dan nama objek mereka dan berfungsi sebagai area pementasan untuk menulis objek pohon berikutnya yang akan dikomit.
Statusnya "virtual" dalam arti tidak harus, dan seringkali tidak, cocok dengan file di pohon kerja.
Untuk melihat lebih banyak, lih. " git / git / Dokumentasi / teknis / index-format.txt ":
File indeks Git memiliki format berikut
Semua nomor biner berada dalam urutan byte jaringan.
Versi 2 dijelaskan di sini kecuali dinyatakan sebaliknya.
- Header 12 byte yang terdiri dari:
- Tanda tangan 4-byte :
Tanda tangan adalah {' D
', ' I
', ' R
', ' C
'} (singkatan " dircache
")
- Nomor versi 4-byte :
Versi yang didukung saat ini adalah 2, 3 dan 4.
- Jumlah entri indeks 32-bit.
- Sejumlah entri indeks diurutkan .
- Ekstensi :
Ekstensi diidentifikasi dengan tanda tangan.
Ekstensi opsional dapat diabaikan jika Git tidak memahaminya.
Git saat ini mendukung pohon cache dan menyelesaikan undo ekstensi.
- Tanda tangan ekstensi 4-byte. Jika byte pertama adalah '
A
' .. ' Z
' ekstensi bersifat opsional dan dapat diabaikan.
- Ukuran ekstensi 32-bit
- Data ekstensi
- 160-bit SHA-1 atas isi file indeks sebelum checksum ini.
komentar mljrg :
Jika indeks adalah tempat komit selanjutnya disiapkan, mengapa " git ls-files -s
" tidak mengembalikan apa pun setelah komit?
Karena indeks mewakili apa yang dilacak , dan tepat setelah komit, apa yang dilacak identik dengan komit terakhir ( git diff --cached
tidak menghasilkan apa-apa).
Jadi git ls-files -s
daftar semua file yang dilacak (nama objek, bit mode dan nomor tahap dalam output).
Daftar tersebut (elemen yang dilacak) diinisialisasi dengan konten komit.
Saat Anda beralih cabang, konten indeks diatur ulang ke komit yang direferensikan oleh cabang yang baru saja Anda alihkan.
Git 2.20 (Q4 2018) menambahkan Tabel Offset Entri Indeks (IEOT) :
Lihat komit 77ff112 , komit 3255089 , komit abb4bb8 , komit c780b9c , komit 3b1d9e0 , komit 371ed0d (10 Okt 2018) oleh Ben Peart ( benpeart
) .
Lihat komit 252d079 (26 Sep 2018) oleh Nguyễn Thái Ngọc Duy ( pclouds
) .
(Digabung oleh Junio C Hamano - gitster
- di commit e27bfaa , 19 Okt 2018)
ieot: tambahkan ekstensi Index Entry Offset Table (IEOT)
Tambalan ini memungkinkan mengatasi biaya CPU dari memuat indeks dengan menambahkan data tambahan ke indeks yang akan memungkinkan kami untuk secara multi-thread memuat dan mengkonversi entri cache.
Ini menyelesaikan ini dengan menambahkan ekstensi indeks (opsional) yang merupakan tabel offset ke blok entri cache dalam file indeks.
Untuk membuat ini bekerja untuk indeks V4, ketika menulis entri cache, secara berkala "me-reset" kompresi awalan dengan menyandikan entri saat ini seolah-olah nama jalur untuk entri sebelumnya benar-benar berbeda dan menyimpan offset entri itu di IEOT .
Pada dasarnya, dengan indeks V4, itu menghasilkan offset menjadi blok entri awalan-terkompresi.
Dengan pengaturan konfigurasi index.threads baru , pemuatan indeks sekarang lebih cepat.
Sebagai hasilnya ( menggunakan IEOT ), komit 7bd9631 membersihkan read-cache.c load_cache_entries_threaded()
fungsi untuk Git 2.23 (Q3 2019).
Lihat komit 8373037 , komit d713e88 , komit d92349d , komit 113c29a , komit c95fc72 , komit 7a2a721 , komit c016579 , komit be27fb7 , komit 13a1781 , komit 7bd9631 , komit 3c1dce8 , komit cf7a901 , komit d64db5b , komit 76a7bc0 (9 Mei 2019) oleh Jeff Raja ( peff
) .
(Digabung oleh Junio C Hamano - gitster
- di commit c0e78f7 , 13 Jun 2019)
read-cache: jatuhkan parameter yang tidak digunakan dari beban berulir
The load_cache_entries_threaded()
fungsi mengambil src_offset
parameter yang tidak menggunakan. Ini telah ada sejak awal di 77ff112 ( read-cache
: memuat entri cache pada utas pekerja, 2018-10-10, Git v2.20.0-rc0).
Menggali di milis, parameter itu adalah bagian dari iterasi seri sebelumnya , tetapi menjadi tidak perlu ketika kode beralih menggunakan ekstensi IEOT.