DEV Community

Valdemar Arantes Neto
Valdemar Arantes Neto

Posted on

Por que você deveria auditar binários no seu repositório Git (e como fazer isso)

O problema que me motivou

Como arquiteto de software, estou iniciando um levantamento de espaço em disco ocupado por arquivos indevidamente versionados no Bitbucket da empresa. Não estou falando de senhas ou chaves de API — esses são problemas óbvios. Estou falando de binários como DLLs, arquivos .so, executáveis e até bibliotecas como jquery.js commitadas diretamente no repositório.

Antes de iniciar o trabalho prático, precisei construir o embasamento técnico para justificar o esforço. Este artigo documenta a pesquisa que realizei para fundamentar essa decisão — e que pode ser útil para outros que enfrentam situação similar.


Vale a pena fazer o levantamento?

Na maioria dos casos, sim — mas com nuances importantes.

O esforço de identificar e remover binários pode trazer ganhos significativos em performance, custo e manutenibilidade. Porém, há cenários específicos onde o versionamento de binários pode ser aceitável ou até necessário.

Eficiência e Performance

Impacto técnico:

  • Cada versão de um binário cria um novo blob completo no histórico
  • Git não faz delta compression eficiente em binários
  • Operações (clone, fetch, push) ficam proporcionalmente mais lentas

Exemplo mensurável:

  • Binário de 50MB versionado 20 vezes → ~1GB de histórico adicional
  • git clone que levaria 30s pode passar para vários minutos
  • Em equipes de 20+ pessoas, isso representa horas de tempo perdido por mês

Casos documentados na literatura: repositórios com binários no histórico frequentemente apresentam degradação significativa. Um repositório de microserviço com JARs de dependências commitados pode facilmente atingir 800MB, sendo 600MB apenas de binários — impactando o tempo de clone de forma desproporcional.

Custo de Storage

Impactos diretos:

  • Bitbucket Cloud: limites de 4GB por repositório (planos gratuitos)
  • Servidores self-hosted: custo de storage cresce indefinidamente
  • CI/CD: checkout mais lento aumenta tempo e custo de builds

Exemplo prático:

  • Um repositório com 500MB de binários no histórico pode custar 10-15min extras por build em CI/CD
  • Em 100 builds/dia = ~25 horas/mês de tempo desperdiçado de máquina

Manutenibilidade

Problemas concretos:

  • Binários não produzem diffs legíveis para code review
  • Conflitos são irrecuperáveis (binary merge conflicts = escolher uma versão)
  • Bibliotecas de terceiros (jquery.js) devem vir de package managers

Quando binários no Git podem ser aceitáveis

Cenários válidos:

  1. Binários pequenos (<100KB) e raramente modificados
  2. Bootstrap essencial: ferramentas mínimas para setup inicial do projeto
  3. Compliance regulatório: artefatos imutáveis exigidos para auditoria (financeiro, saúde)
  4. Projetos isolados: poucos colaboradores, baixa frequência de alteração

Trade-offs a considerar:

  • Repositórios pequenos (<50MB total) com equipe reduzida (<5 pessoas): impacto pode ser marginal
  • Custos de migração vs. benefícios: avaliar se o esforço justifica os ganhos

Alternativas e suas limitações

Git LFS (Large File Storage)

Adequado para: assets de mídia, datasets, arquivos grandes inevitáveis

Limitações:

  • Requer configuração adicional no servidor
  • Adiciona complexidade ao workflow (git lfs install, git lfs track, git lfs pull)
  • Nem todo Bitbucket Cloud oferece suporte ilimitado
  • Equipe precisa treinar novo fluxo de trabalho

Package Managers

Recomendado para: dependências de terceiros

  • JavaScript: npm, yarn, pnpm
  • Java: maven, gradle
  • Python: pip, poetry
  • C++: conan, vcpkg

Artifact Repositories

Adequado para: builds, releases, bibliotecas internas

  • Artifactory, Nexus, Google Artifact Registry
  • Integração nativa com CI/CD
  • Controle de versão, segurança e auditoria
  • Vantagem sobre Git LFS: melhor para pipelines automatizados

Abordagem comum: migrar binários de build para repositórios especializados (como Nexus) e configurar ferramentas de build (Maven, Gradle) para baixá-los automaticamente pode eliminar centenas de MB de repositórios críticos.

Container Registries

Adequado para: binários empacotados em imagens Docker

  • Docker Hub, Google Container Registry, Amazon ECR
  • Versionamento via tags de imagem
  • Ideal para deploys containerizados

Como identificar arquivos problemáticos

