È stata rilasciata la versione del sistema di gestione distribuita dei codici sorgente Git 2.56. Il codice di Git è distribuito sotto la licenza GPLv2+. Rispetto alla versione precedente, in questa nuova versione sono stati integrati 748 cambiamenti, realizzati con la partecipazione di 104 sviluppatori, 39 dei quali hanno preso parte allo sviluppo di Git per la prima volta. Le principali novità (1, 2, 3):
- È stata aggiunta la modalità «git add —resolved» per risolvere i conflitti durante la fusione dei rami, che controlla i file per la presenza di marcatori di conflitto e, nel caso venga trovato un marcatore in almeno un file, restituisce un errore, non indicizza nessuno dei file e mostra l'elenco dei file che necessitano di correzione. A differenza del comando «git add —update», nella nuova modalità vengono elaborati solo i file che si trovano in conflitto, mentre i file modificati non legati al conflitto vengono ignorati, consentendo di completare in sicurezza la fusione dei rami, anche se nella cartella di lavoro ci sono altre modifiche non completate (il comando «git add —update» aggiungeva all'indice tutti i file modificati già tracciati nella cartella di lavoro).
- Le prestazioni con grandi repository sono state notevolmente accelerate grazie all'ottimizzazione dell'algoritmo di ricerca dei commit comuni più recenti durante la fusione dei rami e il confronto dei commit. Durante il processo ora vengono presi in considerazione i commit appartenenti esclusivamente a uno dei rami, il che consente di fermare la scansione non appena vengono individuati tutti gli antenati comuni possibili, senza sprecare tempo in ulteriori esplorazioni della cronologia delle modifiche. In uno dei repository testati, la velocità di ricerca è aumentata in media di 20 volte, e in un altro il miglioramento ha raggiunto le 70 volte. Eseguendo il comando «git merge-base —all v4.8 v4.9» in un repository del kernel Linux, il numero di passaggi di scansione è diminuito da 167.000 a 3.800.
- Per l'uso su server, è stata adattata la modalità di ripackaging «—path-walk», che consente di creare file pack più compatti raggruppando gli oggetti in base al loro percorso nell'albero delle directory (ad esempio, per il repository Fluent UI l'uso di «—path-walk» ha ridotto la dimensione del file pack da 558 MB a 164 MB). Nella nuova versione è stata implementata la possibilità di utilizzare la modalità «—path-walk» insieme alle mappe di raggiungibilità (reachability bitmap) e alle isole di delta (delta island), utilizzate dai git hosting per accelerare le operazioni e isolare i fork dal repository principale.
- Eliminati i colli di bottiglia che portavano a calcoli eccessivi in grandi repository: rimosse le verifiche di stato dei file durante la scrittura nella reftable; esclusa la scansione ripetuta della lista ad ogni inserimento di un nuovo pack-file; accelerate le operazioni con la reftable in cui si erano accumulate molte registrazioni di eliminazione; ottimizzato il funzionamento di "git diff" quando vengono forniti vincoli sui percorsi dei file. Dopo le ottimizzazioni, il lavoro con la reftable in caso di un gran numero di eliminazioni è stato accelerato di 65 volte (da 13 secondi a 0,2 secondi), e l'esecuzione del comando problematico "git diff" nel repository Chromium con 500000 elementi nell'indice ora richiede 0,07 secondi invece di 8 minuti.
- Nel team sperimentale "git history", che offre funzionalità per riscrivere la cronologia delle modifiche, è stata aggiunta l'operazione "git history drop" per eliminare un commit selezionato con l'allegazione automatica dei suoi discendenti al commit padre.
- Aggiunta il comando "git branch --delete-merged 'origin/*' 'topic-*'" per eliminare in modo sicuro gruppi di branch locali, i cui cambiamenti sono già stati trasferiti a un repository esterno. È consentito l'uso di maschere per filtrare branch e repository. Per analizzare i candidati all'eliminazione, senza eseguire effettivamente l'operazione, è possibile utilizzare il flag "--dry-run".
- Aggiunto il comando "git refs create|update|delete|rename", che combina le operazioni a basso livello per creare, eliminare, rinominare e aggiornare riferimenti.
- Nel comando "git bisect run" è stata aggiunta l'opzione "--reset-when-found=[]", che riporta automaticamente il repository allo stato precedente all'inizio della ricerca o mantiene attivo il commit problematico, senza necessità di eseguire separatamente il comando "git bisect reset".
- Nel comando "git replay" è stata aggiunta la flag "--linearize" per utilizzare una topologia piatta di fusione, analogamente a "git rebase --no-rebase-merges", ma senza fare riferimento all'albero di lavoro.
- Nel comando "git log --follow" è stata implementata la tracciabilità della ridenominazione dei file in una cronologia delle modifiche non lineare, ad esempio, durante la fusione delle sottobranch. Il percorso del file ora viene registrato separatamente per ogni commit padre, rendendo il risultato indipendente dall'ordine di navigazione della cronologia dei commit.
- È stata aggiunta la possibilità di applicare il comando «git repack -a —filter=blob:limit=1m —drop-filtered» per rimuovere grandi oggetti blob caricati on demand da un repository esterno e non utilizzati nell'indice attuale. Quando si accede a questi oggetti in seguito, verranno ricaricati automaticamente.
- Nel comando «git log —graph» è stato implementato un sistema di indentazione per grafi con più radici indipendenti, per separare visivamente i commit non correlati.
- È stato garantito il riconoscimento di errori tipografici comuni, come l'uso di «git push origin/main» anziché «git push origin main» o «git branch —set-upstream-to origin main» anziché «git branch —set-upstream-to=origin/main», con suggerimenti sull'uso della variante corretta.
Fonte: opennet.ru
