È stata rilasciata la versione 2.37 del sistema distribuito di gestione dei codici sorgente Git. Git è uno dei sistemi di versionamento più popolari, affidabili e performanti, offrendo strumenti flessibili per lo sviluppo non lineare basati su branching e merging. Per garantire l'integrità della cronologia e la resistenza alle modifiche retroattive, viene utilizzato un hashing implicito di tutta la cronologia precedente in ogni commit; è inoltre possibile la verifica tramite firme digitali degli sviluppatori per singoli tag e commit.
Rispetto alla versione precedente, la nuova versione introduce 395 modifiche, sviluppate da 75 sviluppatori, di cui 20 partecipano per la prima volta. Le principali novità sono:
- Il meccanismo degli indici parziali (sparse index) è stato reso pronto per l'uso generale, coprendo solo una parte del repository. Gli indici parziali consentono di migliorare le prestazioni e risparmiare spazio nei repository in cui vengono eseguite operazioni di clonazione parziale (sparse-checkout) o si lavora con una copia incompleta del repository. Nella nuova versione è stata completata l'integrazione degli indici parziali nei comandi «git show», «git sparse-checkout» e «git stash». Il miglioramento delle prestazioni più evidente dall'uso degli indici parziali si osserva nel comando «git stash», la cui velocità di esecuzione è aumentata fino all'80% in alcune situazioni.
- È stato implementato un nuovo meccanismo chiamato «cruft packs» per il packaging di oggetti irraggiungibili, per i quali non ci sono riferimenti nel repository (non sono referenziati da branch o tag). Gli oggetti irraggiungibili vengono rimossi dal garbage collector, ma rimangono nel repository per un certo periodo prima della loro eliminazione, per escludere stati di concorrenza. Per monitorare il tempo di presenza degli oggetti irraggiungibili è necessaria l'associazione di etichette con la data di modifica di tali oggetti, il che non consente di memorizzarli in un singolo file pack, dove tutti gli oggetti hanno un tempo di modifica comune. Il salvataggio di ogni oggetto in un file separato portava a problemi nel caso ci fossero molti oggetti irraggiungibili freschi, non ancora soggetti a eliminazione. Il meccanismo «cruft packs» proposto consente di memorizzare tutti gli oggetti irraggiungibili in un unico file pack, mentre i dati sulla data di modifica di ciascun oggetto sono registrati in una tabella separata, memorizzata in un file con estensione «.mtimes».
- Per Windows e macOS è stato implementato un meccanismo di monitoraggio delle modifiche nel file system, che consente di evitare di scansionare interamente la directory di lavoro durante operazioni come «git status». In precedenza, per monitorare le modifiche tramite hook si potevano utilizzare utility esterne di monitoraggio del file system, come Watchman, ma ciò richiedeva l'installazione di programmi aggiuntivi e configurazione. Ora questa funzionalità è integrata e può essere attivata con il comando «git config core.fsmonitor true».
- Nel comando «git sparse-checkout» è stata dichiarata obsoleta la supporto per la modalità alternativa «--cone» del metodo di definizione dei modelli per il clonaggio parziale, che consentiva di elencare file specifici utilizzando la sintassi di «.gitignore» per definire la parte del repository da clonare, il che non permette di ottimizzare con indici parziali.
- È stata aumentata la flessibilità nella configurazione della chiamata a fsync() per il salvataggio delle modifiche su disco. Nel parametro «core.fsyncMethod» è stata aggiunta la supporto per la strategia di sincronizzazione «batch», che consente di accelerare le operazioni di scrittura di un gran numero di file singoli accumulando le modifiche nella cache di scrittura, che possono essere replicate con una singola chiamata a fsync(). Un test condotto durante il quale sono stati aggiunti 500 file con il comando «git add» ha mostrato un completamento in 0.15 secondi con questa nuova modalità, mentre la chiamata a fsync() per ogni file richiedeva 1.88 secondi, e senza utilizzare fsync richiedeva 0.06 secondi.
- Nel comando di traversamento dei branch, come «git log» e «git rev-list», è stata aggiunta l'opzione «--since-as-filter=X», che consente di filtrare le informazioni sui commit le cui date di creazione sono anteriori a «X». A differenza dell'opzione «--since», il nuovo comando è implementato come filtro, senza interrompere il traversamento dopo il primo commit più vecchio del tempo specificato.
- Nel comando «git remote», quando si specifica il flag «-v», è stata garantita l'uscita delle informazioni relative ai clone parziali del repository.
- È stata aggiunta l'impostazione «transfer.credentialsInUrl», che può accettare i valori «warn», «die» e «allow». In caso di specifica nel parametro «remote..url» delle credenziali in testo chiaro, il tentativo di eseguire operazioni «fetch» o «push» verrà interrotto con un errore se l'impostazione «transfer.credentialsInUrl» assume valore «die», o con un avviso se impostata su «warn».
- Per impostazione predefinita è attuata una nuova implementazione della modalità interattiva del comando «git add -i», riscritta da Perl a C.
Fonte: opennet.ru
