Por que os repositórios do Git / Mercurial usam menos espaço?

15

Eu li em várias discussões aqui e em SO que os repositórios DVCS usam o mesmo espaço, ou menos, que suas contrapartes centralizadas. Eu posso ter perdido, mas não encontrei uma boa explicação do motivo. Ninguem sabe?

    
por Alex Florescu 13.05.2012 / 15:17
fonte

1 resposta

18

De minha própria experiência, as seguintes afirmações são todas verdadeiras:

  • O Git é muito eficiente no armazenamento de arquivos de texto e apenas armazena esses arquivos que foram alterados. Então, ao fazer uma comparação entre o SVN e o Git para comparar os tamanhos dos repositórios, eles podem ser semelhantes ou até mesmo uma pequena vantagem para o Git.
  • Isso é completamente errado se você comparar o tamanho dos repositórios onde uma quantidade significativa de arquivos são arquivos de escritório (como MS word, excel, powerpoint, ...). Aqui o Git também armazena cópias completas, o que significa que 10 pequenas mudanças em uma pilha de slides em powerpoint resultam em 10 cópias completas, onde o Subversion armazena apenas um diff binário, que pode ser um fator de 100 menores.

Se você comparar o local de checkout (que é um repositório em si mesmo com o Git), a história é totalmente diferente:

  • O Subversion armazena para cada arquivo uma cópia completa, de modo que o tamanho do seu local de checkout normalmente é 2 vezes o tamanho dos próprios arquivos.
  • O Git armazena o histórico completo do repositório localmente, portanto, dependendo do tamanho do histórico, ele pode ser menor ou muito maior do que o da cópia de checkout do Subversion.

Se você comparar a quantidade de bytes que você precisa fazer down ou upload, será diferente novamente.

  • Subversion normalmente tem que enviar ou receber menos bytes, porque ele só envia diferenças. Tem que fazer isso em cada commit e atualização.
  • O Git tem que obter todo o repositório (inicialmente) e, em seguida, envia arquivos completos (compactados?) que não são tão diferentes para arquivos de texto, mas podem ser diferentes para arquivos binários. E sim, o Git só faz isso quando você pressiona ou puxa algo para o repositório remoto.

Então, no final, você compara maçãs com laranjas e, dependendo do que você quer fazer com o Subversion ou o Git, o resultado pode ser diferente.

@jk perguntou sobre cópias completas ou diffs binários, e eu não pude responder a essa pergunta. Eu perguntei a Matthew McCullough que deu uma oficina do Git ultimamente no Jax 2012 (que eu visitei). Ele tomou o tempo (muito obrigado a ele) para explicar com uma essência detalhada do funcionamento interno do Git. Então, sim, há uma compressão trabalhando lá (e eu vou fazer um experimento com um arquivo do Microsoft Office também e vou comparar isso com a sua essência), mas não, a compressão é feita em todo o arquivo. Citando sua essência:

Loose objects are written in compressed, but non-delta format at the time of each commit.

    
por 14.05.2012 / 08:22
fonte