È stato presentato il rilascio del sistema distribuito di controllo delle versioni Git 2.54. Git si distingue per l'elevata performance e offre strumenti per lo sviluppo non lineare, basati su branching e merging. Per garantire l'integrità della cronologia e la resilienza alle modifiche retroattive, viene utilizzato un hashing implicito dell'intera cronologia precedente in ogni commit, insieme alla certificazione tramite firme digitali degli sviluppatori per tag e commit singoli. Il codice di Git è distribuito con licenza GPLv2+.
Rispetto alla versione precedente, nella nuova versione sono stati accettati 770 cambiamenti, preparati con la collaborazione di 137 sviluppatori (66 hanno partecipato per la prima volta allo sviluppo di Git). Le principali novità sono:
- È stato implementato il comando «git history», che fornisce funzionalità sperimentali per la riscrittura della cronologia delle modifiche, più semplici e sicure da utilizzare rispetto al rebase dei commit con il comando «git rebase». Sono disponibili due operazioni:
- «git history reword » per riscrivere il messaggio nel commit specificato senza modificare l'albero di lavoro e l'indice (eccetto la nota, il resto rimane intatto). Ad esempio, per correggere un errore di battitura.
- «git history split » per dividere interattivamente il commit specificato in due commit diversi, spostando parti selezionate dal commit originale in un commit aggiuntivo.
Nei futuri rilasci si prevede di aggiungere ulteriori comandi: «git history fixup» per correggere un commit, «git history drop» per eliminare un commit, «git history reorder» per modificare l'ordine dei commit e «git history squash» per unire i commit.
- È stato implementato un nuovo metodo per definire i gestori (hook) nei file di configurazione. Invece di posizionare gli script dei gestori nella directory «.git/hooks» in ogni repository, ora è possibile specificare i comandi per chiamare i gestori direttamente nei file di configurazione. Le impostazioni possono essere legate al repository oppure specificate nei file di configurazione che si applicano a tutti i repository (/etc/gitconfig) o ai repository dell'utente (~/.gitconfig). È possibile associare più gestori a un singolo evento. Gli script in «.git/hooks» continueranno a essere richiamati, ma verranno eseguiti dopo i gestori dai file di configurazione. Per visualizzare l'elenco dei gestori, utilizzare il comando «git hook list», mentre per disabilitare selettivamente la chiamata dei gestori, utilizzare l'impostazione «hook..enabled = false». [hook «linter»] event = pre-commit command = ~/.bin/linter —cpp20 [hook «no-leaks»] event = pre-commit command = ~/.bin/leak-detector $ git hook list pre-commit global linter ~/.bin/linter —cpp20 local no-leaks ~/.bin/leak-detector
- Nella team «git maintenance» è attivata per default la strategia «geometric» («git config set maintenance.strategy geometric»), che consente di ridurre il tempo di manutenzione per grandi monorepository. Rispetto alla strategia precedentemente utilizzata, che applicava la logica del comando «git gc», la nuova strategia evita di ri-imballare tutti gli oggetti e esclude operazioni eccessivamente dispendiose in termini di risorse, come la fusione di tutti i file pack (ove possibile, la fusione avviene a pezzi e senza ripulire gli oggetti eliminati).
- Il database degli oggetti (ODB) e le relative API sono stati convertiti in una nuova architettura basata sull'uso di backend plug-in. La ristrutturazione effettuata astrae il formato di memorizzazione degli oggetti e permetterà in futuro di implementare funzionalità come backend alternativi e formati di oggetti, ad esempio per una memorizzazione più efficiente di grandi file binari o per ottimizzare il funzionamento di grandi git hosting.
- Nel comando «git repo structure», che fornisce informazioni sulla struttura del repository, è stata implementata la visualizzazione non solo della dimensione totale, ma anche dei più grandi oggetti di ciascun tipo, il che consente di effettuare valutazioni delle dimensioni senza utilizzare utilità esterne come git-sizer. $ git repo structure … | * Oggetti più grandi | | | * Commits | | | * Dimensione massima [1] | 17.23 KiB | | * Genitori massimi [2] | 10 | | * Trees | | | * Dimensione massima [3] | 58.85 KiB | | * Voci massime [4] | 1.18 k | | * Blobs | | | * Dimensione massima [5] | 1019.51 KiB | | * Tags | | | * Dimensione massima [6] | 7.13 KiB |
- Nel comando «git replay», utilizzato invece di «git rebase» per ricreare la storia su server senza albero di lavoro, è stata attivata di default l'aggiornamento atomico dei riferimenti (invece di stamparne la lista dei comandi update-ref per l'esecuzione manuale), è stata implementata l'opzione «—revert» per annullare le modifiche da una serie di commit, è stato garantito il rigetto dei commit vuoti risultanti e ora è possibile ricreare la storia fino al commit radice.
- Nel comando «git rev-list» e nei comandi simili è stata aggiunta l'opzione «—maximal-only» per visualizzare solo i commit inaccessibili da altri commit.
- Nel comando «git repo info» è stata aggiunta l'opzione «—keys» per stampare l'elenco di tutte le chiavi note.
- Nel comando «git add -p» è stata garantita la marcatura dei blocchi già approvati e saltati durante la navigazione tra i blocchi di codice utilizzando i tasti «J» e «K». È stata aggiunta l'opzione «—no-auto-advance» per disattivare il passaggio automatico al file successivo, in modo da poter tornare ai file precedenti prima del commit.
- È stata ottimizzata l'interfaccia web «gitweb» per la visualizzazione da dispositivi mobili.
- Nel comando «git apply —directory» è stata assicurata la normalizzazione dei percorsi dei file prima dell'uso, come «.\/un\/..\/normalized\/path».
- È stata documentata la possibilità di aggiungere propri sottocomandi inserendo file «git-<cmd>» nella cartella con i file eseguibili.
- Nel comando «git send-email» è stato aggiunto il supporto per i certificati client.
- Per il comando «git status» è stata implementata l'impostazione «status.compareBranches», attraverso la quale è possibile specificare i rami con cui verrà effettuato il confronto del ramo attuale. [status] compareBranches = @{upstream} @{push}
- In «git rebase» è stata aggiunta l'opzione «—trailer» per semplificare l'aggiunta di metadati a tutti i commit. git rebase —trailer «Reviewed-by: Test <test@example.com>»
- È stata aggiunta al comando «git fast-import» la possibilità di sostituire le firme per i commit che sono diventate non valide dopo l'importazione.
- È stato aggiunto il supporto per la compattazione degli indici multi-pacchetto MIDX (multi-pack index), che unisce tra loro piccoli strati dell'indice MIDX con informazioni sulla disponibilità degli oggetti e file bitmap ad essi correlati, riducendo così il numero degli strati accumulati nei repository più vecchi.
- Nel comando «git backfill» è stata implementata la possibilità di specificare revisioni (intervalli di commit) e maschere di percorso (pathspec) per limitare le parti della cronologia delle modifiche da caricare. git backfill main~100..main git backfill — ‘*.c’
- Sono state aggiunte forme alternative di invocazione del comando «git config list» — «git config -l» e «git config —list».
- È consentito l'uso di caratteri non ASCII nei nomi degli alias dei comandi definiti nel file di configurazione. [alias «fetch»] command = fetch
- È stata modificata la visualizzazione delle firme i cui GPG key sono scaduti, ma che erano valide al momento della firma del commit. Tali firme ora vengono visualizzate come corrette con una nota sulla scadenza della chiave (in precedenza venivano evidenziate in rosso, creando l'impressione di essere errate).
- Quando si accede ai repository tramite HTTP, è stato fornito il trattamento degli errori con codice 429 (Troppe Richieste). Le richieste terminate con questo errore vengono ora considerate non come un problema fatale, ma come un errore temporaneo, per il quale è opportuno ripetere l'operazione dopo un certo tempo. Il ritardo prima della ripetizione è impostato tramite l'opzione «http.retryAfter», il numero di ripetizioni — «http.maxRetries», e il tempo di attesa — «http.maxRetryTime».
Fonte: opennet.ru
