Jika Anda akan membangun, katakanlah, struktur direktori tempat direktori diberi nama untuk komit di repositori Git, dan Anda ingin itu cukup pendek untuk membuat mata Anda tidak berdarah, tetapi cukup lama sehingga kemungkinan bertabrakan. akan diabaikan, berapa banyak substring SHA umumnya diperlukan?
Katakanlah saya ingin secara unik mengidentifikasi perubahan ini: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Saya dapat menggunakan sesedikit empat karakter pertama: https://github.com/wycats/handlebars.js/commit/e629
Tapi saya merasa itu akan berisiko. Tetapi dengan menggunakan basis kode yang, selama beberapa tahun, mungkin memiliki — katakanlah — 30 ribu perubahan, apa peluang tabrakan jika saya menggunakan 8 karakter? 12? Apakah ada nomor yang secara umum dianggap dapat diterima untuk hal semacam ini?
Jawaban:
Pertanyaan ini sebenarnya dijawab dalam Bab 7 buku Pro Git :
7 digit adalah standar Git untuk SHA pendek, jadi itu bagus untuk sebagian besar proyek. Tim Kernel telah meningkat beberapa kali, seperti yang disebutkan, karena mereka memiliki beberapa ratus ribu komitmen. Jadi untuk komit ~ 30k Anda, 8 atau 10 digit harus baik-baik saja.
sumber
git
ini cukup pintar dalam hal ini. Anda dapat mengatur singkatan, katakan menjadi 4, dangit
akan menggunakan 4 digit untuk hash sebanyak mungkin, tetapi beralih ke 5 atau lebih ketika tahu bahwa singkatan itu tidak unik ...Catatan: Anda dapat meminta
git rev-parse --short
SHA1 yang terpendek namun unik.Lihat " git dapatkan hash pendek dari hash biasa "
Untuk repo besar, 7 tidak cukup sejak 2010, dan melakukan dce9648 oleh Linus Torvalds sendiri (git 1.7.4.4, Okt 2010):
(BK = BitKeeper)
environment.c
:Catatan: Seperti yang dikomentari di bawah ini oleh marco.m ,
core.abbrevLength
diganti namanya dicore.abbrev
Git 1.7.4.4 yang sama di commit a71f09fBaru-baru ini, Linus ditambahkan dalam melakukan e6c587c (untuk Git 2.11, Q4 2016):
(seperti yang disebutkan di Matthieu Moy 's jawaban )
Lihat komit e6c587c (01 Okt 2016) oleh Linus Torvalds (
torvalds
) .Lihat komit 7b5b772 , komit 65acfea (01 Okt 2016) oleh Junio C Hamano (
gitster
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit bb188d0 , 03 Okt 2016)Properti baru itu (menebak default yang masuk akal untuk nilai singkatan SHA1) memiliki efek langsung pada bagaimana Git menghitung nomor versinya sendiri untuk rilis .
sumber
core.abbrevLength
telah diubah namanya menjadicore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
untuk menghasilkan 10 karakter. Kami menggunakangit log -1 --format=%h
, tapi itu hanya menghasilkan 7 karakter dan kami mendapat tabrakan.Ini dikenal sebagai masalah ulang tahun.
Untuk probabilitas kurang dari 1/2 probabilitas tabrakan dapat diperkirakan sebagai
p ~ = (n 2 ) / (2 m)
Di mana n adalah jumlah item dan m adalah jumlah kemungkinan untuk setiap item.
Jumlah kemungkinan untuk string hex adalah 16 c mana c adalah jumlah karakter.
Jadi untuk 8 karakter dan 30K komit
30K ~ = 2 15
p ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛
Menambahnya menjadi 12 karakter
p ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19
sumber
Pertanyaan ini telah dijawab, tetapi bagi siapa pun yang mencari matematika di belakang - ini disebut masalah Ulang Tahun ( Wikipedia )
Ini adalah tentang kemungkinan memiliki 2 (atau lebih) orang dari kelompok N orang untuk berulang tahun pada hari yang sama dalam setahun. Yang analog dengan kemungkinan 2 (atau lebih) git dikomit dari repositori yang memiliki N komit secara total memiliki awalan hash yang sama dengan panjang X.
Lihatlah tabel Probabilitas . Sebagai contoh untuk hash hex string dengan panjang 8, probabilitas tabrakan mencapai 1% ketika repositori hanya memiliki sekitar 9300 item (git melakukan). Untuk 110.000 komit, probabilitasnya adalah 75%. Tetapi jika Anda memiliki hash hex string dengan panjang 12 probabilitas tabrakan dalam 100.000 komit di bawah 0,1%.
sumber
Git versi 2.11 (atau mungkin 2.12?) Akan berisi fitur yang menyesuaikan jumlah karakter yang digunakan dalam pengidentifikasi pendek (misalnya
git log --oneline
) dengan ukuran proyek. Setelah Anda menggunakan versi Git seperti itu, jawaban untuk pertanyaan Anda bisa "pilih berapa pun yang diberikan Git kepada Andagit log --oneline
, cukup aman".Untuk detail lebih lanjut, lihat Mengubah default untuk "core.abbrev"? diskusi di Git Rev News edisi 20 dan melakukan bb188d00f7 .
sumber