Trabalhe com arquivos grandes em seu repositório Git

Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022

Use o Git para ficheiros fonte, o Artefactos do Azure para dependências e o Git LFS para ficheiros binários grandes que mudam frequentemente. Se o seu repositório já contém ficheiros grandes, este artigo ajuda-o a decidir o que manter no Git, o que mover e quando remover binários do histórico.

Decida onde guardar cada ficheiro

Se está a decidir o que fazer com ficheiros que já estão num repositório, comece por aqui:

Se o teu repositório já for grande, revê o repositório e os limites de push antes de escolheres uma abordagem de armazenamento. Veja os limites do Git para os limites de ficheiros, push e caminhos que afetam repositórios grandes.

Escolha a opção de armazenamento certa para Git, gestão de pacotes e Git LFS

Use esta tabela para escolher a melhor opção.

Tipo de ficheiro ou cenário Use
Código-fonte, scripts e ficheiros de texto Git
Dependências e pacotes reutilizáveis Gestão de pacotes do Artefactos do Azure
Ficheiros binários grandes que mudam frequentemente Git LFS
Azure DevOps Server Git LFS e Kerberos Consulte as orientações do Kerberos neste artigo e no artigo ligado no final

O Git funciona melhor para ficheiros fonte baseados em texto e outros conteúdos que mudam em pequenos incrementos legíveis.

Binários grandes não são adequados para armazenamento Git normal porque:

  • O git armazena as diferenças de versão de forma eficiente para código-fonte, scripts e ficheiros de texto.
  • Ficheiros grandes que mudam completamente entre versões não comprimem nem diferem bem.
  • Ficheiros binários grandes aumentam os tempos de clone, fetch, branch e checkout.

Se adicionares ficheiros grandes e não distinguíveis, como binários, ao teu repositório, manténs uma cópia completa desses ficheiros sempre que lhes fizeres uma alteração. Se existirem muitas versões desses arquivos em seu repositório, eles aumentam drasticamente o tempo para fazer check-out, ramificar, buscar e clonar seu código.

Que ficheiros pertencem ao Git?

Use a opção mais simples que se ajuste ao tipo de ficheiro e com que frequência muda.

Mantém o código-fonte no Git, não as dependências

Usa o Git para ficheiros que a tua equipa edita diretamente. Mantenha as dependências fora do repositório e entregue-as através da gestão de pacotes.

  • Coloca ficheiros fonte no Git.
  • Armazene DLLs, ficheiros de biblioteca e outras dependências fora do repositório.
  • Use a gestão de pacotes para versionar e implementar dependências.

O gerenciamento de pacotes agrupa suas dependências e instala os arquivos em seu sistema quando você implanta o pacote. Os pacotes são versionados para garantir que o código testado em um ambiente seja executado da mesma forma em outro ambiente, desde que os ambientes tenham os mesmos pacotes instalados.

Não comprometas as saídas da build

Use o Git para o código-fonte, não para resultados de compilação nem artefactos de teste.

  • Não comprometas binários, registos, saídas de rastreamento ou dados de diagnóstico.
  • Partilhe registos e informações de rastreio através do rastreamento de itens de trabalho ou partilha de ficheiros da equipa.

Armazenar pequenos ficheiros binários no Git

Usa o Git apenas para ficheiros binários pequenos quando mudam pouco frequentemente.

  • Bons exemplos incluem imagens web, ícones e outros pequenos recursos artísticos.
  • Manter estes ficheiros no Git preserva um fluxo de trabalho consistente para a equipa.

Importante

Mesmo binários pequenos podem causar problemas se forem atualizados com frequência. Por exemplo, 100 alterações em um arquivo binário de 100 KB usam tanto armazenamento quanto 10 alterações em um binário de 1 MB. Devido à frequência das atualizações, o ficheiro binário mais pequeno tende a abrandar o desempenho da criação de ramificações mais vezes do que o ficheiro binário maior.

Evite ativos binários grandes e frequentemente atualizados

O Git não consegue armazenar binários grandes de forma eficiente porque estes ficheiros mudam frequentemente entre versões e normalmente já estão comprimidos.

  • O git armazena o conteúdo completo de cada versão.
  • O tamanho do repositório aumenta com o tempo.
  • As operações de clonagem, criação de ramos, obtenção e extração ficam mais lentas.

