È stato pubblicato il rilascio del sistema distribuito di gestione del codice sorgente Git 2.48. Git si distingue per le sue elevate prestazioni e fornisce strumenti per lo sviluppo non lineare, basati sulla ramificazione e sul merging dei rami. Per garantire l'integrità della cronologia e la resilienza alle modifiche retroattive, viene utilizzato l'hashing implicito dell'intera cronologia precedente in ogni commit, oltre all'autenticazione tramite firme digitali degli sviluppatori su singoli tag e commit. Il codice di Git è distribuito sotto la licenza GPLv2+.
Rispetto alla versione precedente, nella nuova versione sono stati inclusi 605 cambiamenti, preparati con la partecipazione di 93 sviluppatori, 35 dei quali partecipano per la prima volta allo sviluppo. Le novità principali includono:
- È stata implementata la possibilità di compilare utilizzando il sistema di build Meson, oltre a GNU Make e CMake. Per la compilazione di Git, ora è possibile 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 di quanto si vorrebbe. Il toolkit Meson semplifica il lavoro con il sistema di build, è comodo per compilazioni cross-platform e rende la compilazione più accessibile per i nuovi arrivati o per gli sviluppatori privi di esperienza con l'utilità Make. Non è previsto di interrompere il supporto per Make e CMake nel prossimo futuro.
- Sono state aggiunte opzioni di compilazione che consentono di utilizzare implementazioni alternative dell'hash SHA-1 durante il calcolo delle somme di controllo utilizzate per verificare l'integrità dei blocchi di dati nei file pack. Le prestazioni del calcolo delle somme di controllo sono molto importanti; ad esempio, circa il 78% del tempo di CPU viene speso nella loro computazione durante il cloning di un repository con il kernel Linux. L'implementazione predefinita include controlli aggiuntivi sulle collisioni e protezione contro attacchi su 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 indicizzati.
Per compilare Git con un'implementazione SHA-1 più rapida, non idonea 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 nel comando «range-diff» l'opzione «—remerge-diff», che consente di mostrare le differenze tra il risultato complessivo di una fusione e i dati effettivi registrati nel commit dopo l'esecuzione del comando «merge». Utilizzando l'opzione «—remerge-diff», le differenze tra le risoluzioni dei conflitti non vengono separate per ciascun ramo genitore, ma vengono mostrate le differenze complessive tra il file con i conflitti di fusione e il file in cui i conflitti sono stati risolti. Nel contesto del comando «range-diff», la nuova opzione può rivelarsi utile per confrontare insiemi di commit dopo il trasferimento della sequenza di commit tramite il comando «rebase» con l'opzione «—rebase-merges».
- È stata introdotta la possibilità di eseguire un set di test Git attivando la modalità di rilevamento delle perdite di memoria. Poiché Git fornisce utilità che terminano l'esecuzione dopo la chiamata della funzione, le perdite di memoria non sono state considerate un grande problema in passato. La necessità di eliminare completamente le perdite di memoria è diventata rilevante 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 creazione di un elenco di modalità e funzionalità obsolete, il cui supporto è previsto per essere interrotto in futuro. Si prevede che la rimozione delle funzionalità obsolete avverrà nella versione Git 3.0, che includerà modifiche che violano la compatibilità all'indietro.
- Continua l'ottimizzazione del comando «git for-each-ref», che restituisce un elenco dei riferimenti nel repository. L'ottimizzazione, che unisce i gestori per il filtraggio dei riferimenti e la formattazione dell'output, ora è applicabile non solo per l'output non ordinato, ma anche quando si specifica l'opzione «—sort».
- È stata migliorata l'implementazione del backend "reftable" con uno storage a blocchi per un'efficace archiviazione nel repository dei riferimenti a rami e tag. Reftable consente di accelerare notevolmente la ricerca, la lettura e la scrittura in repository con un numero molto elevato di riferimenti. Nella nuova versione è stata interrotta la connessione ad alcune API ausiliarie per escludere ulteriormente la libreria libgit dalle dipendenze di compilazione. È stata implementata un'elaborazione adattiva degli errori restituiti dalle funzioni di allocazione della memoria (la mancanza di memoria ora non porta a un arresto anomalo). Sono state accelerate le operazioni di creazione di riferimenti e ridotto il consumo di memoria.
- Nell'implementazione del cloning parziale sono stati risolti i problemi che portavano a cicli infiniti e alla corruzione del repository dopo aver eseguito il comando "git gc".
- Quando si esegue il comando "git fetch ", in assenza di "refs/remotes//HEAD" sul sistema locale e in presenza dall'altro lato di un ramo a cui fa riferimento HEAD, "refs/remotes//HEAD" ora viene reindirizzato a quel ramo. Per gestire la sincronizzazione di "refs/remotes//HEAD" con il valore HEAD dall'altra parte della connessione è stata aggiunta l'impostazione remote..followRemoteHEAD.
- È stata aggiunta l'impostazione "remote..serverOption" simile all'opzione della riga di comando "--serverOption=".
- Nel comando "git rebase --rebase-merges", è stato garantito, quando possibile, l'uso dei nomi dei rami come etichette.
- Nel comando 'git notes add' e 'git notes append' è stato aggiunto il flag '-e', che apre la nota in un editor di testo esterno specificato tramite la variabile d'ambiente GIT_EDITOR.
- È stata migliorata la compatibilità con GCC 15 e lo standard C23.
- È stato interrotto il supporto per le vecchie versioni di libcURL e Perl.
Fonte: opennet.ru
