Vinte anos não são nada

O controle de versão evoluiu de sistemas centralizados e baseados em locks, como SourceSafe e CVS, para o modelo distribuído do Git, com histórico em toda parte, que muitos veem como um platô transformador, mas imperfeito. Os comentaristas comparam a velocidade e a robustez do Git com sua UX confusa, o mau tratamento de repositórios muito grandes ou com muitos binários e a falta de histórico semântico ou consciente de AST, apontando alternativas como Mercurial, Fossil, Pijul, jj e designs baseados em CRDT como tentativas de preencher essas lacunas. A conversa também destaca como escolhas de implementação (por exemplo, Rust vs. Python), padrões de fluxo de trabalho (rebase, commits empilhados) e plataformas de hospedagem (GitHub vs. self-hosted) moldam tanto a qualidade das ferramentas quanto a cultura de desenvolvimento.

Linguagens de implementação e “escrito em Rust”

  • Debate recorrente sobre por que projetos anunciam “escrito em Rust”.
  • Os defensores dizem que a escolha da linguagem sinaliza:
    • Segurança de memória e velocidade sem GC.
    • Binários estáticos e autocontidos, além de ferramentas fluídas.
    • Uma cultura de desenvolvimento que se importa com correção e desempenho.
  • Os céticos veem isso como marketing fraco: se “escrito em Rust” é a manchete, talvez haja pouco mais para diferenciar.
  • Alguns observam que a linguagem é preditiva do estilo do projeto e do encaixe no ecossistema (por exemplo, é mais fácil contribuir se você conhece Rust/Go do que Python).
  • Críticas a Python/JS por desempenho e estabilidade de longo prazo; Go é citado como semelhante ao Rust na distribuição, mas não nas garantias de tipo/propriedade.

Pijul, VCS baseado em patches e ideias de CRDT

  • Pijul e Fossil são destacados como verdadeiras alternativas ao Git, com designs diferentes; jj e Sapling são vistos mais como interfaces aprimoradas para Git/Mercurial.
  • O autor do Pijul explica:
    • O design é baseado em patch/CRDT; conflitos fazem parte do modelo.
    • As estruturas de dados foram projetadas “como teóricos”, depois otimizadas.
    • Um armazenamento customizado key–value em Rust (Sanakirja) permite armazenamento rápido, genérico, amigável a mmap e bifurcação eficiente, superando o LMDB nos testes deles.
    • Rust foi escolhido pragmaticamente pelo controle de baixo nível sem a dor de depuração do C++; hoje talvez escolheria Zig por causa da evolução da linguagem.
  • Alguns argumentam que VCS baseados em patches podem ser mais rápidos do que o Git baseado em snapshots para repositórios grandes, conflitos, blame e arquivos binários.

Pontos fortes, fracos e fluxos de trabalho do Git

  • Amplamente elogiado por:
    • Velocidade em comparação com ferramentas mais antigas.
    • Fluxo de trabalho distribuído e commits offline.
    • Flexibilidade e modelo de dados poderoso.
  • Críticas:
    • A UX do CLI é confusa; conceitos vazam a implementação interna.
    • Rebase, reescrita de histórico e fluxos com commits empilhados são difíceis; ferramentas como Gerrit/Graphite/jj tentam mitigar isso.
    • O Git armazena snapshots, não histórico explícito de mudanças; renomeações/divisões de arquivos e grandes refatorações são difíceis de rastrear.
    • Não há diretórios vazios; o histórico de divisões/fusões de arquivos e movimentos semânticos é fraco.
    • Git LFS é visto por alguns como frágil e operacionalmente complicado.

Centralização, tamanho do histórico e clones parciais

  • Debate sobre se clones locais com histórico completo eram “impensáveis” há 20 anos; alguns lembram de CVS/SVN junto com scripts locais e discos suficientemente grandes, enquanto outros enfatizam as limitações de rede e armazenamento da época.
  • O ponto de que DVCS implica um limite prático: o histórico do repositório precisa caber no menor laptop de desenvolvimento.
  • Alguns argumentam que a maioria das organizações é, de fato, centralizada e se beneficiaria de clones hierárquicos/subordinados: histórico parcial, árvores parciais, mas ainda com branching e commits locais.
  • Recursos mais recentes do Git como partial clone e sparse-checkout são mencionados como soluções parciais.

Ativos binários e projetos não textuais

  • O modelo centrado em texto do Git funciona bem para a maior parte do software, mas:
    • Jogos, design de chips e pipelines de mídia ainda preferem Perforce ou SVN devido a binários grandes.
    • Git LFS é criticado por ser bugado, operacionalmente complexo e exigir componentes extras de servidor.
    • Há desejo por um VCS que entenda nativamente formatos binários (por exemplo, diffs semânticos para imagens) e armazenamento de arquivos grandes; o Pijul afirma ter suporte binário nativo.

Futuros semânticos, com AST e baseados em CRDT

  • Vários comentaristas sugerem:
    • Controle de versão sobre ASTs ou estruturas específicas do domínio em vez de texto bruto.
    • Diffs/conflitos melhores que entendam movimentos, renomeações e refatorações.
  • Uma proposta: um sucessor do Git que armazene históricos em CRDT no nível de caractere, suportando colaboração em tempo real e commits semânticos; questões em aberto incluem como expor conflitos e como apagar dados (segredos).
  • Outros argumentam que essa granularidade pode adicionar ruído e complexidade; commits como pontos de verificação escolhidos por humanos continuam valiosos.

Ferramentas históricas e perspectiva

  • Muitas reminiscências de VSS, ClearCase, Perforce, CVS, SVN, RCS, BitKeeper e versionamento ad hoc com zip/tar.
  • Sistemas centralizados baseados em lock (VSS, algumas configurações de ClearCase/Perforce) são lembrados como dolorosos, embora já tenham sido considerados “profissionais”; fluxos de trabalho open source com CVS/SVN eram vistos como mais avançados do que os de muitas empresas.
  • A sensação geral é que cada geração achou suas ferramentas boas até que o próximo grande salto (SVN, depois Git/DVCS) expôs seus limites.

Algo vai substituir o Git?

  • Alguns acham que o Git é um platô evolutivo; sucessores precisariam de:
    • Compatibilidade total com Git e uso transparente em repositórios existentes.
    • UX mais simples e semântica melhor (renomeações, operações com AST, commits empilhados).
    • Melhor suporte a repositórios grandes e binários.
  • Outros esperam deslocamento eventual, citando a longa história de renovação dos VCS; ainda assim, os efeitos de rede do Git e seu status de “bom o suficiente” podem mantê-lo dominante por muito tempo.