Dopo due mesi di sviluppo, è stata pubblicata la versione 2.35 del sistema di gestione distribuita dei codici sorgente Git. Git è uno dei sistemi di versionamento più popolari, affidabili e ad alte prestazioni, che offre strumenti flessibili per lo sviluppo non lineare, basati su ramificazioni e fusioni di rami. Per garantire l'integrità della storia e la resilienza ai cambiamenti retroattivi, viene utilizzato un hashing implicito dell'intera storia precedente in ogni commit. Inoltre, è possibile convalidare i singoli tag e commit con firme digitali dei sviluppatori.
Rispetto alla versione precedente, nella nuova versione sono stati accettati 494 cambiamenti, realizzati con la partecipazione di 93 sviluppatori, 35 dei quali hanno preso parte per la prima volta allo sviluppo. Le principali novità sono:
- Le funzionalità relative all'utilizzo delle chiavi SSH per la firma degli oggetti Git sono state ampliate. Per gestire la validità temporale di più chiavi, è stata aggiunta la supporto per le direttive OpenSSH «valid-before» e «valid-after», che consentono di garantire il corretto funzionamento delle firme dopo la rotazione di una delle chiavi da parte di un sviluppatore. In precedenza, si riscontrava un problema nel separare le firme effettuate con la chiave vecchia e quelle con la chiave nuova: se si rimuoveva la chiave vecchia, non si potevano più verificare le firme effettuate con essa; se si lasciava, si manteneva la possibilità di creare nuove firme con la chiave vecchia, mentre una chiave nuova era già stata introdotta. Con valid-before e valid-after è possibile separare l'ambito di azione delle chiavi in base al tempo di creazione della firma.
- Nella configurazione merge.conflictStyle, che consente di scegliere il modo in cui visualizzare le informazioni sui conflitti durante la fusione, è stata aggiunta la supporto per la modalità «zdiff3», che sposta al di fuori dell'area di conflitto tutte le righe comuni indicate all'inizio o alla fine del conflitto, consentendo di ottenere una rappresentazione più compatta delle informazioni.
- Nel comando «git stash» è stata aggiunta la modalità «—staged», che consente di nascondere solo le modifiche aggiunte all'indice, ad esempio in situazioni in cui è necessario mettere temporaneamente da parte una parte di modifiche complesse per prima aggiungere ciò che è già pronto e poi gestire il resto in un secondo momento. Questa modalità è simile al comando «git commit», che registra solo le modifiche inserite nell'indice, ma invece di creare un nuovo commit in «git stash —staged», il risultato viene salvato in un'area temporanea di stash. Dopo che le modifiche sono necessarie, possono essere ripristinate con il comando «git stash pop».
- È stato aggiunto un nuovo specificatore di formato «—format=%(describe)» al comando «git log», che consente di combinare l'output di «git log» con il risultato dell'esecuzione del comando «git describe». I parametri per «git describe» vengono specificati direttamente all'interno dello specificatore («—format=%(describe:match=,exclude=)»), dove è possibile includere anche tag abbreviati («—format=%(describe:tags=)») e configurare il numero di caratteri esadecimali per l'identificazione degli oggetti («—format=%(describe:abbrev=)»). Ad esempio, per visualizzare gli ultimi 8 commit, i cui tag non hanno una label di candidato per il rilascio, e indicare identificatori di 8 caratteri, si può usare il comando: $ git log -8 —format='%(describe:exclude=*-rc*,abbrev=13)' v2.34.1-646-gaf4e5f569bc89 v2.34.1-644-g0330edb239c24 v2.33.1-641-g15f002812f858 v2.34.1-643-g2b95d94b056ab v2.34.1-642-gb56bd95bbc8f7 v2.34.1-203-gffb9f2980902d v2.34.1-640-gdf3c41adeb212 v2.34.1-639-g36b65715a4132
- Nella configurazione user.signingKey è stata implementata la supporto per nuovi tipi di chiavi, non limitati al tipo «ssh-» e all'indicazione del percorso file completo per la chiave. I tipi alternativi sono specificati usando il prefisso «key::», ad esempio, «key::ecdsa-sha2-nistp256» per chiavi ECDSA.
- La velocità di generazione dell'elenco delle modifiche è stata notevolmente aumentata in modalità «—histogram» e anche quando si utilizza l'opzione «—color-moved-ws», che gestisce l'evidenziazione degli spazi nel diff colorato.
- Nel comando «git jump», utilizzato per fornire a Vim informazioni sui passaggi esatti per la posizione richiesta nel file durante la risoluzione dei conflitti di merge, la visualizzazione delle differenze o l'esecuzione di operazioni di ricerca, è stata aggiunta la possibilità di restringere i conflitti di merge. Ad esempio, per limitare le operazioni solo alla directory «foo», è possibile specificare «git jump merge — foo», mentre per escludere la directory «Documentation» si può usare «git jump merge — ':^Documentation'».
- È stato standardizzato l'uso del tipo «size_t» al posto di «unsigned long» per i valori che rappresentano le dimensioni degli oggetti, consentendo l'applicazione dei filtri «clean» e «smudge» su file più grandi di 4 GB su tutte le piattaforme, comprese quelle con il modello di dati LLP64, dove il tipo «unsigned long» è limitato a 4 byte.
- È stata aggiunta all comando "git am" l'opzione "—empty=(stop|drop|keep)", che consente di scegliere il comportamento per le email vuote senza patch durante l'analisi delle patch dalla posta. Il valore "stop" terminerà l'intera operazione di applicazione delle patch, "drop" salterà la patch vuota, e "keep" creerà un commit vuoto.
- I comandi "git reset", "git diff", "git blame", "git fetch", "git pull" e "git ls-files" ora supportano indici parziali (sparse index), consentendo di migliorare le prestazioni e risparmiare spazio nei repository dove vengono eseguite operazioni di clonazione parziale (sparse-checkout).
- Il comando "git sparse-checkout init" è stato dichiarato obsoleto e ora si consiglia di utilizzare "git sparse-checkout set".
- È stata aggiunta un'implementazione iniziale di un nuovo backend "reftable" per la memorizzazione dei collegamenti, come rami e tag, nel repository. Questo nuovo backend utilizza uno storage a blocchi, applicato dal progetto JGit e ottimizzato per la memorizzazione di un numero molto elevato di collegamenti. Il backend non è ancora integrato con il sistema dei riferimenti (refs) e non è pronto per l'uso pratico.
- La tavolozza dei colori del comando "git grep" è stata allineata con l'utility GNU grep.
Fonte: opennet.ru