Como o Git tem de armazenar o conteúdo completo de cada versão, a deltificação e a compressão não ajudam muito. À medida que estes ficheiros se acumulam, o repositório torna-se maior, a ramificação mais lenta e os tempos de clonagem aumentam.

Estratégias para ficheiros fonte binários grandes

  • Não commitas arquivos comprimidos. Descomprime os dados e compromete as fontes diferenciáveis em vez disso.
  • Evite cometer código compilado e outras dependências binárias. Construa-os ou forneça-os através da gestão de pacotes.
  • Armazena a configuração e outros dados estruturados em formatos de texto simples passíveis de comparação, como JSON.

O que é o Git Large File Storage (Git LFS)?

Utilize o Git Large File Storage (LFS) para ficheiros de origem que mudam frequentemente e diferem significativamente entre versões.

Git LFS:

  • Armazena apontadores para ficheiros grandes no repositório em vez do conteúdo completo do ficheiro.
  • Armazena o conteúdo binário em armazenamento remoto separado.
  • Descarrega a versão correta quando clona ou muda de ramificação.
  • Mantém o teu fluxo de trabalho normal do Git para ficheiros binários grandes sem mover os conteúdos completos dos ficheiros em cada clonagem e mudança de ramo.

Benefícios do Git LFS

O Git LFS mantém o fluxo de trabalho Git enquanto move o conteúdo de ficheiros grandes para fora do repositório principal.

  • A sua equipa pode continuar a usar o mesmo fluxo de trabalho Git de ponta a ponta.
  • Ficheiros grandes ficam fora do histórico principal do repositório, o que ajuda a manter o repositório gerível.
  • O bloqueio de ficheiros suporta trabalho partilhado em assets grandes e não distinguíveis, como vídeos, sons e mapas de jogo.

O Azure DevOps Services suporta totalmente o Git LFS e oferece-o gratuitamente. Para usar o LFS, instala o cliente Git LFS, configura o rastreamento dos ficheiros que queres armazenar no LFS e depois envia as tuas alterações para o Repositórios do Azure.

Para orientações específicas para Azure DevOps Server e Kerberos, veja Kerberos e Git LFS.

Limitações do Git LFS

Git LFS ainda tem algumas desvantagens a ter em conta:

  • Cada cliente Git deve instalar o cliente Git LFS e compreender a sua configuração de rastreamento.
  • Se o cliente não estiver instalado ou configurado corretamente, os clones descarregam os dados do ponteiro em vez do ficheiro binário.
  • O Git não pode fundir diferentes versões de um ficheiro binário, por isso os colegas de equipa ainda precisam de coordenar as alterações.
  • O Git LFS permite bloqueio de ficheiros, mas os utilizadores ainda precisam de obter a cópia mais recente antes de começarem a trabalhar.
  • O Repositórios do Azure não suporta Secure Shell (SSH) para repositórios com ficheiros rastreados Git LFS.
  • Arrastar um ficheiro binário para a interface web compromete o binário no repositório, não o ponteiro do LFS.
  • Os uploads grandes podem ser limitados pelo espaço livre disponível, pela carga de trabalho atual e pelo limite de uma hora para upload.

Formato de ficheiro Git LFS

O ficheiro que grava no seu repositório para um ficheiro rastreado pelo Git LFS tem algumas linhas, cada uma com um par de chave/valor:

version https://git-lfs.github.com/spec/v1
oid a747cfbbef63fc0a3f5ffca332ae486ee7bf77c1d1b9b2de02e261ef97d085fe
size 4923023

Observação

Planear o Azure DevOps Server e o Kerberos

Se utilizares o Azure DevOps Server e a Autenticação do Windows, deves prever a utilização do Kerberos quando utilizares o Git LFS. Git LFS 2.10.0 e posteriores suportam autenticação Kerberos.

Se precisar de atualizar a documentação mais antiga do Azure DevOps Server, comece por Kerberos e Git LFS e pela documentação associada sobre autenticação do Azure DevOps Server.