Git (software): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Recupero di 1 fonte/i e segnalazione di 0 link interrotto/i. #IABot (v2.0beta15) |
m v2.05 - Corretto utilizzando WP:WPCleaner (Interlink nel testo della voce - Errori comuni) |
||
(34 versioni intermedie di 25 utenti non mostrate) | |||
Riga 4:
|Nome = Git
|Screenshot =
|Didascalia =
|Sviluppatore = inizialmente [[Linus Torvalds]], attualmente [[Junio Hamano]]
|UltimaVersioneBeta =
|DataUltimaVersioneBeta =
|SistemaOperativo = gnu/linux
|SistemaOperativo2 = osx
Riga 13:
|SistemaOperativoAltri = [[Solaris (sistema operativo)|Solaris]]
|Genere = Sistema di controllo versione
|Lingua =
}}
'''Git''' è un'applicazione [[software]]
Git (che nello [[Slang|slang
== Storia ==
Riga 26 ⟶ 25:
Torvalds voleva un sistema distribuito che potesse usare come BitKeeper, ma nessuno dei sistemi disponibili gratuitamente soddisfaceva i suoi bisogni, particolarmente il suo bisogno di velocità.
{{cn|Ecco un messaggio e-mail (tradotto in italiano) che scrisse il 7 aprile [[2005]]}} mentre stava scrivendo il primo prototipo:
{{citazione|Tutti i sistemi di controllo versione che ho preso in considerazione rendono [il lavoro] difficile. Una delle cose (in realtà, la cosa principale) a cui ho lavorato è rendere quel procedimento realmente ''efficiente''.
Se ci vuole mezzo minuto per applicare una patch, e ci si deve ricordare i confini delle modifiche applicate, ecc. (e francamente, si potrebbe considerare mezzo minuto ''poco'' per la maggior parte dei sistemi di controllo versione che ci sono in giro, e per un progetto della dimensione di Linux), allora una serie di 250 e-mail (che non è affatto inaudito quando mi sincronizzo con Andrew, per esempio) richiede due ore. Neanche BitKeeper si dimostrò rapido (in effetti, confrontato a qualunque altra cosa, BitKeeper ''è'' velocissimo, spesso uno o due ordini di grandezza migliore), e richiedeva circa 10–15 secondi per ogni e-mail quando facevo il merge con Andrew. Tuttavia, con BitKeeper quello non era un problema tanto grosso, dato che i merge
Perciò il merge, in un sistema di controllo versione basato sull'applicazione di patch dovrebbe essere più ''veloce'' di BitKeeper. Il che è veramente difficile. E per questo sto scrivendo alcuni script per tentare di tener traccia delle cose in modo nettamente più veloce.
Riga 42 ⟶ 41:
# Prendi [[Concurrent Versions System|CVS]] come esempio di che cosa ''non'' fare; se hai un dubbio, fai l'esatto contrario. Per citare Linus, che parlava un po' ironicamente:
#: “Per i primi 10 anni di manutenzione del kernel, usavamo letteralmente tarball (archivi compressi) e patch, che è un sistema di gestione del codice sorgente molto migliore di CVS. Poi ho finito per usare CVS per 7 anni in un'azienda ''[presumibilmente [[Transmeta]]]'' e lo odio appassionatamente. Quando dico che odio CVS appassionatamente, devo anche dire che se ci sono utenti SVN ([[Subversion]]) tra il pubblico, potreste volervene andare. Perché a causa del mio odio di CVS ritengo Subversion il progetto meno sensato che sia mai cominciato. Per un po' lo slogan di Subversion era ‘CVS fatto
# Supporto di un flusso di lavoro distribuito, simile a BitKeeper. Come BitKeeper, Git non usa un server centralizzato.
#: “BitKeeper non è solamente il primo sistema di controllo dei sorgenti che abbia mai pensato che valesse la pena usare; è stato anche il sistema che mi ha fatto capire perché ce ne sia effettivamente bisogno, e come si possa operare in modo efficace. Perciò, sebbene da un punto di vista tecnico Git sia molto diverso da BitKeeper (il che era un altro obiettivo di progettazione, perché volevo rendere chiaro che non era un clone di BitKeeper), molti dei procedimenti che usiamo con Git vengono direttamente dai procedimenti che abbiamo imparato da BitKeeper.”
Riga 55 ⟶ 54:
Il 16 giugno [[2005]] è stata pubblicata la versione 2.6.12 del kernel di Linux, la prima gestita con Git.
Sebbene fortemente influenzato da BitKeeper, Torvalds ha deliberatamente tentato di evitare approcci convenzionali, il che ha prodotto un sistema molto innovativo<ref>{{Cita web|url=https://www.ictea.com/cs/index.php?rp=%2Fknowledgebase%2F3484%2FiQue-es-el-software-de-control-de-versiones-GIT.html&language=italian|titolo=Che cosa è un software di controllo versione Git?|accesso=20 marzo 2025}}</ref>.
Torvalds ha sviluppato il sistema fino a quando è diventato usabile da utenti tecnici
== Descrizione ==
=== Caratteristiche ===
Il progetto di Git è la sintesi dell'esperienza di Torvalds nel mantenere un grande progetto di sviluppo distribuito, della sua intima conoscenza delle prestazioni del [[file system]], e di un bisogno urgente di produrre un sistema soddisfacente in poco tempo.
Queste influenze hanno condotto alle seguenti scelte implementative:
* Forte supporto allo sviluppo non lineare. Git supporta diramazione e fusione (branching and merging) rapide e comode, e comprende strumenti specifici per visualizzare e navigare una cronologia di sviluppo non lineare. Un'assunzione centrale in Git è che una modifica verrà fusa più spesso di quanto sia scritta, dato che viene passata per le mani di vari revisori. Torvalds stesso fa la maggior parte delle fusioni e una piccola parte delle correzioni dirette al codice, perciò egli stesso ha dimostrato che questo aspetto funziona bene.
Riga 69 ⟶ 67:
* Gestione efficiente di grandi progetti. Git è molto veloce e scalabile. È tipicamente un [[ordine di grandezza]] più veloce degli altri sistemi di controllo versione, e due ordini di grandezza più veloce per alcune operazioni<ref>{{Cita web|cognome=Dreier |nome=Roland |url=http://digitalvampire.org/blog/index.php/2006/11/16/oh-what-a-relief-it-is/ |titolo=Oh what a relief it is |data=13 novembre 2006}}, observing that "git log" is 100x faster than "svn log" because the latter has to contact a remote server.</ref>.
* Autenticazione crittografica della cronologia. La cronologia di Git viene memorizzata in modo tale che il nome di una revisione particolare (secondo la terminologia Git, una "commit") dipende dalla completa cronologia di sviluppo che conduce a tale commit. Una volta che è stata pubblicata, non è più possibile cambiare le vecchie versioni senza che ciò venga notato. (Anche [[Monotone (software)|Monotone]] ha questa proprietà.)
* Progettazione del [[toolkit]]. Git è un insieme di programmi di base scritti in [[C (linguaggio)|linguaggio C]], e molti script di shell che forniscono comodi incapsulamenti. È facile concatenare i componenti per fare altre cose utili.
* Strategie di fusione intercambiabili. Come parte della progettazione del suo toolkit, Git ha un modello ben definito di una fusione incompleta, e ha più algoritmi per tentare di completarla. Se tutti gli algoritmi falliscono, tale fallimento viene comunicato all'utente e viene sollecitata una fusione manuale. Pertanto è facile sperimentare con nuovi algoritmi di fusione.
* La spazzatura si accumula fino a quando viene raccolta. Quando si abortisce un comando o si scartano delle modifiche si lasciano degli oggetti inutilizzabili nel database. Tipicamente, questi sono solo una piccola parte della cronologia continuamente crescente degli oggetti utili, ma il comando di recupero dello spazio, <code>git gc --prune</code>, può richiedere parecchio tempo.
Riga 90 ⟶ 88:
=== Implementazione ===
Le primitive di Git non costituiscono inerentemente
Torvalds spiega che, {{citazione|in molti modi si può considerare git come un filesystem — è indirizzabile in base al contenuto, e include il concetto di ''versione'', ma io in realtà l'ho progettato guardando il problema dal punto di vista di una persona esperta di ''filesystem'' (beh, i kernel sono quello che faccio), e effettivamente ho assolutamente ''zero'' interesse nel creare un sistema tradizionale di gestione della configurazione software.
Riga 100 ⟶ 98:
* Un oggetto ''albero'' è l'equivalente di una directory: contiene una lista di nomi di file, ognuno con alcuni bit di tipo e il nome di un oggetto blob o albero che è il file, il link simbolico, o il contenuto di directory. Questo oggetto descrive un'istantanea dell'albero dei sorgenti.
* Un oggetto ''commit'' (revisione) collega gli oggetti albero in una cronologia. Contiene il nome di un oggetto albero (della directory dei sorgenti di livello più alto), data e ora, un messaggio di archiviazione (log message), e i nomi di zero o più oggetti di commit genitori. Le relazioni tra i blob si possono trovare esaminando gli oggetti albero e gli oggetti commit.
* Un oggetto ''tag'' (etichetta) è un contenitore che contiene riferimenti a un altro oggetto, può tenere
I blob sono file binari "non parlanti" che conservano informazioni eterogenee, quali: file testuali o binari, immagini, [[codice sorgente]], [[File archivio|archivi]]. Qualsiasi tipo di file è compresso in un file binario prima di essere salvato in repository Git. Git ne calcola l'hash con l'algoritmo [[SHA-1]].<br />
L'[[Funzione di hash#Algoritmo di hash|hash]] è una sequenza di 40 caratteri alfanumerici, che rappresentano un numero [[esadecimale]], ed è utilizzato da Git per identificare in modo univoco qualsiasi commit nel repository, tracciando il file al suo interno e le eventuali modifiche effettuate. L'hash SHA-1 di un oggetto è unico, risultando lo stesso a prescindere dal repository e dal computer utilizzato.
Git calcola tale codice hash, e usa questo codice come nome dell'oggetto e come identificatore del suo contenuto: file con nomi e/o percorsi diversi, ma con identico contenuto (blob), condividono lo stesso hash.<ref>{{cita libro | autore = Ferdinando Santacroce | url = https://books.google.it/books?id=pf2RDwAAQBAJ&pg=PT52&lpg=PT52#v=onepage&q&f=false | titolo = Git: Guida per imparare a gestire, distribuire e versionare codice | pagine = pp. 47, 52-53 | editore = Apogeo | città = Milano | anno = 2017 | isbn = 9788850334759 | oclc = 1065376849 | accesso = 10 luglio 2019 | urlarchivio = https://archive.
L{{'}}''indice'' è uno strato intermedio che serve da punto di collegamento fra il database di oggetti e l'albero di lavoro.
Il database ha una struttura semplice. L'oggetto viene messo in una directory che corrisponde ai primi due caratteri del suo codice hash; Il resto del codice costituisce il nome del file che contiene tale oggetto. Quando si aggiunge un nuovo oggetto, questo viene memorizzato per intero dopo averlo compresso con [[zlib]].
Riga 147 ⟶ 145:
== Progetti correlati ==
=== Progetti che si basano su Git ===
*
* ''[[Cogito (software)|Cogito]]
* ''[[StGIT]]
*
* ''DarcsGit'' - un'estensione di [[Darcs]] che gli consente di interagire con i repositori Git<ref>{{Cita web |url=http://wiki.darcs.net/DarcsWiki/DarcsGit
*
=== Interfacce Web ===
*
*
* ''gitweb'' – un'implementazione in [[Perl]] mantenuta da Kay Sievers<ref>{{collegamento interrotto|1=[https://www.kernel.org/git/gitweb.cgi?p=linux/kernel/git/torvalds/linux-2.6.git;a=log gitweb] |
* ''wit'' – un'implementazione [[Python]] mantenuta da Christian Meder<ref>[http://www.grmso.net:8090/ wit] {{Webarchive|url=https://web.archive.org/web/20080119122646/http://grmso.net:8090/ |
*
* ''git-php'' – un'implementazione [[PHP]] di Zack Bartel<ref>[https://code.google.com/p/git-php/ git-php]
*
* ''[[Bitbucket]]'' usa i sistemi di controllo versione Git dall'ottobre 2011.
=== Visualizzazione della cronologia ===
*
*
* ''Giggle'' è una GUI [[GTK+]] ispirata da Gitk<ref>[https://web.archive.org/web/20071209104517/http://developer.imendio.com/projects/giggle Giggle]
*
*
* ''git-browser'' è un programma di consultazione della cronologia scritto in [[JavaScript]] che è utilizzabile in un browser web. (Pare che non consenta di esaminare le modifiche al codice, ma solo le descrizioni.)
== Note ==
|