È disponibile il rilascio del sistema di gestione distribuito dei testi sorgenti Git 2.31. Git è uno dei sistemi di controllo versione 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 alle modifiche retroattive, viene utilizzato l'hashing implicito dell'intera storia precedente in ogni commit, ed è anche possibile la verifica tramite firme digitali degli sviluppatori per singoli tag e commit.
Rispetto alla versione precedente, nella nuova versione sono stati inclusi 679 cambiamenti, preparati con la partecipazione di 85 sviluppatori, 23 dei quali hanno partecipato per la prima volta allo sviluppo. Le principali novità includono:
- È stato aggiunto il comando "git maintenance", che consente di eseguire operazioni periodiche su sistemi che non supportano cron. Ad esempio, con il nuovo comando è possibile organizzare l'esecuzione periodica del processo di archiviazione del repository, per non dover attendere il completamento del blocco del repository durante l'esecuzione automatica dell'archiviazione mentre si eseguono diversi comandi. Il comando "git maintenance" permette di effettuare ottimizzazioni e operazioni di mantenimento della struttura ottimale del repository in background, senza bloccare la sessione interattiva: ogni ora viene eseguito il caricamento anticipato di nuovi oggetti dal repository remoto e l'aggiornamento del file contenente il grafo dei commit, mentre ogni notte viene avviato il processo di archiviazione del repository.
- È stata aggiunta la supporto per la generazione di un indice inverso (revindex) su disco per i file pack. Ricordiamo che Git memorizza tutti i dati sotto forma di oggetti, che sono collocati in file separati. Per migliorare l'efficienza nella gestione del repository, gli oggetti sono ulteriormente inseriti in file pack, in cui le informazioni sono presentate come un flusso di oggetti che seguono l'uno dopo l'altro (un formato simile è utilizzato durante il trasferimento degli oggetti con i comandi git fetch e git push). Per ciascun file pack viene creato un file indice (.idx), che consente di determinare molto rapidamente, tramite l'identificatore dell'oggetto, l'offset nel file pack dove è memorizzato tale oggetto. L'indice inverso proposto in Git 2.31 (.rev) è destinato a ottimizzare il processo di identificazione dell'oggetto in base alle informazioni relative alla sua posizione nel file pack.
In precedenza, tale conversione veniva eseguita al volo durante l'analisi del file pack e veniva memorizzata solo in memoria, il che non consentiva di riutilizzare tali indici e costringeva a generare l'indice ogni volta. L'operazione di costruzione dell'indice si riduce alla creazione di un array di coppie "oggetto-posizione" e alla sua ordinazione per posizione, il che può richiedere molto tempo per file pack di grandi dimensioni.
Ad esempio, l'operazione di visualizzazione del contenuto degli oggetti, che utilizza l'indice diretto, è stata eseguita 62 volte più velocemente rispetto all'operazione di visualizzazione della dimensione degli oggetti, per la quale i dati di associazione posizione-oggetto non venivano indicizzati. Dopo l'uso dell'indice inverso, le operazioni indicate hanno richiesto all'incirca lo stesso tempo. Gli indici inversi consentono anche di accelerare le operazioni di invio degli oggetti durante i comandi fetch e push grazie alla trasmissione diretta dei dati già pronti dal disco. Per impostazione predefinita, gli indici inversi non vengono creati, per generali è necessaria l'attivazione dell'impostazione "git config pack.writeReverseIndex true" seguita dalla compressione del repository con il comando "git repack -Ad".
- Sono state aggiunte ottimizzazioni delle prestazioni basate sull'introduzione nel formato di file commit-graph, utilizzato per ottimizzare l'accesso alle informazioni sui commit, di nuovi dati sul numero di generazione del commit, che possono essere usati per accelerare ulteriori operazioni sui commit.
- Aggiunte le capacità di ridefinire il nome del ramo principale utilizzato per impostazione predefinita nei nuovi repository (impostazione init.defaultBranch). Quando si accede a repository esterni, git tenta di estrarre il ramo a cui punta HEAD, cioè se l'esterno server utilizza per impostazione predefinita il ramo «main», allora l'operazione «git clone» tenterà di estrarre localmente «main». In Git 2.31, il supporto per tale estrazione è ora implementato anche per i repository vuoti. Ad esempio, durante la clonazione locale di un nuovo repository prima di aggiungere i primi patch, la copia locale conterrà ora il nome del ramo principale impostato all'esterno server .
- Al comando «git rev-list» è stata aggiunta l'opzione «—disk-usage», che consente di visualizzare un riepilogo delle dimensioni degli oggetti.
- In attesa della prossima sostituzione del backend per l'esecuzione delle fusioni, è stata notevolmente ottimizzata la definizione delle rinominazioni.
- Interrotta la supporto della libreria di espressioni regolari obsoleta PCRE1.
- È stata fornita la possibilità di vietare forzatamente l'uso di collegamenti abbreviati, valido indipendentemente dall'algoritmo di hashing. Il divieto si attiva assegnando il valore «no» al parametro core.abbrev.
- Al comando «git rev-parse» è stata aggiunta l'opzione «—path-format=(absolute|relative)» per definire esplicitamente l'output di percorsi relativi o assoluti.
- Negli script per l'autocompletamento dell'input in Bash è stata semplificata l'aggiunta di regole di completamento per i propri sottocomandi «git».
- Al comando «git bundle» è stata aggiunta l'opzione «—stdin» per leggere i collegamenti dall'input standard.
- Al comando «git log» è stata aggiunta una nuova opzione «—diff-merges=».
- Al comando «git ls-files» è stata aggiunta l'opzione «—deduplicatecan» per rimuovere i duplicati nell'output.
- Aggiunte nuove maschere per escludere intervalli di commit — «^!» e «^-».
- Al comando «git range-diff» sono state aggiunte le opzioni «—left-only» e «—right-only» per mostrare solo un lato dell'intervallo confrontato.
- Ai comandi «git diff» e «git log» sono state aggiunte le opzioni «—skip-to=» e «—rotate-to=» per saltare o spostarsi alla fine dei percorsi iniziali.
- Al comando «git difftool» è stata aggiunta l'opzione «—skip-to=» per riprendere una sessione interrotta da un percorso arbitrario.
- Il Codice di condotta (Code-of-conduct), che definisce i principi fondamentali per la risoluzione delle situazioni conflittuali tra gli sviluppatori, è stato aggiornato alla versione 2.0 (in precedenza era in uso la versione 1.4).
Fonte: opennet.ru
