Jeśli zamierzasz zbudować, powiedzmy, strukturę katalogów, w której katalog jest nazwany dla zatwierdzenia w repozytorium Git, i chcesz, aby był on wystarczająco krótki, aby twoje oczy nie krwawiły, ale wystarczająco długie, aby szansa na kolizję byłoby nieistotne, jaka część podciągów SHA jest na ogół wymagana?
Powiedzmy, że chcę jednoznacznie zidentyfikować tę zmianę: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Mogę użyć zaledwie pierwszych czterech znaków: https://github.com/wycats/handlebars.js/commit/e629
Ale czuję, że byłoby to ryzykowne. Ale biorąc pod uwagę bazę kodu, która przez kilka lat może mieć - powiedzmy - 30k zmian, jakie są szanse na kolizję, jeśli użyję 8 znaków? 12? Czy istnieje liczba, która jest ogólnie uważana za akceptowalną dla tego rodzaju rzeczy?
Odpowiedzi:
Odpowiedź na to pytanie znajduje się w rozdziale 7 książki Pro Git :
7 cyfr jest domyślną wartością Gita dla krótkiej SHA, więc jest to w porządku dla większości projektów. Zespół Kernela kilkakrotnie zwiększył swój, jak wspomniano, ponieważ ma kilkaset tysięcy zobowiązań. Tak więc dla twoich ~ 30 000 zatwierdzeń 8 lub 10 cyfr powinno być idealnie w porządku.
źródło
git
jest dość mądry, jeśli chodzi o to. Możesz ustawić skrót na krótki, powiedzmy na 4, igit
użyje 4 cyfr dla tylu skrótów, ile może, ale przełącz się na 5 lub więcej, gdy wie, że skrót nie jest unikalny ...Uwaga: możesz poprosić
git rev-parse --short
o najkrótszy i jednocześnie unikalny SHA1.Zobacz „ git dostaje krótki skrót od zwykłego skrótu ”
W przypadku dużych transakcji repo 7 nie wystarczy od 2010 r., A sam dce9648 sam Linus Torvalds (git 1.7.4.4, paź 2010):
(BK = BitKeeper)
environment.c
:Uwaga: Jak skomentował poniżej przez marco.m ,
core.abbrevLength
został przemianowany nacore.abbrev
w tym samym Git 1.7.4.4 w popełnić a71f09fNiedawno, Linus dodane popełnić e6c587c (dla Git 2.11, Q4 2016)
(jak wspomniano w Matthieu Moy „s odpowiedzi )
Zobacz commit e6c587c (01 października 2016) autorstwa Linusa Torvaldsa (
torvalds
) .Zobacz commit 7b5b772 , commit 65acfea (01 października 2016) autor: Junio C Hamano (
gitster
) .(Połączone przez Junio C Hamano -
gitster
- w commit bb188d0 , 03 października 2016)Ta nowa właściwość (odgadnięcie rozsądnej wartości domyślnej wartości skrótu SHA1) ma bezpośredni wpływ na sposób, w jaki Git oblicza własny numer wersji do wydania .
źródło
core.abbrevLength
której nazwa została zmieniona nacore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
aby wygenerować 10 znaków. Wcześniej korzystaliśmygit log -1 --format=%h
, ale wygenerowało to tylko 7 znaków i doszło do kolizji.Jest to znane jako problem urodzinowy.
Dla prawdopodobieństw mniejszych niż 1/2 prawdopodobieństwo zderzenia można oszacować jako
p ~ = (n 2 ) / (2m)
Gdzie n jest liczbą elementów, a m jest liczbą możliwości dla każdej pozycji.
Liczba możliwości łańcucha szesnastkowego wynosi 16 c, gdzie c jest liczbą znaków.
Tak więc dla 8 znaków i 30 000 zatwierdzeń
30 K ~ = 2 15
P ~ = (n = 2 ) / (2M) ~ = ((2 15 ) 2 ) / (2 * 16 : 8 ) = 2 30 /2 33 = ⅛
Zwiększenie go do 12 znaków
P ~ = (n = 2 ) / (2M) ~ = ((2 15 ) 2 ) / (2 * 16 : 12 ) = 2 30 /2 49 = 2 -19
źródło
Odpowiedź na to pytanie, ale dla każdego, kto szuka matematyki za nią - nazywa się to Problemem urodzin ( Wikipedia ).
Chodzi o prawdopodobieństwo, że 2 (lub więcej) osób z grupy N osób będzie miało urodziny tego samego dnia w roku. Który jest analogiczny do prawdopodobnie 2 (lub więcej) zatwierdzeń git z repozytorium posiadających łącznie N zatwierdzeń o tym samym prefiksie skrótu o długości X.
Spójrz na tabelę prawdopodobieństwa . Na przykład dla haszującego ciągu szesnastkowego o długości 8 prawdopodobieństwo wystąpienia kolizji osiąga 1%, gdy repozytorium zawiera tylko około 9300 elementów (git commits). Dla 110 000 zatwierdzeń prawdopodobieństwo wynosi 75%. Ale jeśli masz hash hex hex o długości 12, prawdopodobieństwo kolizji w 100 000 commits wynosi poniżej 0,1%.
źródło
Wersja Git 2.11 (a może 2.12?) Będzie zawierała funkcję, która dostosowuje liczbę znaków używanych w krótkich identyfikatorach (np.
git log --oneline
) Do wielkości projektu. Gdy użyjesz takiej wersji Git, odpowiedzią na twoje pytanie może być „wybierzgit log --oneline
, jaką długość daje Git , jest to wystarczająco bezpieczne”.Aby uzyskać więcej informacji, zobacz Zmienianie wartości domyślnej dla „core.abbrev”? dyskusja w Git Rev News wydanie 20 i zatwierdzenie bb188d00f7 .
źródło