È stato pubblicato il rilascio del sistema distribuito di gestione del codice sorgente Git 2.48. Git è caratterizzato da alte prestazioni e offre strumenti per lo sviluppo non lineare basati su ramificazioni e fusioni. Per garantire l'integrità della cronologia e la resilienza ai cambiamenti retroattivi, utilizza l'hashing implicito dell'intera cronologia precedente in ogni commit, oltre a verifiche digitali tramite le firme degli sviluppatori su singoli tag e commit. Il codice di Git è distribuito sotto la licenza GPLv2+.
Rispetto alla versione precedente, nel nuovo rilascio sono stati introdotti 605 cambiamenti, realizzati con la partecipazione di 93 sviluppatori, di cui 35 partecipano per la prima volta allo sviluppo. Le principali novità includono:
- È stata implementata la possibilità di compilare utilizzando il sistema di build Meson, oltre a GNU Make e CMake. Per compilare Git ora si può utilizzare il comando "meson setup build && ninja -C build". Si segnala che il Makefile, utilizzato con GNU Make, è cresciuto fino a 3887 righe ed è più complesso del previsto. L'insieme di strumenti Meson semplifica il lavoro con il sistema di build, risulta conveniente per le compilazioni cross-platform e rende la compilazione più accessibile per i novizi o per gli sviluppatori senza esperienza con l'utility Make. Non è prevista la cessazione del supporto per Make e CMake nel prossimo futuro.
- Sono state aggiunte opzioni di build che consentono di utilizzare implementazioni alternative dell'hash SHA-1 nel calcolo dei checksum usati per verificare l'integrità dei blocchi dati nei file pack. Le prestazioni del calcolo dei checksum sono cruciali; ad esempio, si stima che il calcolo dei checksum durante il clone del repository del kernel Linux occupi circa il 78% del tempo della CPU. L'implementazione predefinita include controlli aggiuntivi per le collisioni e protezione contro attacchi a SHA-1, come SHAttered e Shambles. Tale protezione, che consuma risorse aggiuntive, ha senso solo quando si utilizza SHA-1 per scopi crittografici ed è inutile per la verifica dell'integrità dei dati indice.
Per la compilazione di Git con un'implementazione più rapida di SHA-1, non adatta per sistemi crittografici, è stata proposta una serie di opzioni *_UNSAFE, come "OPENSSL_SHA1_UNSAFE". Su GitHub, la compilazione con SHA-1 semplificato ha permesso di aumentare le prestazioni delle operazioni di estrazione e clonazione dei dati del 10-13%.
- È stata aggiunta la possibilità di utilizzare l'opzione "--remerge-diff" nel comando "range-diff", che consente di visualizzare le differenze tra il risultato complessivo della fusione e i dati effettivi rappresentati nel commit dopo l'elaborazione del comando "merge". Quando si utilizza l'opzione "--remerge-diff", le differenze nelle risoluzioni dei conflitti non vengono separate per ciascuna ramificazione genitore, ma mostrano le differenze complessive tra il file con conflitti di fusione e il file in cui i conflitti sono risolti. Nel contesto del comando "range-diff", la nuova opzione potrebbe risultare utile per confrontare insiemi di commit dopo aver spostato la sequenza dei commit tramite il comando "rebase" con l'opzione "--rebase-merges".
- È stata aggiunta la possibilità di eseguire l'insieme di test di Git attivando la modalità di rilevamento delle perdite di memoria. Poiché Git fornisce utility che terminano dopo aver completato la funzione chiamata, le perdite di memoria non sono state considerate un grande problema in passato. La necessità di eliminare completamente le perdite di memoria è emersa dopo l'inizio del lavoro per estrarre le funzionalità interne in una libreria separata, che può essere utilizzata in processi a lungo termine.
- È iniziata la formulazione di un elenco di modalità e funzionalità obsolete, il cui supporto è previsto per essere interrotto in futuro. Si prevede che la rimozione della funzionalità obsoleta avverrà nel rilascio di Git 3.0, che includerà modifiche che rompono la retrocompatibilità.
- È proseguita l'ottimizzazione del comando "git for-each-ref", che restituisce l'elenco dei riferimenti nel repository. L'ottimizzazione, che unisce i gestori per la filtrazione dei riferimenti e il formattamento dell'output, ora si applica non solo per l'output non ordinato, ma anche quando si specifica l'opzione "--sort".
- È stato migliorato l'implementazione del backend "reftable" con archiviazione a blocchi per una memorizzazione efficiente nel repository dei riferimenti a ramificazioni e tag. Reftable permette di velocizzare significativamente la ricerca, la lettura e la scrittura in repository con un numero molto elevato di riferimenti. Nella nuova versione, è cessato l'accesso ad alcune API ausiliarie per ulteriormente escludere la libreria libgit dalle dipendenze di build. È stata implementata una gestione adattiva degli errori restituiti dalle funzioni di allocazione della memoria (la mancanza di memoria ora non porta a crash). Le operazioni di creazione dei riferimenti sono state accelerate e il consumo di memoria ridotto.
- Nell'implementazione del clonazione parziale sono stati risolti i problemi che portavano a un ciclo infinito e a danni al repository dopo l'esecuzione del comando «git gc».
- Quando si esegue il comando «git fetch », se «refs/remotes//HEAD» non è presente nel sistema locale ma esiste un ramo a cui HEAD fa riferimento dall'altra parte, «refs/remotes//HEAD» ora punta a quel ramo. È stata aggiunta la configurazione remote..followRemoteHEAD per gestire la sincronizzazione di «refs/remotes//HEAD» con il valore HEAD dall'altra parte della connessione.
- È stata aggiunta la configurazione «remote..serverOption» simile all'opzione della riga di comando «—serverOption=».
- Nel comando «git rebase —rebase-merges» è stato garantito, ove possibile, l'uso dei nomi dei rami come etichette.
- È stato aggiunto il flag ‘-e’ ai comandi ‘git notes add’ e ‘git notes append’, che apre la nota in un editor di testo esterno specificato attraverso la variabile d'ambiente GIT_EDITOR.
- È stata migliorata la compatibilità con GCC 15 e lo standard C23.
- È stata interrotta la supporto per le versioni obsolete di libcURL e Perl.
Fonte: opennet.ru
