Se você for criar, digamos, uma estrutura de diretório em que um diretório seja nomeado para um commit em um repositório Git, e você desejar que ele seja curto o suficiente para fazer com que seus olhos não sangrem, mas longo o suficiente para que a chance de colidir seria insignificante, quanto da substring SHA é geralmente necessária?
Digamos que desejo identificar exclusivamente essa alteração: https://github.com/wycats/handlebars.js/commit/e62999f9ece7d9218b9768a908f8df9c11d7e920
Posso usar apenas os quatro primeiros caracteres: https://github.com/wycats/handlebars.js/commit/e629
Mas sinto que isso seria arriscado. Mas, assumindo uma base de código que, ao longo de alguns anos, pode ter, digamos, 30 mil alterações, quais são as chances de colisão se eu usar 8 caracteres? 12? Existe um número geralmente considerado aceitável para esse tipo de coisa?
Respostas:
Esta pergunta é realmente respondida no capítulo 7 do livro Pro Git :
7 dígitos é o padrão do Git para um SHA curto, o que é bom para a maioria dos projetos. A equipe do Kernel aumentou os deles várias vezes, como mencionado, porque eles têm várias centenas de milhares de confirmações. Portanto, para seus commits de ~ 30k, 8 ou 10 dígitos devem estar perfeitamente bem.
fonte
git
é bastante inteligente quando se trata disso. Você pode definir a curto abreviatura, dizer a 4, egit
vai usar 4 dígitos para o maior número de hashes como ele pode, mas mudar para 5 ou mais quando se sabe que a abreviatura não é único ...Nota: você pode solicitar
git rev-parse --short
o SHA1 mais curto e único.Veja " git obter hash curto do hash regular "
Para grandes repositórios, 7 não é suficiente desde 2010 e confirma o dce9648 pelo próprio Linus Torvalds (git 1.7.4.4, outubro de 2010):
(BK = BitKeeper)
environment.c
:Nota: Conforme comentado abaixo por marco.m ,
core.abbrevLength
foi renomeado nocore.abbrev
mesmo Git 1.7.4.4 no commit a71f09fMais recentemente, Linus adicionado em cometer e6c587c (para Git 2.11, Q4 2016):
(como mencionado no Matthieu Moy 's resposta )
Veja commit e6c587c (01/10/2016) por Linus Torvalds (
torvalds
) .Consulte commit 7b5b772 , commit 65acfea (01 out 2016) por Junio C Hamano (
gitster
) .(Mesclado por Junio C Hamano -
gitster
- in commit bb188d0 , 03 de outubro de 2016)Essa nova propriedade (adivinhando um padrão razoável para o valor abreviado do SHA1) afeta diretamente como o Git calcula seu próprio número de versão para liberação .
fonte
core.abbrevLength
foi renomeado paracore.abbrev
.core.abbrev
.git rev-parse --short=10 --verify HEAD
para gerar 10 caracteres. Estávamos usandogit log -1 --format=%h
, mas isso gerou apenas 7 caracteres e tivemos uma colisão.Isso é conhecido como o problema do aniversário.
Para probabilidades inferiores a 1/2, a probabilidade de uma colisão pode ser aproximada como
p ~ = (n 2 ) / (2 m)
Onde n é o número de itens e m é o número de possibilidades para cada item.
O número de possibilidades para uma sequência hexadecimal é 16 c, onde c é o número de caracteres.
Então, para 8 caracteres e 30K confirma
30K ~ = 2 15
P ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16 8 ) = 2 30 de / 2 33 = ⅛
Aumentando para 12 caracteres
P ~ = (n 2 ) / (2m) ~ = ((2 15 ) 2 ) / (2 * 16, 12 ) = 2 30 de / 2 49 = 2 -19
fonte
Esta pergunta foi respondida, mas para quem procura a matemática por trás - chama-se Problema de aniversário ( Wikipedia ).
É sobre a probabilidade de ter 2 (ou mais) pessoas do grupo de N pessoas para fazer aniversário no mesmo dia do ano. O que é analógico para provavelmente 2 (ou mais) confirmações git do repositório com N confirmações no total com o mesmo prefixo hash de comprimento X.
Veja a tabela de probabilidades . Por exemplo, para uma sequência hexadecimal de hash de comprimento 8, a probabilidade de ter uma colisão atinge 1% quando o repositório possui apenas cerca de 9300 itens (o git confirma). Para 110.000 confirmações, a probabilidade é de 75%. Mas se você tiver uma sequência hexadecimal de hash de comprimento 12, a probabilidade de colisão em 100.000 confirmações será inferior a 0,1%.
fonte
A versão 2.11 do Git (ou talvez 2.12?) Conterá um recurso que adapta o número de caracteres usados em identificadores curtos (por exemplo
git log --oneline
) ao tamanho do projeto. Depois de usar essa versão do Git, a resposta para sua pergunta pode ser "escolha o tamanho que o Git fornecergit log --oneline
, é seguro o suficiente".Para mais detalhes, consulte Alterando o padrão para "core.abbrev"? discussão na edição 20 do Git Rev News e confirme bb188d00f7 .
fonte