Dominando a Coleta de Lixo do Git para Desempenho Máximo
Aprenda quando executar git gc, o que ele limpa e como evitar uma limpeza agressiva arriscada em repositórios ativos.
Dominando a Coleta de Lixo do Git para Desempenho Máximo
A coleta de lixo do Git impede que seu repositório acumule objetos soltos, commits inalcançáveis obsoletos e arquivos de pacote ineficientes para sempre. Se seu repositório parece lento, ocupa muito espaço em disco ou passou por muitas rebases e limpezas de ramos, git gc é uma das primeiras ferramentas de manutenção a entender.
Você geralmente não precisa executá-lo todos os dias. O Git executa manutenção automática durante comandos normais quando certos limites são atingidos. Ainda assim, saber o que ele faz ajuda a evitar dois erros comuns: ignorar um repositório inchado por meses ou executar uma limpeza agressiva em um repositório compartilhado sem entender o impacto.
O que a Coleta de Lixo do Git Faz
O Git armazena dados como objetos: commits, árvores, blobs e tags. Novos objetos podem começar como arquivos soltos em .git/objects/. Com o tempo, o Git pode empacotar muitos objetos juntos em arquivos de pacote compactos. Objetos empacotados usam o disco de forma mais eficiente e geralmente são mais rápidos para o Git escanear.
git gc realiza várias tarefas de manutenção, incluindo:
- Empacotar objetos soltos em arquivos de pacote.
- Consolidar arquivos de pacote existentes quando útil.
- Remover objetos inalcançáveis que são antigos o suficiente para serem podados.
- Limpar arquivos temporários deixados por operações interrompidas.
- Atualizar dados auxiliares, como arquivos de grafo de commits em configurações modernas do Git, quando configurado.
Inalcançável nem sempre significa seguro para deletar imediatamente. Um commit pode se tornar inalcançável após um rebase, amend, reset ou ramo deletado. O Git normalmente mantém objetos recentemente inalcançáveis por um período de carência para que você tenha tempo de recuperá-los com git reflog.
Verifique o Tamanho do Repositório Antes de Limpar
Comece medindo o repositório em vez de adivinhar:
git count-objects -vH
Campos úteis incluem count, size, in-pack, packs e size-pack. Uma alta contagem de objetos soltos pode tornar as operações diárias do Git mais lentas. Um size-pack grande pode simplesmente significar que o repositório tem muito histórico real, arquivos binários grandes ou ativos de fornecedores.
Para inspecionar o uso do disco diretamente, execute:
du -sh .git
Se .git é enorme porque alguém cometeu artefatos de build ou arquivos grandes, a coleta de lixo sozinha pode não resolver o problema real. Você pode precisar remover arquivos grandes de commits futuros, movê-los para Git LFS ou reescrever o histórico com uma ferramenta como git filter-repo após coordenar com a equipe.
Execute a Coleta de Lixo Normal
Para limpeza de rotina, use:
git gc
Este é o padrão seguro. Ele permite que o Git decida qual trabalho de manutenção vale a pena e respeita as regras normais de poda.
Você pode pedir ao Git para fazer manutenção automática apenas se os limites disserem que é necessário:
git gc --auto
A maioria dos usuários não precisa chamar --auto manualmente porque o Git já faz isso nos bastidores. Ainda é útil em scripts onde você quer uma passagem de limpeza de baixo custo sem forçar um reempacotamento completo toda vez.
Se você quiser remover objetos inalcançáveis antigos usando o período de carência padrão, execute:
git gc --prune=now
Use --prune=now com cuidado. Ele pode remover pontos de recuperação que git reflog poderia ajudar a encontrar. Evite-o logo após um rebase complicado, exclusão de ramo ou reset, a menos que você tenha certeza de que não precisa dos objetos antigos.
Cuidado com --aggressive
git gc --aggressive diz ao Git para gastar mais tempo de CPU tentando otimizar o empacotamento de objetos:
git gc --aggressive
Não é um botão mágico de velocidade. Em muitos repositórios, o trabalho extra dá pouco benefício em comparação com git gc normal, e pode levar muito tempo em históricos grandes. Use-o apenas quando você mediu um problema real de tamanho ou desempenho do repositório e pode arcar com a janela de manutenção.
Para o trabalho do dia a dia, prefira git gc simples. Se seu repositório precisa regularmente de limpeza agressiva, o problema mais profundo geralmente são arquivos grandes, artefatos gerados ou um fluxo de trabalho que cria muito histórico inalcançável.
Use Manutenção Moderna do Git para Cuidados Contínuos
Versões recentes do Git incluem git maintenance, que pode agendar tarefas em segundo plano como pré-busca, atualizações de grafo de commits e reempacotamento incremental, dependendo da sua plataforma e configuração.
Para executar manutenção uma vez:
git maintenance run
Para habilitar manutenção agendada para sua conta de usuário:
git maintenance start
Verifique sua versão do Git e documentação local antes de confiar na manutenção agendada em automação, porque a integração exata do agendador difere por sistema operacional e compilação do Git.
Fluxo de Trabalho Prático de Limpeza
Um fluxo de limpeza seguro para um repositório local parece com isso:
git status
git count-objects -vH
git gc
git count-objects -vH
Certifique-se de que sua árvore de trabalho está limpa antes da manutenção. O Git pode executar coleta de lixo com alterações locais presentes, mas uma árvore limpa remove dúvidas se você precisar solucionar problemas depois.
Para um repositório bare compartilhado em um servidor, agende a manutenção durante um período de baixa atividade. Evite executar reempacotamentos pesados durante picos de atividade de CI, porque operações de clone, fetch e push podem competir por disco e CPU.
Quando a Coleta de Lixo Não Ajudará
A coleta de lixo não pode consertar todos os repositórios Git lentos. Ela não removerá arquivos que ainda estão acessíveis no histórico. Não tornará um monorepo pequeno se o histórico ativo contém genuinamente anos de ativos grandes. Não reparará um repositório corrompido por si só.
Se o desempenho ainda for ruim após a limpeza normal, procure estas causas:
- Arquivos binários grandes cometidos diretamente no Git.
- Muitos arquivos gerados rastreados no repositório.
- Antivírus ou indexação do sistema de arquivos escaneando
.gitem toda operação. - Armazenamento de rede lento hospedando a árvore de trabalho.
- Árvores de trabalho muito grandes onde checkout esparso pode ajudar.
Use git gc como manutenção, não como substituto para higiene do repositório. Execute limpeza normal quando as contagens de objetos crescerem, evite limpeza agressiva a menos que você tenha medido uma necessidade, e trate artefatos grandes rastreados como um problema de fluxo de trabalho para corrigir na fonte.