Sistema di controllo del codice sorgente Git 2.41 disponibile

Dopo tre mesi di sviluppo è stata pubblicata la release del sistema di controllo del codice sorgente distribuito Git 2.41. Git è uno dei sistemi di controllo della versione più popolari, affidabili e ad alte prestazioni che fornisce strumenti di sviluppo non lineari flessibili basati su ramificazioni e unioni di rami. Per garantire l'integrità della cronologia e la resistenza alle modifiche retroattive, viene utilizzato l'hashing implicito dell'intera cronologia precedente in ogni commit, è inoltre possibile verificare i singoli tag e commit con le firme digitali degli sviluppatori.

Rispetto alla versione precedente, nella nuova versione sono state accettate 542 modifiche, preparate con la partecipazione di 95 sviluppatori, di cui 29 hanno partecipato allo sviluppo per la prima volta. Principali innovazioni:

  • Migliore gestione degli oggetti irraggiungibili a cui non si fa riferimento nel repository (rami o tag non sono referenziati). Gli oggetti non raggiungibili vengono rimossi dal Garbage Collector, ma rimangono nel repository per un certo tempo prima della rimozione per evitare race condition. Per tenere traccia del periodo di oggetti irraggiungibili, è necessario associare ad essi etichette con l'ora di cambio di oggetti simili, il che non consente di memorizzarli in un unico file pack, in cui tutti gli oggetti hanno un tempo di cambio comune. In precedenza, ogni oggetto irraggiungibile veniva archiviato in un file separato, il che causava problemi se esisteva un numero elevato di nuovi oggetti irraggiungibili che non erano ancora soggetti all'eliminazione. Nella nuova versione, per impostazione predefinita, viene utilizzato il meccanismo "cruft packs" per impacchettare oggetti irraggiungibili, che consente di archiviare tutti gli oggetti irraggiungibili in un file di impacchettamento e di riflettere i dati sull'ora di modifica di ciascun oggetto in una tabella separata memorizzata in un file con estensione ".mtimes" e collegato tramite un file indice con estensione ".idx".
    Sistema di controllo del codice sorgente Git 2.41 disponibile
  • Per impostazione predefinita, è abilitato il mantenimento di un indice inverso (revindex) su disco per i file pack. Quando testato sui repository torvalds/linux, l'uso di un indice inverso ci ha permesso di velocizzare le operazioni "git push" ad alta intensità di risorse di 1.49 volte e le operazioni semplici, come il calcolo della dimensione di un singolo oggetto usando "git cat- file --batch='%(objectsize:disk)' » 77 volte. I file (".rev") con un indice inverso verranno archiviati all'interno del repository nella directory ".git/objects/pack".

    Ricordiamo che Git memorizza tutti i dati sotto forma di oggetti, che vengono inseriti in file separati. Per aumentare l'efficienza del lavoro con il repository, gli oggetti vengono inoltre inseriti in file pack, in cui le informazioni vengono presentate sotto forma di un flusso di oggetti che si susseguono uno dopo l'altro (un formato simile viene utilizzato durante il trasferimento di oggetti con git fetch e git comandi push). Per ogni file di pacchetto viene creato un file indice (.idx), che consente di determinare molto rapidamente l'offset nel file di pacchetto in base al quale l'oggetto specificato viene memorizzato dall'identificatore oggetto.

    L'indice inverso incluso nella nuova versione ha lo scopo di semplificare il processo di determinazione dell'ID oggetto dalle informazioni sulla posizione dell'oggetto nel file di pacchetto. In precedenza, tale conversione veniva eseguita al volo durante l'analisi del file pack ed era archiviata solo in memoria, il che non consentiva il riutilizzo di tali indici e obbligava la generazione dell'indice ogni volta. L'operazione di creazione di un indice si riduce alla creazione di un array di coppie oggetto-posizione e all'ordinamento in base alla posizione, operazione che può richiedere molto tempo per i file pack di grandi dimensioni.

    Ad esempio, l'operazione di visualizzazione del contenuto degli oggetti, che utilizza un indice diretto, è stata 62 volte più veloce dell'operazione di visualizzazione della dimensione degli oggetti, per i quali i dati di relazione posizione-oggetto non sono stati indicizzati. Dopo aver utilizzato l'indice inverso, queste operazioni hanno iniziato a richiedere all'incirca lo stesso tempo. Gli indici inversi consentono inoltre di velocizzare l'operazione di invio di oggetti durante l'esecuzione di comandi fetch e push trasferendo direttamente i dati già pronti dal disco.

    Sistema di controllo del codice sorgente Git 2.41 disponibile

  • Aggiunto il supporto per il passaggio delle intestazioni WWW-Authenticate tra il gestore delle credenziali e il servizio di autenticazione al protocollo "credential helper" utilizzato per passare le credenziali durante l'accesso ai repository con restrizioni. Il supporto per l'intestazione WWW-Authenticate consente di passare i parametri dell'ambito OAuth per separare in modo più granulare l'accesso degli utenti ai repository e delimitare gli ambiti disponibili per le richieste.
  • Aggiunta opzione di formato "%(avanti-dietro: )", che consente di ottenere immediatamente informazioni sul numero di commit presenti o assenti in un certo ramo, rispetto a un altro ramo (quanto un ramo è in ritardo o in vantaggio rispetto a un altro a livello di commit). In precedenza, ottenere queste informazioni richiedeva due comandi separati: "git rev-list --count main..my-feature" per ottenere il numero di commit univoci per un ramo e "git rev-list --count my-feature.. main" per ottenere il numero di commit mancanti. Ora tali calcoli possono essere ridotti a un singolo comando, che semplifica la scrittura dei gestori e riduce i tempi di esecuzione. Ad esempio, per mostrare i rami non uniti e valutare se sono dietro o davanti al loro ramo principale, puoi usare una riga: $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(ahead-behind :origin/HEAD)' \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3 invece dello script usato in precedenza, che è 17 volte più lento: $ git for-each-ref - format='%(refname:short)' --no-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead="$(git rev-list --count origin/HEAD..$ref)" behind="$(git rev-list --count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$avanti" "$dietro" fatto | column -t tb/cruft-extra-tips 2 96 tb/for-each-ref—exclude 16 96 tb/roaring-bitmaps 47 3
  • Aggiunta l'opzione "--porcelain" al comando "git fetch", che genera output nel formato " ”, meno leggibile, ma più conveniente per l'analisi negli script.
  • Aggiunta l'impostazione "fetch.hideRefs" per velocizzare le operazioni "git fetch" nascondendo parte dei collegamenti nel repository locale nella fase di verifica se il server ha inviato l'intero set di oggetti, risparmiando tempo limitando il controllo ai soli server da cui i dati vengono recuperati direttamente. Ad esempio, durante il test su un sistema con repository che contengono un numero elevato di collegamenti esterni tracciati, l'esclusione di tutti i collegamenti tranne quelli indirizzati al server di destinazione $remote ha ridotto l'operazione "git fetch" da 20 minuti a 30 secondi. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
  • Il comando "git fsck" implementa la possibilità di verificare la corruzione, la corrispondenza del checksum e la correttezza dei valori nelle bitmap di accessibilità e negli indici inversi.
  • Il comando "git clone --local" ora visualizza un errore quando si tenta di copiare da un repository contenente collegamenti simbolici all'interno di $GIT_DIR.

Fonte: opennet.ru

Aggiungi un commento