È stato rilasciato il sistema di gestione distribuita del codice sorgente Git 2.55. Tra le principali novità: inclusione per default della build con Rust, implementazione del processo fsmonitor per Linux, nuova strategia di riimballaggio dell'indice MIDX incrementale, il comando "git history fixup" per correggere un commit, ottimizzazione della generazione delle bitmap di disponibilità degli oggetti, supporto per l'esecuzione parallela degli hook, comando "git format-rev". Il codice di Git è distribuito sotto la licenza GPLv2+.
Rispetto alla versione precedente, nella nuova release sono stati accettati 505 cambiamenti, preparati con la partecipazione di 100 sviluppatori, 33 dei quali hanno preso parte allo sviluppo di Git per la prima volta. Le principali novità (1, 2, 3):
- È abilitato per default il supporto per i componenti in linguaggio Rust. Il compilatore rustc
aggiunto all'elenco delle dipendenze di compilazione. Per compilare senza Rust, puoi utilizzare il flag "NO_RUST=1" quando esegui l'utility make o "-Drust=disabled" durante l'esecuzione di "meson configure". La possibilità di disabilitare la compilazione con Rust sarà supportata fino al ramo Git 3.0, in cui Rust diventerà una dipendenza obbligatoria. In Rust è stata implementata un'interfaccia per la portabilità tra configurazioni con hash SHA-1 e SHA-256, così come alcune funzioni interne, come la codifica e decodifica di valori interi di lunghezza variabile. In futuro si prevede una riscrittura su Rust di componenti interni di Git più significativi. - Nella squadra sperimentale "git history", che offre funzionalità per la riscrittura della cronologia delle modifiche, è stata aggiunta l'operazione "git history fixup" per correggere un commit. L'operazione "fixup" consente di trasferire le modifiche aggiunte tramite "git add" a un commit precedente e riscrivere automaticamente tutti i commit successivi, analogamente a quanto si ottiene con il comando "git commit --fixup=" e avviando "git rebase --autosquash ~".
- Per la piattaforma Linux è stato implementato un processo in background chiamato fsmonitor, che monitora le modifiche nel file system utilizzando il meccanismo inotify, permettendo di evitare la scansione dell'intero catalogo di lavoro quando si eseguono comandi come 'git status'. L'attivazione avviene tramite l'impostazione 'core.fsmonitor'.
- Il comando 'git repack' ha aggiunto la modalità '--write-midx=incremental', implementando una nuova strategia di aggiornamento dei metadati nell'indice MIDX incrementale (multi-pack index), che consente di evitare la ricompattazione dell'intero indice. Nell'indice multi-pack incrementale, invece di un unico grande indice contenente informazioni sulla distribuzione degli oggetti nei file pack, si utilizza una suddivisione in strati: ogni strato copre un certo numero di file pack e viene memorizzato in un file bitmap separato. Questa struttura consente di aggiungere all'indice i dati sugli oggetti in nuovi file pack, allegando nuovi strati all'indice senza la necessità di ricostruire gli strati già esistenti.
Il comando «git repack —write-midx=incremental» consente di aggiungere un nuovo strato all'indice MIDX incrementale, coprendo i file pack recentemente creati. In combinazione con la modalità di imballaggio dei repository «—geometric», il nuovo comando permette di unire nuovi oggetti da più file pack in un file pack più grande e, se necessario, eseguire l'imballaggio e la fusione di più strati consecutivi dell'indice MIDX incrementale. Questa strategia consente di riscrivere solo gli strati superiori durante l'esecuzione di «git repack», lasciando intatti i vecchi strati grandi e impedendo la crescita incontrollata della catena di strati, mantenendo il numero totale di strati a un livello proporzionale al logaritmo del numero totale di oggetti.
- La generazione delle bitmap di disponibilità degli oggetti è stata notevolmente ottimizzata grazie a un nuovo algoritmo di attraversamento dell'albero degli oggetti, che esclude la ricorsione non necessaria, include la memorizzazione delle posizioni degli oggetti, la classificazione delle bitmap prima della loro combinazione tramite operazione XOR e la rielaborazione del codice per la creazione di bitmap di pseudo-fusione (pseudo-merge). Nel repository di test, le ottimizzazioni hanno permesso di ridurre il tempo di generazione delle bitmap da 612 a 294 secondi.
- È stata implementata la possibilità di eseguire in parallelo hook indipendenti nei file di configurazione. Gli hook che influenzano lo stato condiviso o lo tengono in considerazione, come quelli che modificano le note dei commit o ispezionano gli indici e l'albero di lavoro, non possono essere eseguiti in parallelo. Tuttavia, è possibile eseguire parallelamente hook per il controllo tramite linter e l'esecuzione dei test unitari. Gli hook che consentono l'esecuzione parallela sono configurati tramite il parametro «hook.nome_huk.parallel = true». Il numero di operazioni avviate simultaneamente è definito tramite la configurazione hook.jobs, hook.<event>.jobs o l'opzione della riga di comando «-j».
- Nel comando «git pack-objects —path-walk» è stata implementata la possibilità di specificare filtri, come «blob:none», «blob:limit=<n>», «tree:0», «object:type=<type>», «sparse:<oid>» e «combine:». Nel test effettuato, l'esclusione dei blob durante l'esecuzione di «—path-walk» ha consentito di ridurre del 16% la dimensione del pacchetto generato.
- Aggiunto il comando «git format-rev» per la formattazione delle revisioni e dei nomi degli oggetti menzionati nelle liste di commit o presenti in testo arbitrario (ad esempio, può essere usato in hook per elaborare le annotazioni ai commit).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Per impostazione predefinita, è stata attivata l'escapesione della maggior parte delle sequenze di controllo del terminale nei messaggi informativi e nel testo degli errori trasmessi. server. Durante l'accesso a contenuti dannosi, server sequences di escape simili potrebbero essere state utilizzate per nascondere o modificare l'output, ad esempio tramite sequenze di escape per spostare il cursore e cancellare il testo. È stata mantenuta la supporto per le sequenze di escape per evidenziare gli elementi con il colore.
- Il comando «git checkout -m» ora salva automaticamente le modifiche locali in conflitto nell'area dello stash senza la necessità di risolvere immediatamente il conflitto.
- Il comando «git push» ora consente di inviare un ramo a più server Git esterni con un unico comando. Ad esempio, per trasferire il ramo main non solo sul server principale, ma anche su mirror, è possibile creare un gruppo «publish» composto da server «github», «gitlab» e «mirror»:
git config remotes.publish «github gitlab mirror»
git push publish main - Nel comando «git log —graph» è stata aggiunta l'opzione «—graph-lane-limit=» per limitare il numero di bande verticali nella visualizzazione dei rami, lasciando spazio sullo schermo per le informazioni sui commit in repository con un numero elevato di rami.
…
* | | | | 619931f561 Merge branch 'dl/posix-unused-warning-clang'
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: semplificare il confronto di GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h: pulire GIT_GNUC_PREREQ() e UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filtrare pathspec prima di lstat - Nei comandi «git log» e «git rev-list» è stata aggiunta l'opzione «—max-count-oldest=», che consente di selezionare i N commit più vecchi nell'intervallo.
Fonte: opennet.ru
