O sistema de controle de versões Git 2.41 está disponível

Após três meses de desenvolvimento, a nova versão do sistema de controle de versões distribuído Git 2.41 foi lançada. O Git é um dos sistemas de controle de versões mais populares, confiáveis e de alto desempenho, oferecendo ferramentas flexíveis para desenvolvimento não linear, baseadas em ramificações e fusões. Para garantir a integridade do histórico e resistência a alterações 'retroativas', é utilizado o hashing implícito de todo o histórico anterior em cada commit, sendo possível também a verificação digital das assinaturas dos desenvolvedores para tags e commits individuais.

Em comparação com a versão anterior, a nova versão incorpora 542 alterações, preparadas com a participação de 95 desenvolvedores, dos quais 29 participaram do desenvolvimento pela primeira vez. As principais inovações são:

  • Melhorias na manipulação de objetos inatingíveis (unreachable), que não têm referências no repositório (não são referenciados por branches ou tags). Objetos inatingíveis são removidos pelo coletor de lixo, mas permanecem no repositório por um certo período antes da exclusão, para evitar condições de corrida. Para monitorar o período de permanência de objetos inatingíveis, é necessário vincular rótulos a eles com horário de modificação, o que impede o armazenamento em um único arquivo de pacotes, onde todos os objetos têm um horário de modificação comum. Anteriormente, cada objeto inatingível era salvo em um arquivo separado, o que causava problemas na presença de um grande número de objetos inatingíveis novos que ainda não estavam prontos para exclusão. Na nova versão, o mecanismo 'cruft packs' é utilizado por padrão para empacotar objetos inatingíveis, permitindo armazenar todos os objetos inatingíveis em um único arquivo de pacotes, enquanto os dados sobre o horário de modificação de cada objeto são refletidos em uma tabela separada, armazenada em um arquivo com a extensão '.mtimes' e vinculada por meio de um arquivo de índice com a extensão '.idx'.
    O sistema de controle de versões Git 2.41 está disponível
  • O gerenciamento de índice reverso (revindex) para arquivos pack está ativado por padrão. Ao testar no repositório torvalds/linux, a aplicação do índice reverso acelerou operações intensivas em recursos como «git push» em 1,49 vezes, e operações simples, como calcular o tamanho de um único objeto usando «git cat-file —batch=’%(objectsize:disk)'», em 77 vezes. Arquivos («.rev») com índice reverso serão armazenados dentro do repositório no diretório «.git/objects/pack».

    Lembramos que o Git armazena todos os dados na forma de objetos, que são colocados em arquivos separados. Para aumentar a eficiência do trabalho com o repositório, os objetos são colocados em arquivos pack, nos quais as informações são apresentadas na forma de uma sequência de objetos (um formato semelhante é usado na transmissão de objetos pelos comandos git fetch e git push). Para cada arquivo pack, um arquivo de índice (.idx) é criado, permitindo que, com a identificação do objeto, a posição no arquivo pack onde o dado objeto está armazenado seja determinada muito rapidamente.

    O índice reverso incluído na nova versão visa otimizar o processo de determinação do identificador do objeto com base nas informações sobre a localização do objeto no arquivo pack. Anteriormente, tal conversão era realizada em tempo real durante a análise do arquivo pack e era armazenada apenas na memória, o que não permitia reutilizar índices semelhantes e forçava a geração do índice sempre que era necessário. A operação de construção do índice se resume à criação de um array de pares «objeto-posição» e sua ordenação pela posição, o que pode levar muito tempo para grandes arquivos pack.

    Por exemplo, a operação de exibição do conteúdo dos objetos, na qual é utilizado o índice direto, foi executada 62 vezes mais rápido do que a operação de exibição do tamanho dos objetos, para a qual os dados de associações de posição com objeto não foram indexados. Após a utilização do índice reverso, essas operações passaram a levar aproximadamente o mesmo tempo. Índices reversos também permitem acelerar as operações de envio de objetos ao executar comandos fetch e push, devido à transmissão direta de dados já prontos a partir do disco.

    O sistema de controle de versões Git 2.41 está disponível
  • No protocolo "credential helper", utilizado para a transmissão de credenciais ao acessar repositórios com acesso restrito, foi adicionada a suporte à transmissão de cabeçalhos WWW-Authenticate entre o manipulador de credenciais e o serviço onde a autenticação ocorre. O suporte ao cabeçalho WWW-Authenticate permite a passagem de parâmetros scope do OAuth para um controle de acesso mais granular a repositórios e a delimitação das áreas disponíveis para solicitações.
  • No comando for-each-ref, foi adicionada a opção de formatação "%(ahead-behind:<base>)", permitindo que você obtenha rapidamente informações sobre o número de commits que estão presentes ou ausentes em um determinado branch em relação a outro branch (o quanto um branch está atrasado ou à frente do outro em termos de commits). Anteriormente, para obter essas informações, era necessário executar dois comandos separados: "git rev-list —count main..my-feature" para obter o número de commits exclusivos do branch e "git rev-list —count my-feature..main" para obter o número de commits ausentes. Agora, esses cálculos podem ser reduzidos a um único comando, o que simplifica a escrita de manipuladores e reduz o tempo de execução. Por exemplo, para mostrar branches não mesclados e avaliar o atraso ou a dianteira em relação à branch principal, você pode usar a seguinte linha única: $ git for-each-ref —no-merged=origin\/HEAD \ —format='%(refname:short) %(ahead-behind:origin\/HEAD)' \ refs\/heads\/tb\/ | column -t tb\/cruft-extra-tips 2 96 tb\/for-each-ref—exclude 16 96 tb\/roaring-bitmaps 47 3 em vez do script anteriormente utilizado, que é 17 vezes mais lento: $ git for-each-ref —format='%(refname:short)' —no-merged=origin\/HEAD \ refs\/heads\/tb | while read ref do ahead="$(git rev-list —count origin\/HEAD..$ref)" behind="$(git rev-list —count $ref..origin\/HEAD)" printf "%s %d %d\n" "%$ref" "%$ahead" "%$behind" done | column -t tb\/cruft-extra-tips 2 96 tb\/for-each-ref—exclude 16 96 tb\/roaring-bitmaps 47 3
  • No comando "git fetch" foi adicionada a opção "—porcelain", que, quando especificada, gera a saída no formato "<flag> <old-object-id> <new-object-id> <local-reference>", que é menos legível, mas mais conveniente para análise em scripts.
  • Foi adicionada a configuração "fetch.hideRefs", permitindo acelerar as operações de "git fetch" ao ocultar parte das referências no repositório local durante a verificação do envio de um conjunto completo de objetos pelo servidor, o que economiza tempo, limitando a verificação apenas aos servidores, dos quais os dados são extraídos diretamente. Por exemplo, ao realizar um teste em um sistema com repositórios que contêm um grande número de links externos rastreados, a exclusão de todos os links, exceto aqueles que apontam para o destino servidor $remote, permitiu reduzir a execução da operação «git fetch» de 20 minutos para 30 segundos. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • No comando «git fsck» foi implementada a possibilidade de verificar a corrupção, a conformidade das somas de verificação e a correção dos valores nos mapas de bits de disponibilidade e índices reversos.
  • No comando «git clone —local» foi implementada a saída de erro ao tentar copiar de um repositório que contém links simbólicos dentro do $GIT_DIR.

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