2015-09-04 19 views
7

Flaga --abbrev-commit może być używana w połączeniu z git log i git rev-list w celu pokazania częściowych prefiksów zamiast pełnych 40-znakowych skrótów SHA-1 obiektów commit. Według Pro Git book,W moim repo, jak długo musi być najdłuższy prefiks hash, aby zapobiec nakładaniu się?

domyślnie do korzystania z siedmiu znaków, ale czyni je dłużej, jeśli to konieczne, aby utrzymać jednoznaczną SHA-1 [...]

Dodatkowo krótkie Shas są co najmniej 4- postać długa. Mimo to zgodnie z książką Pro Git,

Ogólnie, osiem do dziesięciu znaków jest więcej niż wystarczające, aby zachować unikatowość w projekcie.

Przykładowo, jądro Linux, które jest dość dużym projektem z ponad 450 tys. Zatwierdzeniami i 3,6 milionami obiektów, nie ma dwóch obiektów, których SHA-1 nakładają się więcej niż pierwsze 11 znaków.

Ponieważ długość najdłuższego prefiksu wymaganego w celu uniknięcia nakładania się wśród wszystkich skrótów prefiks popełniają obiektów (11, w przypadku Linuksa) jest surowy wskaźnik wielkości repo jest, chciałbym programowo określić odpowiednią ilość w moim lokalnym repozytorium. Jak mogę to zrobić?

+0

Czy masz na myśli http://stackoverflow.com/a/21015031/3691891? –

+0

@ArkadiuszDrabczyk Niezupełnie. Twój link daje tylko metodę określenia, jak krótki może być prefiks danego skrótu zatwierdzenia, aby uniknąć nakładania się z innymi hashami. Pytam o maksymalną ilość dla wszystkich skrótów zatwierdzających w repozytorium. – Jubobs

+1

Nie można * rygorystycznie * określać wymaganej długości prefiksu bez sprawdzania wszystkich zatwierdzeń w repozytorium. Zasadniczo repozytorium może mieć tylko dwa zatwierdzenia, które są identyczne w pierwszych 39 znakach. Rzeczywista wymagana długość może się zmienić wraz z następnym zatwierdzeniem. –

Odpowiedz

14

Poniższy skrypt powłoki po uruchomieniu w lokalnym reporze wypisuje długość najdłuższego prefiksu wymaganego, aby zapobiec nakładaniu się wszystkich prefiksów skrótów obiektów commit tego repozytorium.

MAX_LENGTH=4; 

git rev-list --abbrev=4 --abbrev-commit --all | \ 
    (while read -r line; do 
     if [ ${#line} -gt $MAX_LENGTH ]; then 
     MAX_LENGTH=${#line}; 
     fi 
    done && printf %s\\n "$MAX_LENGTH" 
) 

Ostatni raz edytowany tę odpowiedź, skrypt drukowane

6

Scenariusz Juboba jest świetny, wznowiony.

Jeśli chcesz zorientować się dystrybucją minimalnego-commit-hash długości, można uruchomić ten jeden-liner:

git rev-list --abbrev=4 --abbrev-commit --all | (while read -r line; do echo ${#line}; done;) | sort -n | uniq -c 

dla samego git project dzisiaj (git-on-git) Ten otrzymuje się podobnie jak:

1788 4 
35086 5 
7881 6 
    533 7 
    39 8 
    4 9 

... otrzymując przesyła potwierdzenie, które mogą być przedstawione jednoznacznie do -char mieszania (lub niższej, to jest minimalne ang Git'S) i Zatwierdzenia, które wymagają -40 znaków skrótu, aby jednoznacznie je wybrać.

porównania, znacznie większy projekt, takich jak Linux kernel, ma ten rozkład dzisiaj:

6179 5 
446463 6 
139247 7 
10018 8 
655 9 
41 10 
3  11 

Więc z bazy prawie 5 milionów obiektów i 600k zobowiązuje, nie zobowiązuje obecnie wymagając 11 z 40 cyfr szesnastkowych, aby odróżnić je od wszystkich innych zatwierdzeń.

Powiązane problemy