Sistema de controle de origem Git 2.41 disponível

Após três meses de desenvolvimento, o sistema de controle de código-fonte distribuído Git 2.41 foi lançado. Git é um dos sistemas de controle de versão mais populares, confiáveis ​​e de alto desempenho, fornecendo ferramentas flexíveis de desenvolvimento não linear baseadas em ramificação e fusão. Para garantir a integridade do histórico e a resistência a mudanças retroativas, é utilizado hash implícito de todo o histórico anterior em cada commit; também é possível certificar tags individuais e commits com assinaturas digitais dos desenvolvedores.

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

  • Tratamento aprimorado de objetos inacessíveis que não são referenciados no repositório (não referenciados por ramificações ou tags). Objetos inacessíveis são excluídos pelo coletor de lixo, mas permanecem no repositório por um certo tempo antes de serem excluídos para evitar condições de corrida. Para rastrear o período de ocorrência de objetos inacessíveis, é necessário anexar tags a eles com o horário de alteração de objetos semelhantes, o que não permite armazená-los em um arquivo pack no qual todos os objetos possuem um horário de alteração comum. Anteriormente, cada objeto inacessível era armazenado em um arquivo separado, o que gerava problemas quando havia um grande número de objetos inacessíveis novos que ainda não eram elegíveis para exclusão. Na nova versão, o mecanismo “cruft packs” é usado por padrão para empacotar objetos inacessíveis, o que permite armazenar todos os objetos inacessíveis em um arquivo de pacote, e os dados sobre o horário de modificação de cada objeto são refletidos em uma tabela separada, armazenada em um arquivo com extensão “.mtimes” e vinculado por meio de um arquivo de índice com extensão “.idx”.
    Sistema de controle de origem Git 2.41 disponível
  • A manutenção de um índice reverso no disco para arquivos de pacote está habilitada por padrão. Ao testar no repositório torvalds/linux, o uso de um índice reverso tornou possível acelerar em 1.49 vezes as operações “git push” que consomem muitos recursos e operações simples, como calcular o tamanho de um único objeto usando “git cat- file —batch='%(objectsize:disk)' "77 vezes. Arquivos (“.rev”) com índice reverso serão armazenados dentro do repositório no diretório “.git/objects/pack”.

    Lembre-se de que o Git armazena todos os dados na forma de objetos, localizados em arquivos separados. Para aumentar a eficiência do trabalho com o repositório, os objetos são colocados adicionalmente em arquivos pack, nos quais as informações são apresentadas na forma de um fluxo de objetos um após o outro (um formato semelhante é usado ao transferir objetos com git fetch e git push comandos). Para cada arquivo de pacote, um arquivo de índice (.idx) é criado, o que permite determinar rapidamente o deslocamento no arquivo de pacote no qual um determinado objeto é armazenado usando o identificador de objeto.

    O índice reverso incluído na nova versão visa otimizar o processo de determinação do identificador do objeto a partir de informações sobre o posicionamento do objeto no arquivo pack. Anteriormente, essa 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 a reutilização de índices semelhantes e forçava a geração do índice a cada vez. A operação de construção de um índice se resume a construir uma matriz de pares objeto-posição e classificá-la por posição, o que pode levar muito tempo para arquivos de pacote grandes.

    Por exemplo, uma operação para exibir o conteúdo de objetos, que utiliza um índice direto, foi 62 vezes mais rápida do que uma operação para exibir o tamanho de objetos, para os quais os dados da posição do objeto não foram indexados. Depois de usar o índice reverso, essas operações começaram a durar aproximadamente o mesmo tempo. Os índices reversos também permitem acelerar as operações de envio de objetos ao executar comandos fetch e push, transferindo diretamente dados prontos do disco.

    Sistema de controle de origem Git 2.41 disponível

  • O protocolo “credential helper”, usado para transferir credenciais ao acessar repositórios com acesso limitado, adicionou suporte para passagem de cabeçalhos WWW-Authenticate entre o manipulador de credenciais e o serviço no qual a autenticação é realizada. O suporte ao cabeçalho WWW-Authenticate permite passar parâmetros de escopo OAuth para uma separação mais granular do acesso do usuário aos repositórios e delimitação dos escopos disponíveis para solicitações.
  • Adicionada opção de formatação "%(ahead-behind:" ao comando for-each-ref: )”, que permite obter imediatamente informações sobre o número de commits presentes ou ausentes em um determinado branch, em relação a outro branch (quanto um branch está atrás ou à frente de outro no nível de commit). Anteriormente, para obter essas informações, você precisava 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 ramificações que não foram mescladas e avaliar se estão atrás ou à frente da ramificação principal, você pode usar uma linha: $ git for-each-ref —no-merged=origin/HEAD \ —format ='%(refname:short) %(ahead-behind :origin/HEAD)' \refs/heads/tb/ | coluna -t tb/cruft-extra-tips 2 96 tb/for-each-ref — exclui 16 96 tb/roaring-bitmaps 47 3 em vez do script usado anteriormente, que roda 17 vezes mais devagar: $ 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" concluído | coluna -t tb/cruft-extra-tips 2 96 tb/for-each-ref — excluir 16 96 tb/roaring-bitmaps 47 3
  • A opção “-porcelain” foi adicionada ao comando “git fetch”, quando especificada, a saída é gerada no formato “ ", menos legível, mas mais conveniente para análise em scripts.
  • Adicionada a configuração “fetch.hideRefs”, que permite agilizar as operações “git fetch” ocultando algumas das referências no repositório local na fase de verificação de que o servidor enviou um conjunto completo de objetos, o que economiza tempo ao limitar a verificação apenas aos servidores dos quais os dados são recuperados diretamente. Por exemplo, ao executar um teste em um sistema com repositórios contendo um grande número de links externos rastreados, a exclusão de todos os links, exceto aqueles endereçados ao servidor de destino, $remote reduziu 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
  • O comando "git fsck" fornece a capacidade de verificar se há corrupção, conformidade de soma de verificação e correção de valores em bitmaps de acessibilidade e índices reversos.
  • O comando "git clone --local" agora exibe um erro ao tentar copiar de um repositório que contém links simbólicos dentro de $GIT_DIR.

Fonte: opennet.ru

Adicionar um comentário