Dopo tre mesi di sviluppo è stata pubblicata la nuova versione del sistema distribuito di gestione dei codici sorgente Git 2.36. Git è uno dei sistemi di gestione delle versioni più popolari, affidabili e performanti, fornendo strumenti flessibili per lo sviluppo non lineare, basati su ramificazioni e fusioni. Per garantire l'integrità della cronologia e la resilienza alle modifiche retroattive, si utilizza un hashing implicito dell'intera cronologia precedente in ogni commit; è anche possibile la verifica tramite firme digitali degli sviluppatori su singoli tag e commit.
Rispetto alla versione precedente, nella nuova versione sono stati introdotti 717 cambiamenti, preparati con la partecipazione di 96 sviluppatori, di cui 26 hanno partecipato per la prima volta allo sviluppo. Le principali novità sono:
- Nelle comandi "git log" e "git show" è stata aggiunta l'opzione "—remerge-diff", che consente di mostrare le differenze tra il risultato complessivo della fusione e i dati effettivi, riflessi nel commit dopo l'elaborazione del comando "merge". Questo permette di valutare visivamente le modifiche apportate a seguito della risoluzione dei conflitti durante la fusione. Il comando "git show" solitamente separa le diverse risoluzioni dei conflitti con una rientranza, il che rende difficile la comprensione delle modifiche. Ad esempio, nello screenshot sottostante, le righe «+/-» senza rientranza mostrano l'ultima risoluzione del conflitto relativa al rinominamento dal primo ramo sha1 a oid nel commento, mentre «+/-» con rientranza mostra la risoluzione iniziale del conflitto, causata dall'emergere, nel secondo ramo, di un argomento aggiuntivo nella funzione dwim_ref().

Utilizzando l'opzione "—remerge-diff", le differenze tra le risoluzioni dei conflitti non sono separate per ciascun ramo genitore, ma mostrano le differenze complessive tra il file con conflitti di fusione e il file in cui i conflitti sono stati risolti.

- È stata aumentata la flessibilità nella configurazione del comportamento di reset delle cache disco tramite la chiamata della funzione fsync(). Il parametro core.fsyncObjectFiles, precedentemente disponibile, è stato suddiviso in due variabili di configurazione core.fsync e core.fsyncMethod, che offrono la possibilità di applicare fsync non solo ai file oggetto (.git/objects), ma anche ad altre strutture di git, come i riferimenti (.git/refs), il reflog e i file pack.
Attraverso la variabile core.fsync è possibile specificare un elenco di strutture interne di Git, per le quali, dopo un'operazione di scrittura, verrà invocato fsync. La variabile core.fsyncMethod consente di scegliere il metodo per svuotare la cache; ad esempio, si può scegliere fsync per applicare la chiamata di sistema omonima oppure specificare writeout-only per attivare la scrittura posticipata (pagecache writeback).
- Per proteggere da vulnerabilità che manipolano la sostituzione di directory .git da parte di altri utenti in partizioni condivise, è stata migliorata la verifica della proprietà del repository. L'esecuzione di qualsiasi comando git è ora consentita solo nelle proprie directory «.git». Se la directory del repository appartiene a un altro utente, verrà restituito un errore per impostazione predefinita. Questo comportamento può essere disattivato tramite l'impostazione safe.directory.
- Nel comando «git cat-file», destinato a visualizzare il contenuto originale degli oggetti Git, è stata aggiunta l'opzione «—batch-command», che arricchisce i comandi precedentemente disponibili «—batch» e «—batch-check» con la possibilità di selezionare in modo adattivo il tipo di output tramite l'indicazione «contents » per visualizzare il contenuto o «info » per visualizzare le informazioni sull'oggetto. È supportato anche il comando «flush» per svuotare il buffer di output.
- Nel comando «git ls-tree», destinato a generare un elenco del contenuto dell'albero degli oggetti, è stata aggiunta l'opzione «—oid-only» («—object-only»), che, analogamente a «—name-only», restituisce solo gli identificatori degli oggetti per semplificare l'invocazione da script. È stata implementata anche l'opzione «—format» per consentire di definire un formato di output personalizzato, combinando informazioni su modalità, tipo, nome e dimensione.
- Nel comando «git bisect run» è stata implementata la determinazione della mancata esposizione per il segnale eseguibile dello script e il conseguente output di errori con codici 126 o 127 (in precedenza, se uno script non poteva essere avviato, tutte le revisioni venivano contrassegnate come problematiche).
- Nel comando «git fetch» è stata aggiunta l'opzione «—refetch» per estrarre tutti gli oggetti senza informare l'altra parte sui contenuti già presenti nel sistema locale. Comportamenti simili possono essere utili per ripristinare lo stato dopo un guasto, quando non si è certi dell'integrità dei dati locali.
- Nei comandi «git update-index», «git checkout-index», «git read-tree» e «git clean» è stata aggiunta la supporto per indici parziali (sparse index), che consente di migliorare le prestazioni e risparmiare spazio nei repository in cui vengono eseguite operazioni di clonazione parziale (sparse-checkout).
- Modificato il comportamento del comando «git clone —filter=… —recurse-submodules», che ora porta a un clonazione parziale dei sottosistemi (in precedenza, nell'esecuzione di comandi simili, il filtro veniva applicato solo al contenuto principale, mentre i sottosistemi venivano clonati completamente senza considerare il filtro).
- Nel comando «git bundle» è stata aggiunta la supporto per la specificazione di filtri per il posizionamento selettivo dei contenuti analogamente alle operazioni di clonazione parziale.
- Nel comando «git branch» è stata aggiunta l'opzione «—recurse-submodules» per la scansione ricorsiva dei sottosistemi.
- In userdiff è stato proposto un nuovo gestore per il linguaggio Kotlin.
Fonte: opennet.ru


