Git memiliki pohon kosong yang terkenal, atau setidaknya terkenal, yang SHA1-nya adalah:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(Anda dapat melihat ini di repo mana pun, bahkan yang baru dibuat, dengan git cat-file -t
dan git cat-file -p
).
Jika Anda bekerja keras dan sangat berhati-hati, Anda dapat menggunakan pohon kosong ini untuk menyimpan direktori yang tidak memiliki file (lihat jawaban Bagaimana cara menambahkan direktori kosong ke repositori git ), meskipun itu bukan ide yang bagus.
Ini lebih berguna sebagai satu argumen git diff-tree
, yang mana dari salah satu contoh hook.
Yang saya ingin tahu adalah,
- seberapa andal hal ini — misalnya, apakah beberapa versi git mendatang tidak akan memiliki objek git yang diberi nomor
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Mengapa tidak ada nama simbolis untuk pohon kosong (atau apakah ada?).
(Cara cepat dan kotor untuk membuat nama simbolis adalah dengan memasukkan SHA1, misalnya .git/Nulltree
,. Sayangnya Anda harus melakukan ini untuk setiap repo. Tampaknya lebih baik hanya memasukkan angka ajaib dalam skrip, dll. Saya hanya enggan secara umum ke angka ajaib.)
git hash-object -t tree /dev/null
metode (dari jawaban VonC di bawah) memiliki keuntungan dari tidak hard-coding SHA-1, dalam kasus beberapa versi git beralih ke SHA-2 misalnya. (Saya tidak akan mencoba untuk memprediksi kapan itu mungkin terjadi. :-) Akan lebih mudah untuk mengganti Mercurial ke SHA-2, karena mereka meninggalkan ruang untuk itu.)Jawaban:
Utas ini menyebutkan:
Atau, seperti yang diusulkan Ciro Santilli di komentar :
Atau, seperti yang terlihat di sini , dari Colin Schimmelfing :
Jadi saya kira lebih aman untuk mendefinisikan variabel dengan hasil perintah itu sebagai pohon sha1 kosong Anda (daripada mengandalkan "nilai terkenal").
Catatan: Git 2.25.1 (Feb. 2020) mengusulkan dalam commit 9c8a294 :
Dan menambahkan:
Perhatikan, Anda akan melihat bahwa SHA1 muncul di beberapa repo GitHub saat penulis ingin komit pertamanya dikosongkan (lihat entri blog " Bagaimana saya menginisialisasi repositori Git saya "):
Akan memberimu:
(Lihat pohon SHA1?)
Anda bahkan dapat mendasarkan kembali riwayat yang ada di atas komit kosong itu (lihat " git: bagaimana cara memasukkan komit sebagai yang pertama, menggeser semua yang lain? ")
Dalam kedua kasus tersebut, Anda tidak bergantung pada nilai SHA1 yang tepat dari pohon kosong tersebut.
Anda cukup mengikuti praktik terbaik, menginisialisasi repo Anda dengan komit kosong pertama .
Untuk melakukannya:
Itu akan menghasilkan komit dengan SHA1 khusus untuk repo Anda, nama pengguna, email, tanggal pembuatan (artinya SHA1 dari komit itu sendiri akan berbeda setiap saat).
Tapi pohon yang direferensikan oleh komit itu adalah
4b825dc642cb6eb9a060e54bf8d69288fbee4904
, pohon kosong SHA1.Untuk memperlihatkan hanya pohon komit (tampilkan pohon komit SHA1):
Jika komit itu, merujuk pada pohon kosong, memang merupakan komit pertama Anda, Anda dapat menunjukkan SHA1 pohon kosong itu dengan:
(dan itu bahkan berfungsi di Windows, dengan perintah Gnu On Windows )
Seperti yang dikomentari di bawah ini , menggunakan
git diff <commit> HEAD
, ini akan menampilkan semua file Anda di cabang HEAD saat ini:Catatan: nilai pohon kosong secara resmi didefinisikan di
cache.h
.Sejak Git 2.16 (Q1 2018), ini digunakan dalam struktur yang tidak lagi terikat dengan (hanya) SHA1, seperti yang terlihat di commit eb0ccfd :
Lihat selengkapnya di " Mengapa Git tidak menggunakan SHA yang lebih modern? ": Ini adalah SHA-2 , sejak Git 2.19 (Q3 2018)
Dengan Git 2.25 (Q1 2020), pengujian sedang mempersiapkan transisi SHA-2 , dan melibatkan pohon kosong.
Lihat komit fa26d5e , komit cf02be8 , komit 38ee26b , komit 37ab8eb , komit 0370b35 , komit 0253e12 , komit 45e2ef2 , komit 79b0edc , komit 840624f , komit 32a6707 , komit 440bf91 , komit 0b408ca , komit 2eabd38 (28 Oktober 2019), dan komit 1bcef51 , komit ecde49b (05 Okt 2019) oleh brian m. carlson (
bk2204
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 28014c1, 10 Nov 2019)Jadi
t/oid-info/hash-info
sekarang termasuk:SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" adalah4b825dc642cb6eb9a060e54bf8d69288fbee4904
pohon kosong SHA1 " " baru.sumber
git diff-tree
dalam beberapa skrip yang saya tulis. Tidak ada jaminan bahwa ada komit kosong awal di repo. Jadi saya hanya ingin tahu apakah skrip ini mungkin akan rusak suatu hari nanti.-w
kegit hash-object
, itu akan membuat objek dalam repositori tempat menjalankannya, dan itu akan membuat ulang pohon kosong di repositori yang Anda hadapi seandainya itu akan hilang di masa depan./dev/null
:printf '' | git hash-object --stdin -t tree
:)Saya menulis entri blog dengan dua cara berbeda untuk menemukan hash: http://colinschimmelfing.com/blog/gits-empty-tree/
Jika ingin berubah karena suatu alasan, Anda dapat menggunakan dua cara di bawah ini untuk menemukannya. Namun, saya akan merasa cukup percaya diri menggunakan hash dalam alias .bashrc, dll., Dan menurut saya itu tidak akan berubah dalam waktu dekat. Setidaknya itu mungkin rilis utama dari git.
Kedua cara tersebut adalah:
git hash-object -t tree --stdin < /dev/null
git write-tree
di repo baru itu - hash akan dikeluarkan oleh git write-tree.sumber
–-stdin
memberi sayafatal: Cannot open '–-stdin': No such file or directory
git 2.7.2. Namun, menjalankannya tanpa--stdin
seperti dalam jawaban VonC memberikan nilai hashBerikut adalah jawaban tentang cara membuat komit pohon kosong bahkan dalam kasus ketika repositori belum kosong. https://stackoverflow.com/a/14623458/9361507
Tapi saya lebih suka "kosong" untuk diberi tag, tapi bukan cabang. Cara sederhananya adalah:
Karena tag bisa menunjuk ke tree-ish secara langsung, tanpa komit. Sekarang untuk mendapatkan semua file di pohon kerja:
Atau sama dengan stat:
Semua file sebagai diff:
Periksa spasi putih di semua file:
sumber
git rev-parse
akan memiliki flag atau kata kunci baru atau sesuatu di sepanjang baris tersebut, untuk menghasilkan (a) hash pohon kosong dan (b) hash komit null. Keduanya akan berguna dalam skrip dan akan melindungi dari perubahan SHA-256 yang diusulkan.