Os sistemas de controlo de versões usam diffs para armazenar ficheiros binários?

Como é que os sistemas de controlo de versões populares (svn, git) lidam com o armazenamento de revisões a um documento binário? Tenho projetos com fontes binárias que são periodicamente atualizados e precisam ser verificados (principalmente documentos Photoshop, formato de dados personalizados e alguns documentos de processamento de texto). Eu sempre estive preocupado em verificar nos binários porque eu pensei que os VCS poderiam tomar uma rota simples de simplesmente enviar uma nova cópia do binário cada vez - e, portanto, meu repositório iria obter enorme rapidamente.

Se eu tiver vários blocos de dados (vamos chamá-los de A, B, C, D, etc) e eu tenho um arquivo binário que na primeira verificação se parece com ABC, mas então na segunda verificação foi modificado para ADBE, meus VCS serão inteligentes o suficiente para apenas armazenar os bits alterados ou irá criar uma imagem inteiramente nova do arquivo?

Author: Steve Adams, 2016-09-16

3 answers

Tl; dr

O Git pode armazenar apenas diffs de ficheiros binários, mas não é muito eficiente, por isso provavelmente deve usar algumas ferramentas externas como lfs.

Explicação um pouco mais longa

Por omissão, o git não guarda diferenças entre commits. Quando você muda algum arquivo e faz um novo commit, o Git armazena objeto com um conteúdo de todo o arquivo. Não importa se você mudar apenas uma linha, ou reescrever todo o arquivo-git não armazena diffs, pelo menos, primeiro lugar. Há um pedaço de merda chamado git-gc (coletor de lixo) responsável por Tarefas como remover dangling commits e otimização, ele executa outro comando git- git-repack o que faz exactamente o que pedes. É preciso todo o grupo de objetos e armazená-los dentro de uma embalagem usando compressão delta.

Infelizmente o empacotamento com git-repack não é especialmente eficiente quando se trata de comprimir arquivos binários. Podes sempre ajustar ele, mas se seus arquivos mudam muito, ou se eles são realmente grandes, você provavelmente deve usar alguma ferramenta externa, como lfs.

 2
Author: qzb, 2017-12-19 16:28:42

Usamos CollabNet SubVersion Edge.

Tive oportunidade de fazer um Photoshop de 50 megabyte .arquivo psd dentro do qual eu tinha atualizado parâmetros de Filtro Inteligente.
09/18/2016  05:15 PM        53,015,186 StarSpikesPro4RealismTest.psd

O tamanho do meu repositório SVN cresceu de:

 Total Files Listed:
       19157 File(s) 26,148,088,902 bytes

A

 Total Files Listed:
       19159 File(s) 26,152,019,035 bytes
Isso é menos de 10% do tamanho do.arquivo psd, então claramente todo o arquivo de 50 megabyte não foi armazenado, mas um delta foi calculado.

Tenha em mente que alguns arquivos, por exemplo, imagens Photoshop, podem ser eles mesmos comprimidos por sua aplicação associada, então o conteúdo binário do arquivo armazenado pode ser totalmente diferente de editar para editar, e assim não vai produzir um bom desempenho delta em qualquer sistema. Mas você pode optar por desativar essa compressão no Photoshop. Este foi realmente comprimido em save, mas mesmo com essa compressão habilitado nós vimos apenas um pequeno crescimento no tamanho do repositório.

Na minha experiência em geral, um repositório SVN usado principalmente para o desenvolvimento de código e armazenamento de alguns arquivos binários associados não parecem crescer rapidamente em tudo. É difícil comparar detalhes, mas o repositório acima, 8 anos de idade e trabalhou ativamente por 2 pessoas em tempo integral, contendo soluções de estúdio Visual e mix de bibliotecas baixadas, arquivos de desenvolvimento de código Não-fonte, tais como gráficos, resultados de compilação, documentação, etc., só cresceu para 26 gigabytes. O servidor tem um array RAID 5 de três SSDs de 120 GB e eu não prevejo que ele precise de uma atualização por anos.

- Noel
 2
Author: NoelC, 2016-09-21 09:22:26

Como é que os sistemas de controlo de versões populares (svn, git) lidam com o armazenamento de revisões a um documento binário?

Bastante inteligente, alguns são apenas mais inteligentes (mas todas as mudanças de loja, não a versão completa dos Artefactos)

Nos meus testes rápidos Sujos há algum tempo atrás (na altura do Git 1.7.* ) para o mesmo caso de teste (as mesmas alterações em MBs de binários) a mesma sequência produziu ligeiramente menos (algumas percentagens) SVN-repo, em comparação com Git.

Mas, por outro lado mão:

A extensão Git-LFS ou Mercurial+LargeFiles permite armazenar binários (principalmente LARGE) fora do repositório (o repo só tem ponteiros para objectos em localização externa) e tem o melhor de ambos os mundos: binários rápidos e pequenos

 1
Author: Lazy Badger, 2016-09-16 02:59:17