Durante o primeiro clone de um repositório, o git primeiro recebe os objetos (o que é bastante óbvio) e depois passa a mesma quantidade de tempo "resolvendo deltas". O que realmente está acontecendo durante esta fase do clone?
Durante o primeiro clone de um repositório, o git primeiro recebe os objetos (o que é bastante óbvio) e depois passa a mesma quantidade de tempo "resolvendo deltas". O que realmente está acontecendo durante esta fase do clone?
Respostas:
O Git usa codificação delta para armazenar alguns dos objetos em arquivos de pacote. No entanto, você não quer ter que reproduzir cada mudança sempre em um determinado arquivo, a fim de obter a versão atual, de modo Git também tem instantâneos ocasionais do conteúdo do arquivo armazenados também. "Resolver deltas" é a etapa que trata de garantir que tudo isso permaneça consistente.
Aqui está um capítulo da seção "Git Internals" do livro Pro Git, disponível on-line, que fala sobre isso.
git gcou sempre que o Git determinar necessário), o Git compactará todos os arquivos "frouxos" em um arquivo de pacote para economizar espaço e um arquivo de índice nesse pacote será criado. Portanto, o zlib compactará com seu próprio algoritmo delta, mas o Git usa a codificação delta para armazenar versões anteriores. Como o acesso mais comum e frequente é a versão mais recente, ela é armazenada como uma captura instantânea.
Os estágios de git clonesão:
"Resolvendo deltas" é a mensagem mostrada para o segundo estágio, indexando o arquivo do pacote ("git index-pack").
Os arquivos do pacote não possuem os IDs reais do objeto, apenas o conteúdo do objeto. Portanto, para determinar quais são os IDs de objeto, o git precisa descomprimir + SHA1 de cada objeto no pacote para produzir o ID do objeto, que é gravado no arquivo de índice.
Um objeto em um arquivo de pacote pode ser armazenado como um delta, ou seja, uma sequência de alterações a serem feitas em outro objeto. Nesse caso, o git precisa recuperar o objeto base, aplicar os comandos e SHA1 o resultado. O próprio objeto base pode ter que ser derivado aplicando uma sequência de comandos delta. (Mesmo que no caso de um clone, o objeto base já tenha sido encontrado, há um limite para quantos objetos fabricados estão armazenados em cache na memória).
Em resumo, o estágio "resolvendo deltas" envolve a descompactação e soma de verificação de todo o banco de dados do repositório, o que não surpreendentemente leva muito tempo. Presumivelmente, descomprimir e calcular SHA1s realmente leva mais tempo do que aplicar os comandos delta.
No caso de uma busca subsequente, o arquivo de pacote recebido pode conter referências (como bases de objetos delta) a outros objetos que o git de recebimento já deve ter. Nesse caso, o git de recebimento realmente reescreve o arquivo de pacote recebido para incluir quaisquer objetos referenciados, para que qualquer arquivo de pacote armazenado seja auto-suficiente. Pode ser onde a mensagem "resolvendo deltas" se originou.
O âmbar parece estar descrevendo o modelo de objeto que o Mercurial ou similar usa. O Git não armazena os deltas entre versões subseqüentes de um objeto, mas instantâneos completos do objeto, todas as vezes. Em seguida, compacta esses instantâneos usando a compactação delta, tentando encontrar bons deltas para usar, independentemente de onde no histórico eles existam.