Após três meses de desenvolvimento, foi lançado o sistema de gerenciamento de código-fonte distribuído Git 2.52. O Git se destaca pela alta performance e oferece recursos para desenvolvimento não linear, baseando-se em ramificações e fusões de branches. Para garantir a integridade do histórico e a resistência a mudanças retroativas, utiliza-se um hash implícito de todo o histórico anterior em cada commit, assim como a autenticação digital por meio das assinaturas dos desenvolvedores em tags e commits específicos. O código do Git é distribuído sob a licença GPLv2+.
Em comparação com a versão anterior, 637 alterações foram incorporadas nesta nova versão, com a participação de 94 desenvolvedores (33 deles participaram do desenvolvimento do Git pela primeira vez). As principais novidades (1, 2, 3):
- Foi adicionada o comando "git last-modified" para exibir uma lista de arquivos em uma revisão específica e os commits que trouxeram as últimas alterações a cada um desses arquivos. $ git last-modified HEAD b56f6dcd7b4c90192018e848d0810f091d092913 test.h 29330ae4b820147c98e723399e9438c8bee60a8a test1.c 573ad8917beb99dc643b6e7f5c117a294384a575 test2.c
- Foi adicionado o comando "git repo" para realizar ações relacionadas à extração de informações do repositório. Duas subcomandos foram sugeridos — "git repo info" e "git repo structure", que mostram informações sobre as configurações do repositório e detalhes sobre a estrutura do repositório (por exemplo, o número de referências e objetos no repositório). $ git repo info object.format references.format object.format=sha1 references.format=reftable $ git repo structure | Estrutura do repositório | Valor | | ——————— | —— | | * Referências | | | * Contagem | 1983 | | * Branches | 4 | | * Tags | 1125 | | * Remotos | 854 | | * Outros | 0 | | | | | * Objetos acessíveis | | | * Contagem | 518955 | | * Commits | 77469 | | * Trees | 188865 | | * Blobs | 251631 | | * Tags | 990 |
- Na equipe do "git refs" foram adicionadas três subcomandos que unificam operações de baixo nível dispares e sobrepostas nas referências (git for-each-ref, git show-ref, git update-ref e git pack-refs):
- "git refs optimize" — otimização do backend de armazenamento de referências (semelhante ao "git pack-refs").
- "git refs list" — exibe uma lista de todas as referências (semelhante ao "git for-each-ref" ou "git show-ref").
- "git refs exists" — verifica a existência de uma referência (equivalente ao "git show-ref --exists").
- O formato para exportação ou importação do histórico de commits foi ampliado com a capacidade de trabalhar com assinaturas criptográficas, utilizando tanto identificadores de objetos baseados no algoritmo SHA-1 quanto no SHA-256. Na equipe "git fast-import", foi implementado suporte ao processamento de tags assinadas, de forma semelhante aos commits assinados. Foram adicionadas as opções "—signed-commits=" e "—signed-tags=" para gerenciar o processamento de commits e tags assinadas durante a importação (o modo pode assumir os valores verbatim, warn-verbatim, warn-stri, strip ou abort).
- A equipe "git maintenance" agora suporta uma nova estratégia "geometric" ("git config set maintenance.strategy geometric"), permitindo reduzir o tempo de manutenção de grandes monorepositórios. Em comparação com a estratégia anterior, que usava a lógica da equipe "git gc", a nova estratégia evita a reempacotamento de todos os objetos e exclui operações excessivamente intensivas em recursos, como a mesclagem de todos os arquivos pack (quando possível, a fusão é feita em partes e sem limpeza de objetos removidos).
- Foi adicionada a equipe "git sparse-checkout clean" para simplificar a restauração do estado do diretório de trabalho, removendo arquivos que não correspondem à nova definição de sparse-checkout e que não devem estar presentes na cópia local de acordo com as configurações atuais de sparse-checkout.
- Para eliminar complexidades do código e simplificar a manutenção, foi realizado um refatoramento para reduzir o uso da variável global the_repository.
- A aplicação de filtros de Bloom foi ampliada, uma estrutura probabilística para verificar a pertença a um conjunto, que permite a falsa determinação de que um elemento ausente está presente, mas exclui a omissão de um elemento existente. Os filtros de Bloom agora são usados para acelerar a busca no histórico de mudanças ao especificar máscaras em caminhos de arquivos, por exemplo, "foo/bar/*/baz".
- O desempenho do comando "git describe" foi aumentado em até 30%, graças ao uso de fila de prioridade. No "git remote rename", as operações de renomeação de referências foram aceleradas. No "git ls-files", a aplicação de índices foi expandida. O desempenho do comando "git log -L" foi notavelmente acelerado, eliminando comparações trifásicas excessivas durante o processamento de fusão de commits. Foram feitas otimizações na biblioteca xdiff.
- Foi fornecida a opção opcional de usar implementações em Rust para algumas funções internas, como a codificação e decodificação de valores inteiros de comprimento variável. Por padrão, o código Rust não é utilizado e sua ativação requer a indicação da flag de construção WITH_RUST. No futuro, espera-se uma reescrita em Rust de componentes internos mais significativos do Git e a adição do Rust como uma dependência obrigatória de construção no Git 3.0.
- A lista de alterações incompatíveis foi atualizada, que serão aplicadas na ramificação Git 3.0. No Git 3.0, a configuração init.defaultBranch será alterada por padrão para o valor 'main', ou seja, em repositórios criados com o comando 'git init', a branch padrão será nomeada 'main', e não 'master'. Também se observa a transição padrão para identificadores de objetos com base no algoritmo de hashing SHA-256 ao inicializar novos repositórios. Para simplificar a portabilidade entre repositórios com identificadores de objetos baseados nos hashes SHA-1 e SHA-256, foi criada a possibilidade de executar operações de push e pull em um repositório que utiliza um algoritmo de hashing diferente.
Fonte: opennet.ru
