Engenheiro da Microsoft detecta falha no Git que provoca “inchaço” em repositórios grandes
Segundo Jonathan Creamer, o problema ocorre no cálculo de diferenças entre versões de arquivos, que acaba gerando um aumento significativo no tamanho dos repositórios e comprometendo o desempenho em operações essenciais. Esse problema é especialmente crítico em repositórios monolíticos (ou “monorepos”) de grande porte, onde o alto consumo de espaço e a lentidão afetam a produtividade dos desenvolvedores.
A equipe de Creamer trabalha com um monorepo que concentra múltiplos projetos interligados em um único local, totalizando mais de 20 milhões de linhas de código e sendo utilizado por mais de 1.000 desenvolvedores mensalmente. Ao clonar esse repositório, o tamanho atingiu 178 GB, muito além do esperado. Esse tipo de problema se agrava em monorepos, onde arquivos duplicados ou com nomes semelhantes em diferentes pacotes são comuns. A falha foi atribuída ao fato de o Git confundir arquivos com o mesmo nome, como “CHANGELOG.md”, em diferentes pacotes, levando-o a interpretar mudanças triviais como substanciais, o que aumenta desnecessariamente o tamanho do repositório.
Para mitigar esse problema, foi proposta a “Path Walk API”, uma solução que organiza os objetos de acordo com o caminho completo dos arquivos, evitando colisões de nomes. Essa API modifica o tratamento que o Git dá a arquivos com nomes idênticos em diretórios diferentes, eliminando comparações incorretas que causavam o “inchaço” dos repositórios. A solução foi submetida como um pull request que introduz o comando git repack com o argumento --path-walk, reorganizando os arquivos e reduzindo drasticamente o tamanho do repositório. No caso do repositório de Creamer, essa modificação diminuiu o consumo de espaço de 178 GB para apenas 5 GB.
O problema foi identificado no algoritmo de “name-hash” do Git, que considerava apenas os últimos 16 caracteres do caminho dos arquivos, resultando em colisões frequentes. Em um exemplo específico, dos 100 maiores arquivos no disco, 99 eram “CHANGELOG.json” e “CHANGELOG.md”, cuja leitura incorreta de alterações gerava arquivos de até 60 MB, em vez de pequenas atualizações de poucos kilobytes.