Apa sebenarnya yang terkandung dalam indeks Git, dan perintah apa yang dapat saya gunakan untuk melihat konten indeks?
Memperbarui
Terima kasih atas semua jawaban Anda. Saya tahu bahwa indeks bertindak sebagai area pementasan, dan apa yang dilakukan adalah dalam indeks daripada pohon yang bekerja. Saya hanya ingin tahu tentang apa yang terdiri dari objek indeks. Saya kira itu mungkin daftar nama file / direktori, pasangan SHA-1, semacam pohon virtual mungkin?
Apakah ada, dalam terminologi Git, perintah plumbing yang dapat saya gunakan untuk membuat daftar isi indeks?
Jawaban:
Buku Git berisi artikel tentang apa yang termasuk dalam indeks :
Masalah Racy git memberikan beberapa detail pada struktur itu:
Untuk melihat lebih banyak, lih. " git / git / Dokumentasi / teknis / index-format.txt ":
File indeks Git memiliki format berikut
komentar mljrg :
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)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)sumber
Analisis sedikit demi sedikit
Saya telah memutuskan untuk melakukan sedikit pengujian untuk lebih memahami format dan meneliti beberapa bidang secara lebih rinci.
Hasil di bawah adalah sama untuk versi Git
1.8.5.2
dan2.3
.Saya telah menandai poin yang saya tidak yakin / belum menemukan
TODO
: silakan melengkapi poin-poin itu.Seperti yang disebutkan lain, indeks disimpan di bawah
.git/index
, bukan sebagai objek pohon standar, dan formatnya adalah biner dan didokumentasikan di: https://github.com/git/git/blob/master/Documentation/technical/index-format. txtStruct utama yang menentukan indeks adalah pada cache.h , karena indeks adalah cache untuk membuat commit.
Mempersiapkan
Ketika kami memulai repositori pengujian dengan:
The
.git
direktori terlihat seperti:Dan jika kita mendapatkan konten dari satu-satunya objek:
Kami mendapatkan
a
. Ini menunjukkan bahwa:index
poin untuk isi file, karenagit add b
menciptakan objek gumpalananalisis hd
Sekarang mari kita lihat indeks itu sendiri:
Memberi:
Selanjutnya kita akan menyimpulkan:
Pertama adalah header, didefinisikan di: struct cache_header :
44 49 52 43
:DIRC
. TODO: mengapa ini perlu?00 00 00 02
: versi format: 2. Format indeks telah berkembang seiring waktu. Saat ini terdapat versi hingga 4. Format indeks seharusnya tidak menjadi masalah ketika berkolaborasi antara komputer yang berbeda di GitHub karena repositori telanjang tidak menyimpan indeks: itu dihasilkan pada waktu klon.00 00 00 01
: jumlah file pada indeks: hanya satub
,.Selanjutnya mulai daftar entri indeks, ditentukan oleh struct cache_entry Di sini kita hanya punya satu. Itu mengandung:
sekelompok metadata file: 8 byte
ctime
, 8 bytemtime
, lalu 4 byte: perangkat, inode, mode, UID dan GID.Perhatikan caranya:
ctime
danmtime
sama (54 09 76 e6 1d 81 6f c6
) seperti yang diharapkan karena kami belum mengubah fileByte pertama adalah detik sejak EPOCH dalam hex:
Memberi:
Saat itulah saya membuat contoh ini.
4 byte kedua adalah nanodetik.
UID dan GID adalah
00 00 03 e8
, 1000 in hex: nilai umum untuk pengaturan pengguna tunggal.Semua metadata ini, yang sebagian besar tidak ada dalam objek pohon, memungkinkan Git untuk memeriksa apakah file telah berubah dengan cepat tanpa membandingkan seluruh konten.
di awal baris
30
::00 00 00 02
ukuran file: 2 byte (a
dan\n
dariecho
)78 98 19 22 ... c1 99 4e 85
: 20 byte SHA-1 di atas konten entri sebelumnya. Perhatikan bahwa menurut percobaan saya dengan flag valid , flag yang mengikutinya tidak dipertimbangkan dalam SHA-1 ini.Bendera 2 byte:
00 01
1 bit: anggap bendera yang valid. Investigasi saya menunjukkan bahwa flag dengan nama buruk ini adalah tempat
git update-index --assume-unchanged
penyimpanan negaranya: https://stackoverflow.com/a/28657085/895245Bendera diperpanjang 1 bit. Menentukan apakah bendera diperpanjang hadir atau tidak. Harus
0
pada versi 2 yang tidak memiliki bendera yang diperluas.Bendera panggung 2 bit digunakan selama penggabungan. Tahapan didokumentasikan dalam
man git-merge
:0
: file biasa, bukan dalam konflik gabungan1
: base2
: milik kita3
: milik merekaSelama konflik penggabungan, semua tahapan dari 1-3 disimpan dalam indeks untuk memungkinkan operasi seperti
git checkout --ours
.Jika Anda
git add
, maka tahap 0 ditambahkan ke indeks untuk path, dan Git akan tahu bahwa konflik telah ditandai sebagai diselesaikan. TODO: periksa ini.Panjang jalur 12 bit yang akan mengikuti
0 01
:: 1 byte hanya sejak jalur itub
Bendera diperpanjang 2 byte. Hanya bermakna jika "bendera diperpanjang" ditetapkan pada bendera dasar. MELAKUKAN.
62
(ASCIIb
): jalur panjang variabel. Panjang ditentukan dalam flag sebelumnya, di sini hanya 1 byteb
,.Kemudian muncul sebuah
00
: 1-8 byte dari nol padding sehingga path akan diakhiri nol dan indeks akan berakhir dalam kelipatan 8 byte. Ini hanya terjadi sebelum indeks versi 4.Tidak ada ekstensi yang digunakan. Git tahu ini karena tidak akan ada cukup ruang di file untuk checksum.
Akhirnya ada checksum 20 byte
ee 33 c0 3a .. 09 ab 49 94
atas isi indeks.sumber
git add
, per AndaTODO
: Anda benar. Jika Anda memiliki entri indeks tahap tinggi (konflik) di jalur yang diberikan, saat Andagit add
jalur itu, semua entri indeks tahap tinggi akan dihapus dan salinan direktori kerja akan ditambahkan pada tahap0
. (Menyelesaikan konflik).Indeks Git adalah area pementasan antara direktori kerja Anda dan repositori Anda. Anda dapat menggunakan indeks untuk membangun satu set perubahan yang ingin Anda lakukan bersama. Saat Anda membuat komit, apa yang dikomit adalah apa yang saat ini ada di indeks ini, bukan apa yang ada di direktori kerja Anda.
Untuk melihat apa yang ada di dalam indeks, berikan perintah:
Ketika Anda menjalankan status git, Anda dapat melihat file mana yang dipentaskan (saat ini dalam indeks Anda), yang dimodifikasi tetapi belum dipentaskan, dan mana yang sepenuhnya tidak terlacak.
Anda bisa membaca ini . Pencarian Google memunculkan banyak tautan, yang seharusnya cukup mandiri.
sumber
git status
tidak mencantumkan semua file dari indeks. Hanya daftar file-file yang berbeda antara indeks dan direktori kerja. Untuk melihat semua file dalam indeks, Anda perlu menggunakangit ls-files
.git status
memang daftar file indeks, terlepas dari apakah mereka berbeda antara indeks dan workdir.git status
daftar file yang ada dalam indeks, ya, tetapi tidak mencantumkan semua file dalam indeks. Menjelaskan bagaimanagit status
sebenarnya bekerja akan menjadi jawaban yang bermanfaat untuk beberapa pertanyaan, meskipun mungkin bukan yang ini.git status
menunjukkan status pohon kerja (perbedaan antara pohon kerja dan indeks). Sebenarnya tidak menunjukkan indeks. git-scm.com/docs/git-statusInilah yang sebenarnya Anda butuhkan, gunakan perintah ini.
$ binwalk index
sumber
Git index adalah file biner (umumnya disimpan
.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. Harap perhatikan bahwa kata-kataindex
,,stage
dancache
hal yang sama di Git: digunakan secara bergantian.Indeks Git, atau Git cache, memiliki 3 properti penting:
Sumber :
sumber