Comando para listar maiores blobs:

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  awk '/^blob/ {print $3, $2, $4}' |
  sort -rn |
  head -20
Enter fullscreen mode Exit fullscreen mode

Ferramentas especializadas:

# Análise completa do repositório
git-sizer --verbose

# Limpeza segura de histórico
git filter-repo --strip-blobs-bigger-than 10M
# ou
bfg --strip-blobs-bigger-than 10M
Enter fullscreen mode Exit fullscreen mode

Métricas para decisão

Antes de iniciar o levantamento, meça:

Baseline atual:

# Tamanho do repositório
du -sh .git

# Tempo de clone
time git clone <repo-url>

# Maiores arquivos no histórico
git-sizer --verbose | grep "Maximum blob size"
Enter fullscreen mode Exit fullscreen mode

Após limpeza, compare:

  • Redução de tamanho (%)
  • Redução no tempo de clone (segundos)
  • Impacto no tempo de CI/CD

ROI esperado:

  • Repositórios >1GB: ganhos significativos em equipes médias/grandes
  • Repositórios <100MB: avaliar custo vs. benefício caso a caso

Recomendações Práticas

Ações Imediatas:

  1. Configurar .gitignore adequado:
# Build artifacts
*.dll
*.so
*.exe
*.o
target/
dist/
build/

# Dependências
node_modules/
vendor/
Enter fullscreen mode Exit fullscreen mode
  1. Auditar com git-sizer:
git-sizer --verbose
Enter fullscreen mode Exit fullscreen mode
  1. Implementar pre-commit hooks:
# Exemplo: bloquear arquivos >10MB
#!/bin/bash
MAX_SIZE=10485760
for file in $(git diff --cached --name-only); do
  size=$(wc -c < "$file")
  if [ $size -gt $MAX_SIZE ]; then
    echo "Erro: $file excede 10MB"
    exit 1
  fi
done
Enter fullscreen mode Exit fullscreen mode

Longo Prazo:

  1. Definir política clara de versionamento
  2. Migrar binários para solução apropriada (LFS, Artifactory, etc.)
  3. Documentar no README.md como obter dependências
  4. Medir impacto continuamente
  5. Alinhar com requisitos de compliance quando aplicável

Referências Verificáveis

Documentação Oficial

Git SCM - Git Attributes

https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes

Explica como Git lida com binários e limitações de diff/merge

Atlassian - Git LFS Tutorial

https://www.atlassian.com/git/tutorials/git-lfs

Guia oficial sobre quando e como usar Git LFS no Bitbucket

GitHub - Working with Large Files

https://docs.github.com/en/repositories/working-with-files/managing-large-files

Práticas recomendadas para arquivos grandes

Livros de Referência

Pro Git (Scott Chacon & Ben Straub)

https://git-scm.com/book

Capítulos relevantes: 2.2 (Git Basics), 10.2 (Git Internals - Objects)

Version Control with Git (Jon Loeliger & Matthew McCullough)

O'Reilly Media

Cobertura técnica sobre armazenamento de objetos e performance

Papers Acadêmicos

"Why Google Stores Billions of Lines of Code in a Single Repository"

Communications of ACM, Vol. 59 No. 7, Pages 78-87 (2016)

https://dl.acm.org/doi/10.1145/2854146

Estratégias de monorepo e gerenciamento de assets em larga escala

Conclusão

O levantamento quase sempre compensa, mas o valor real está em medir o impacto para seu contexto específico:

Cenários onde é essencial:

  • Repositórios usados por equipes grandes (>10 pessoas)
  • Storage >500MB com crescimento contínuo
  • Tempo de clone >2 minutos
  • Pipelines CI/CD lentos

Cenários onde avaliar custo-benefício:

  • Repositórios pequenos (<100MB) e isolados
  • Equipes reduzidas (<5 pessoas)
  • Binários necessários para compliance
  • Baixa frequência de operações Git

Abordagem recomendada:

  1. Piloto: escolher 1-2 repositórios críticos
  2. Medir: coletar métricas antes/depois
  3. Calcular ROI: tempo economizado × número de desenvolvedores
  4. Decidir: expandir política baseado em dados concretos

Próximos passos: Este embasamento teórico será complementado com dados reais do levantamento em andamento. A prova de conceito em repositório piloto permitirá validar as premissas aqui apresentadas e quantificar ganhos específicos para nosso contexto.


Sua experiência

Já passou por situação similar? Está considerando fazer um levantamento na sua empresa? Compartilhe nos comentários!


Tags: git devops productivity bestpractices tutorial

Top comments (0)