Lançamento do sistema de controle de versões Git 2.51

Após dois meses de desenvolvimento, foi lançado o release do sistema distribuído de controle de versões Git 2.51. O Git se destaca pela alta performance e oferece ferramentas para desenvolvimento não linear, baseado em ramificações e mesclagens de branches. Para garantir a integridade do histórico e a resistência a alterações retroativas, utiliza-se o hash implícito de todo o histórico anterior em cada commit, além da autenticação por meio de assinaturas digitais dos desenvolvedores em tags e commits individuais. O código do Git é distribuído sob a licença GPLv2+.

Comparado ao lançamento anterior, a nova versão inclui 506 alterações, preparadas com a participação de 91 desenvolvedores (21 deles participaram do desenvolvimento do Git pela primeira vez). As principais novidades (1, 2, 3):

  • A performance dos comandos "git push" e "git fetch" foi aumentada em repositórios com um grande número de referências. O aumento de velocidade foi alcançado através da atualização das referências em modo de pacote, onde várias referências são processadas em uma única transação, em vez de criar uma transação separada para atualizar cada referência. A otimização aumentou significativamente a velocidade do backend "reftable", que agora supera o backend "files" em performance. Por exemplo, em um repositório de teste com 10 mil referências, a performance do "git fetch" usando o backend "reftable" aumentou 22 vezes, enquanto o backend "files" aumentou apenas 1,25 vezes. Para o "git push", o aumento foi de 18 e 1,21 vezes, respectivamente.
  • Um novo método de empacotamento em arquivos pack de partes do repositório, não relacionadas ao rastreamento de objetos inalcançáveis, foi proposto. Esses objetos inalcançáveis não têm referências no repositório (não são referenciados por branches ou tags). As informações sobre objetos inalcançáveis são armazenadas em arquivos pack separados ("cruft packs"), o que levava à necessidade de suas representações em índices de múltiplos pacotes MIDX (multi-pack index), a fim de abranger objetos que originalmente eram inalcançáveis e estavam armazenados apenas no pack de cruft, mas que se tornaram alcançáveis após o commit que os referencia.

    Na nova versão, ao reempacotar arquivos pack, foi garantida a preservação de cópias adicionais de objetos alcançáveis, armazenados apenas em arquivos cruft. Essa mudança assegura que o conjunto de arquivos pack usados para armazenar objetos alcançáveis não contenha objetos que referenciam outros objetos armazenados fora desse conjunto. Para excluir conteúdos inalcançáveis de arquivos cruft dos índices multi-pack (MIDX), foi proposta a configuração "repack.MIDXMustContainCruft", que permite reduzir significativamente o tamanho desses índices. A habilitação dessa configuração no repositório GitHub resultou em uma redução de 38% no tamanho dos índices MIDX, um aumento de 35% na velocidade de gravação nos índices MIDX e uma melhoria de 5% na performance de leitura.

  • Foi adicionada à equipe «git pack-objects» a opção «—path-walk», que inclui um novo método para coletar informações sobre objetos ao reempacotar arquivos pack. Em vez de percorrer objetos na ordem das revisões, ao usar o modo «—path-walk», os objetos são percorridos através dos caminhos dos arquivos, permitindo a embalagem de todos os objetos com o mesmo caminho de arquivo de uma só vez. Essa abordagem possibilita eliminar a heurística que utiliza hash para determinar a relação de um objeto com seu caminho de arquivo, além de dispensar a ordenação dos objetos antes da embalagem. Ao usar o modo «—path-walk», o tamanho dos arquivos pack gerados é significativamente menor do que ao agrupar objetos por meio de hashes.
  • Foi definido um formato para a troca de estados salvos da árvore de trabalho e dos índices em um repositório, criados usando o comando «git stash». O novo formato permite codificar as alterações salvas (entradas stash) como uma sequência de commits. Para importação e exportação, foram propostas as subcomandos «git stash import» e «git stash export», que podem ser usados para transferir estados salvos de um sistema para outro e realizar operações de push ou pull com esses estados como se fossem branches ou tags normais. git stash export —to-ref refs/stashes/my-stash git push origin refs/stashes/my-stash … git fetch origin ‘+refs/stashes/*:refs/stashes/*’ git stash import refs/stashes/my-stash
  • Na equipe «git cat-file», que exibe o conteúdo de objetos especificados, foram implementadas opções «—batch» e «—batch-check» para mostrar informações sobre objetos ausentes (por exemplo, devido a danos no repositório) e submódulos. Anteriormente, ao especificar o caminho de um submódulo, o comando «git cat-file —batch-check» mostrava «missing», mas agora exibirá o identificador do objeto.
  • No comando «git log», foram implementadas otimizações baseadas em filtros de Bloom para acelerar a busca no histórico de alterações ao especificar filtros com vários caminhos de arquivos, como «git log — path/to/a path/to/b».
  • Os comandos «git switch» e «git restore» foram estabilizados, tendo sido considerados experimentais desde 2019. Os comandos são apresentados como equivalentes modernos ao «git checkout», separando funcionalidades pouco relacionadas, como manipulação de branches (alternar e criar) e restauração de arquivos no diretório de trabalho.
  • O comando «git whatchanged», equivalente ao «git log —raw», foi declarado obsoleto e está programado para remoção na versão 3.0 do Git.
  • Foi adicionada a opção «—start-after» ao comando «git for-each-ref», que pode ser usada junto com a opção «—count» para facilitar a saída paginada.
  • As opções «—compact-summary» foram adicionadas aos comandos «git merge» e «git pull» para utilizar um formato compacto de resumo de informações sobre alterações em vez do formato diffstat.
  • O uso da palavra-chave «bool», introduzida no padrão C99, foi permitido na base de código do Git. Também foram documentadas algumas funcionalidades do C99, utilizadas experimentalmente no Git (como a permissão de usar construções como «(struct foo){ .member = value };» a partir de meados de 2026). A compilação com suporte ao C99 é obrigatória para o Git desde 2021, mas as funcionalidades do C99 estão sendo implementadas com extrema cautela para manter a compatibilidade com compiladores que suportam parcialmente esse padrão.
  • Foram feitas alterações nas regras de aceitação de patches, permitindo o envio de patches sob pseudônimos, e não apenas sob o nome real do desenvolvedor. A mudança está de acordo com as regras de aceitação de patches do kernel Linux.
  • A lista de alterações incompatíveis foi atualizada e será aplicada na ramificação Git 3.0. Entre as mudanças significativas da próxima versão Git 3.0, destaca-se a adoção, por padrão, de identificadores de objetos baseados no algoritmo de hash SHA-256 ao inicializar novos repositórios, além da utilização do formato ‘reftable’ para armazenar no repositório referências a branches e tags (implementando o armazenamento em bloco do projeto JGit, otimizado para o armazenamento de um número muito grande de referências).

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster