Ile git sha jest * ogólnie * uważane za niezbędne do jednoznacznej identyfikacji zmiany w danym kodzie?

Jeśli chcesz zbudować strukturę katalogów, w której katalog jest nazwany dla commita w repozytorium Git, i chcesz, aby był wystarczająco krótki, aby twoje oczy nie krwawiły, ale wystarczająco długi, aby szansa na jego kolizję była znikoma, ile fragmentu łańcucha SHA jest ogólnie wymagane?

Powiedzmy, że chcę jednoznacznie zidentyfikować tę zmianę: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920

Mogę używać jako niewiele jak pierwsze cztery postacie: https://github.com/wycats/handlebars.js/commit/e629

Ale czuję, że to byłoby ryzykowne. Ale ssąc kod, który w ciągu kilku lat może mieć-powiedzmy-30K zmian, jakie są szanse kolizji, jeśli użyję 8 znaków? 12? Czy istnieje liczba, która jest ogólnie uznawana za akceptowalną dla tego typu rzeczy?

 146
Author: Jun-Dai Bates-Kobashigawa, 2013-08-08

5 answers

Odpowiedź na to pytanie znajduje się w rozdziale 7 Księgi Pro Git:

Ogólnie, osiem do dziesięciu znaków jest więcej niż wystarczająco, aby być unikalnym w ramach projektu. Jeden z największych projektów Gita, jądro Linuksa, zaczyna potrzebować 12 znaków z możliwych 40, aby zostać wyjątkowe.

7 cyfr jest domyślną wartością Git dla krótkiego SHA, więc jest to dobre dla większości projektów. Zespół Kernel zwiększył swoje kilka razy, jak wspomniano, ponieważ mieć kilkaset tysięcy zobowiązań. Więc dla Twoich ~ 30K commitów, 8 lub 10 cyfr powinno być idealnie w porządku.

 179
Author: Nevik Rehnel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 10:36:32

Uwaga: możesz zapytać git rev-parse --short dla najkrótszego, a zarazem wyjątkowego SHA1.
Zobacz "git get short hash from regular hash "

git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110

Jak widać w moim przykładzie SHA1 ma długość 5, nawet jeśli podałem długość 4.


W przypadku dużych transakcji, 7 to za mało od 2010 roku i commit dce9648 przez samego Linusa Torvaldsa (git 1.7.4.4, październik 2010):

Domyślna wartość 7 pochodzi z dość wczesnego rozwoju Gita, gdy siedem cyfr szesnastkowych było dużo (obejmuje około 250 + milionów wartości skrótu).
Wtedy myślałem, że 65K rewizji to dużo (to było to, co mieliśmy trafić w BK), a każda rewizja ma tendencję do około 5-10 nowych obiektów lub tak, więc milion obiektów to duża liczba.

(BK = BitKeeper)

W dzisiejszych czasach, jądro nie jest nawet największym projektem gita, a nawet jądro ma około 220K wersji (dużo większe niż drzewo BK kiedykolwiek było) i my zbliżają się do dwóch milionów obiektów.
W tym momencie siedem cyfr szesnastkowych jest nadal unikalne dla wielu z nich, ale gdy mówimy o zaledwie dwóch rzędach wielkości różnicy między liczbą obiektów a rozmiarem skrótu, nie będzie kolizje w obciętych wartościach skrótu.
Nie jest już nawet blisko nierealne - zdarza się to cały czas.

Powinniśmy zarówno zwiększyć domyślny skrót, który był nierealistycznie mały, i dodać sposób na osób do Ustawienia własnego domyślnego projektu w pliku konfiguracyjnym git .

core.abbrev

Ustaw długość nazw obiektów są skracane do.
Jeśli jest nieokreślone, wiele poleceń skraca się do 7 hexdigitów, co może nie wystarczyć, aby skrócone nazwy obiektów pozostały unikalne przez wystarczająco długi czas.

environment.c:

int minimum_abbrev = 4, default_abbrev = 7;

Uwaga: jak skomentował poniżej przez marco.na, core.abbrevLenght została zmieniona w core.abbrev w tym samym Git 1.7.4.4 w commit a71f09f

Zmień nazwę core.abbrevlength z powrotem na core.abbrev

Odpowiada jednak opcji linii poleceń --abbrev=$n.


