Estou apenas expandindo a resposta @Leif Gruenwoldt
e detalhando o que está na referência fornecida por@Leif Gruenwoldt
Faça Você Mesmo..
- Etapa 1. Crie um documento de texto vazio (o nome não importa) em seu repositório
- Etapa 2. Preparar e confirmar o documento
- Etapa 3. Identifique o hash do blob executando
git ls-tree HEAD
- Etapa 4. Encontre o hash do blob a ser
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- Etapa 5. Saia da surpresa e leia abaixo
Como o GIT calcula seus hashes de confirmação
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
O texto blob⎵
é um prefixo constante e \0
também é constante e é o NULL
caractere. O <size_of_file>
e <contents_of_file>
varia dependendo do arquivo.
Consulte: Qual é o formato do arquivo de um objeto de confirmação git?
E isso é tudo!
Mas espere! , você percebeu que <filename>
não é um parâmetro usado para o cálculo de hash? Dois arquivos podem ter o mesmo hash se o conteúdo for indiferente à data e hora em que foram criados e ao nome. Essa é uma das razões pelas quais o Git manipula movimentos e renomeia melhor do que outros sistemas de controle de versão.
Faça Você Mesmo (Ext)
- Etapa 6. Crie outro arquivo vazio com um diferente
filename
no mesmo diretório
- Etapa 7. Compare os hashes dos dois arquivos.
Nota:
O link não menciona como o tree
objeto está em hash. Eu não tenho certeza do algoritmo e dos parâmetros, no entanto, pela minha observação, provavelmente calcula um hash com base em todos os blobs
e trees
(provavelmente seus hashes) que ele contém