Si vous allez construire, disons, une structure de répertoires dans laquelle un répertoire est nommé pour une validation dans un référentiel Git, et que vous voulez qu'il soit suffisamment court pour que vos yeux ne saignent pas, mais suffisamment longtemps pour que les chances de collision serait négligeable, quelle proportion de la sous-chaîne SHA est généralement requise?
Disons que je veux identifier de manière unique ce changement: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Je peux utiliser aussi peu que les quatre premiers caractères: https://github.com/wycats/handlebars.js/commit/e629
Mais je pense que ce serait risqué. Mais en résumant une base de code qui, sur quelques années, pourrait avoir - disons - 30 000 changements, quelles sont les chances de collision si j'utilise 8 caractères? 12? Y a-t-il un nombre qui est généralement considéré comme acceptable pour ce genre de chose?
Réponses:
Cette question trouve sa réponse dans le chapitre 7 du livre Pro Git :
7 chiffres est la valeur par défaut de Git pour un SHA court, donc c'est bien pour la plupart des projets. L'équipe Kernel a augmenté la leur plusieurs fois, comme mentionné, car elle compte plusieurs centaines de milliers de commits. Donc, pour vos ~ 30k commits, 8 ou 10 chiffres devraient être parfaitement bien.
la source
git
c'est assez intelligent en ce qui concerne cela. Vous pouvez définir l'abréviation courte, disons à 4, etgit
utiliserez 4 chiffres pour autant de hachages que possible, mais passez à 5 ou plus quand il sait que l'abréviation n'est pas unique ...Remarque: vous pouvez demander
git rev-parse --short
le SHA1 le plus court et pourtant unique.Voir " git get short hash from regular hash "
Pour les gros dépôts, 7 n'est pas suffisant depuis 2010, et engagez dce9648 par Linus Torvalds lui-même (git 1.7.4.4, octobre 2010):
(BK = BitKeeper)
environment.c
:Remarque: Comme commenté ci-dessous par marco.m , a
core.abbrevLength
été renommécore.abbrev
dans ce même Git 1.7.4.4 dans commit a71f09fPlus récemment, Linus a ajouté dans commit e6c587c (pour Git 2.11, Q4 2016):
(comme mentionné dans la réponse de Matthieu Moy )
Voir commit e6c587c (01 octobre 2016) par Linus Torvalds (
torvalds
) .Voir commit 7b5b772 , commit 65acfea (01 oct.2016 ) par Junio C Hamano (
gitster
) .(Fusionné par Junio C Hamano -
gitster
- en commit bb188d0 , 03 oct.2016 )Cette nouvelle propriété (deviner une valeur par défaut raisonnable pour la valeur d'abréviation SHA1) a un effet direct sur la façon dont Git calcule son propre numéro de version pour publication .
la source
core.abbrevLength
a été renommécore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
pour générer 10 caractères. Nous utilisionsgit log -1 --format=%h
, mais cela n'a généré que 7 caractères et nous avons eu une collision.Ceci est connu comme le problème d'anniversaire.
Pour des probabilités inférieures à 1/2, la probabilité d'une collision peut être approximée comme
p ~ = (n 2 ) / (2m)
Où n est le nombre d'articles et m est le nombre de possibilités pour chaque article.
Le nombre de possibilités pour une chaîne hexadécimale est de 16 c où c est le nombre de caractères.
Donc pour 8 caractères et 30K commits
30K ~ = 2 15
p ~ = (n 2 ) / (2m) = ~ ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 /2 33 = ⅛
L'augmenter à 12 caractères
p ~ = (n 2 ) / (2m) = ~ ((2 15 ) 2 ) / (2 * 16 12 ) = 2 30 /2 49 = 2 -19
la source
Cette question a été répondue, mais pour tous ceux qui recherchent les mathématiques derrière - cela s'appelle Problème d'anniversaire ( Wikipedia ).
Il s'agit de la probabilité d'avoir 2 (ou plus) personnes d'un groupe de N personnes pour fêter leur anniversaire le même jour de l'année. Ce qui est analogue à probablement 2 commits git (ou plus) à partir du référentiel ayant N commits au total ayant le même préfixe de hachage de longueur X.
Regardez le tableau des probabilités . Par exemple, pour une chaîne hexadécimale de hachage de longueur 8, la probabilité d'avoir une collision atteint 1% lorsque le référentiel contient à peu près 9300 éléments (git s'engage). Pour 110 000 commits, la probabilité est de 75%. Mais si vous avez une chaîne hexadécimale de hachage de longueur 12, la probabilité de collision dans 100 000 commits est inférieure à 0,1%.
la source
Git version 2.11 (ou peut-être 2.12?) Contiendra une fonctionnalité qui adapte le nombre de caractères utilisés dans les identifiants courts (par exemple
git log --oneline
) à la taille du projet. Une fois que vous utilisez une telle version de Git, la réponse à votre question peut être "choisissez la longueur que Git vous donne avecgit log --oneline
, c'est assez sûr".Pour plus de détails, voir Changer la valeur par défaut de «core.abbrev»? discussion dans Git Rev News édition 20 et validez bb188d00f7 .
la source