Linus napisał (a): [[14]}commit e6c587c (dla Git 2.11, Q4 2016):
(jak wspomniano w Matthieu Moy ' Sodpowiedz)

Dość wcześnie postanowiliśmy skrócić nazwy obiektów do 7-hexdigits, ale wraz z rozwojem projektów staje się to coraz bardziej prawdopodobne aby zobaczyć takie krótkie nazwy obiektów wykonane we wcześniejszych dniach i zapisane w wiadomościach dziennika nie są już unikalne.

Obecnie projekt jądra Linuksa potrzebuje 11 do 12 hexdigitów, podczas gdy sam Git potrzebuje 10 hexdigitów, aby jednoznacznie zidentyfikować obiekty, które mają, podczas gdy wiele mniejszych projektów może nadal być w porządku z oryginalnym domyślnym 7-hexdigit. Jeden rozmiar nie pasuje do wszystkich projektów.

Wprowadzić mechanizm, w którym szacujemy liczbę obiektów w repozytorium po pierwszym Prośba o skrócenie nazwy obiektu z domyślnym ustawieniem i wymyślenie domyślnej wartości dla repozytorium. Bazując na oczekiwaniu, że w repozytorium dojdzie do kolizji z obiektami 2^(2N) przy użyciu nazw obiektów skróconych do pierwszych n bitów, użyj wystarczającej liczby hexdigitów, aby pokryć liczbę obiektów w repozytorium.
Każdy hexdigit (4-bitowy), który dodamy do skróconej nazwy pozwala nam mieć cztery razy (2-bitowe) więcej obiektów w repozytorium.

Zobacz commit e6c587c (01 Oct 2016) by Linus Torvalds (torvalds).
Zobacz commit 7b5b772, commit 65acfea (01 Oct 2016) by Junio C Hamano (gitster).
(dodane przez Junio C Hamano -- gitster -- in commit bb188d0, 03 Oct 2016)

Ta nowa właściwość (domyślna domyślna wartość skrótu SHA1) ma bezpośredni wpływ na to, jak Git oblicza swój własny numer wersji dla release .

 105
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:37

Jest to znany jako problem urodzinowy.

Dla prawdopodobieństw mniejszych niż 1/2 prawdopodobieństwo zderzenia może być przybliżone jako

P ~ = (n2)/(2m)

Gdzie n jest liczbą elementów, A m jest liczbą możliwości dla każdego elementu.

Liczba możliwości dla ciągu szesnastkowego wynosi 16 c gdzie c jest liczbą znaków.

Więc dla 8 znaków i 30K commitów

30K ~= 215

P ~ = (n2)/(2m) ~= ((215)2)/(2*168) = 230/233 = ⅛

Zwiększenie do 12 znaków

P ~ = (n2)/(2m) ~= ((215)2)/(2*1612) = 230/249 = 2-19

 19
Author: plugwash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 16:27:29

Na to pytanie odpowiedziano, ale dla każdego, kto szuka matematyki za-to się nazywa Problem urodzinowy (Wikipedia).

Chodzi o prawdopodobieństwo, że 2 (lub więcej) osób z grupy N będzie miało urodziny tego samego dnia w roku. Co jest analogiczne do 2 (lub więcej) zatwierdzeń git z repozytorium, które łącznie ma N zatwierdzeń o tym samym przedrostku skrótu o długości X.

Spójrz na tabelę prawdopodobieństwa . Na przykład dla hash łańcuch szesnastkowy o długości 8 prawdopodobieństwo kolizji osiąga 1%, gdy repozytorium ma około 9300 pozycji (commity git). Dla 110 000 zobowiązań prawdopodobieństwo wynosi 75%. Ale jeśli masz łańcuch hex o długości 12, prawdopodobieństwo kolizji w 100 000 commitów jest poniżej 0.1%.

 10
Author: Messa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 12:01:27

Git Wersja 2.11 (a może 2.12?) będzie zawierać 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, odpowiedź na twoje pytanie może brzmieć: "wybierz dowolną długość, jaką daje Ci git z git log --oneline, jest wystarczająco bezpieczna".

Aby uzyskać więcej szczegółów, zobacz zmiana domyślnej wartości dla " core.Skrót"? dyskusja w Git Rev News edition 20 I commit bb188d00f7 .

 1
Author: Matthieu Moy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 14:06:57