Otimize um repositório git, contendo grandes arquivos binários

21

Nosso projeto tem cerca de 11 GB, 10 dos quais são dados binários (imagens .png). Consequentemente, as operações git diffou git statusdemoram mais de um minuto. Felizmente, todos os arquivos de dados são separados em uma pasta com o nome maravilhoso data. A atribuição é "Evite compactar, diferenciar e outras operações caras em arquivos binários".

Eu sinto que os atributos git são a solução, mas como? Ou existe uma arquitetura melhor do que um repositório monolítico?

Vorac
fonte
1
A primeira grande questão aqui é qual a importância desses arquivos de dados. Seu programa precisa de todas essas imagens disponíveis para fazer algo útil ou pode se dar bem com um pequeno subconjunto durante o desenvolvimento / teste típico?
Ixrec 11/03/16
@Ixrec, as imagens são realmente mais importantes que o código fonte. Todos eles devem estar presentes e as somas de verificação .png sempre são verificadas quanto a arquivos corrompidos.
Vorac 14/03
1
Por que essa questão não está no estouro de pilha? O Q. Parece exatamente adequado a ele.
spirc
A @spirc esta pergunta se estende pela linha entre "ajuda com uma ferramenta de software", que é um tópico no SO, e "estratégia de controle de versão", que é um tópico aqui. Como não está perguntando qual comando git executar para fazer algo, ele não está claramente do lado SO da linha, então votei em deixá-lo em aberto aqui.
@ Snowman, obrigado pela resposta. Em qual item da lista de tópicos isso se encaixa? programadores.stackexchange.com/help/on-topic
spirc:

Respostas:

18

Você pode usar o git-lfs ou ferramentas similares (git-fat, git-anexo, etc.). Essas ferramentas basicamente substituem os arquivos binários no seu repositório por um pequeno arquivo de texto com hashes e armazenam os dados binários reais de maneira não-git - como um compartilhamento de rede.

Torna diffs e tudo super rápido, pois apenas os hashes são comparados e é - pelo menos para o git-lfs - transparente para o usuário (após a instalação uma vez).

O Afaik git-lfs é suportado pelo github, gitlab, VisualStudio e é de código aberto.

kat0r
fonte
2
Você já tentou usar git-lfsem um projeto com muitos gigabytes de ativos com uma equipe mista de desenvolvedor / artista? Estou interessado em saber se as pessoas estão usando o git-lfs para projetos como jogos e animação. Uma vez que ainda é relativamente novo no momento da escrita. Pela minha própria experiência, a barreira de entrada no git para usuários menos técnicos é muito alta, portanto, ter uma camada extra para gerenciamento de arquivos por cima - pode ser difícil para as pessoas usarem, a menos que já estejam confortáveis ​​com o git.
ideasman42
Apenas até cerca de 1 GB de dados, desculpe. Mas o git-lfs não deve adicionar etapas adicionais aos usuários finais, deve ser completamente transparente.
kat0r
Essa parece ser a resposta correta, se surgirem alguns problemas durante a integração, relatarei aqui. Portanto, o procedimento de instalação precisa ser concluído apenas uma vez no servidor, e não em cada máquina cliente?
Vorac 15/03
Depois, você também precisa instalar um pequeno complemento de cliente, consulte a página do github. Mas isso deve ser fácil de implementar com uma política de grupo / mais simples do que qualquer alternativa.
kat0r
1

Use os repositórios GIT e SVN

Se os arquivos binários puderem ser separados logicamente da fonte, considere o uso de git para arquivos de texto e um DVCS não como subversão para os arquivos binários.

Um projeto em que trabalho faz isso, pois temos muitos GB para bibliotecas compiladas (para dependências do OSX / Win32), das quais precisamos manter a versão.


Por outro lado, se você possui usuários não técnicos, o uso de dois sistemas de controle de versão pode ser problemático. No entanto, se os artistas não estiverem trabalhando no código, você poderá fornecer um script para executar a atualização e eles poderão usar o subversion para confirmar ativos binários.

Use SVN (com git svn)

Embora essa troca nem sempre seja tão agradável para desenvolvedores que estão acostumados a usar o git comum, você pode usar o SVN para o repositório principal e os desenvolvedores podem usar git svnferramentas.

Isso torna um pouco mais de trabalho para desenvolvedores que usam git, mas significa para todos que não estão familiarizados com o DVCS (ou VCS em geral) - eles podem usar o modelo simples do SVN sem precisar usar vários sistemas de controle de versão complexos.


O git-lfs também é uma opção, mas eu não o usei, por isso não posso falar de como funciona.

ideasman42
fonte