Come è stato progettato Git?


9

Di recente il mio posto di lavoro è passato a Git e lo adoro (e odio!). Lo adoro davvero ed è estremamente potente. L'unica parte che odio è che a volte è troppo potente (e forse un po 'conciso / confuso).

La mia domanda è ... Come è stato progettato Git? Usandolo per un breve periodo di tempo, si ha la sensazione che sia in grado di gestire molti flussi di lavoro oscuri che altri sistemi di controllo della versione non potrebbero. Ma è anche elegante sotto. E veloce!

Questo è senza dubbio in parte il talento di Linus. Ma mi chiedo, il design generale di git era basato su qualcosa? Ho letto di BitKeeper ma i conti sono scarsi sui dettagli tecnici. La compressione, i grafici, l'eliminazione dei numeri di revisione, l'enfasi sulla ramificazione, lo stashing, i telecomandi ... Da dove proviene tutto?

Linus ha davvero buttato questo fuori dal parco e praticamente al primo tentativo! È abbastanza buono da usare una volta superata la curva di apprendimento.


probabilmente potresti ricevere aiuto sul canale IRC git (#git su freenode)
yati sagade,


2
you get the feel that it can handle many obscure workflows that other version control systems could not: Probabilmente è perché è stato progettato per gestire il kernel linux, un pezzo di codice notoriamente hacker, grande e complesso.
yannis,

1
Nel decimo anniversario di Git, ecco un articolo di un'intervista a Torvalds: linux.com/news/featured-blogs/185-jennifer-cloer/…
Sridhar Sarnobat

Risposte:


17

Git non è stato progettato tanto quanto evoluto .

Dai un'occhiata da solo. Clona il repository git ufficiale , aprilo gitk(o il tuo visualizzatore di log git grafico preferito) e guarda le sue prime revisioni.

Vedrai che originariamente aveva solo le funzionalità fondamentali (il database degli oggetti e l'indice). Tutto il resto è stato fatto a mano . Tuttavia, questo piccolo core è stato progettato per essere facilmente automatizzato tramite script di shell. I primi utenti di git hanno scritto i propri script di shell per automatizzare attività comuni; a poco a poco, questi script sono stati incorporati nella distribuzione git (vedi per un primo esempio 839a7a0 ). Ogni volta che c'era un nuovo bisogno, gli script venivano adattati per consentirlo. Molto più tardi, molti di questi script sarebbero stati riscritti in C.

Questa combinazione di un nucleo pulito, ortogonale (che puoi ancora usare direttamente se ne hai bisogno), con uno strato superiore che è cresciuto organicamente su di esso, è ciò che dà a git il suo potere. Naturalmente, è anche ciò che gli dà la grande quantità di comandi e opzioni dai nomi strani.


La compressione, i grafici, l'eliminazione dei numeri di revisione, l'enfasi sulla ramificazione, lo stashing, i telecomandi ... Da dove proviene tutto?

Molto di ciò non era presente all'inizio.

Mentre ogni oggetto è stato compresso individualmente e i duplicati sono stati evitati dalla loro denominazione, i file "pack" che sono responsabili dell'alta compressione che siamo abituati a vedere in Git non esistevano. La filosofia all'inizio era "lo spazio su disco costa poco".

Se per "i grafici" intendi i visualizzatori grafici come gitk, sono apparsi più tardi (AFAIK, il primo era gitk). AFAIK, BitKeeper aveva anche un visualizzatore cronologico grafico.

Sbarazzarsi dei numeri di versione, in effetti il ​​concetto chiave di git di usare un filesystem indirizzato al contenuto per archiviare gli oggetti, proveniva principalmente dal monotono . A quel tempo, il monotono era lento; se così non fosse, è possibile che Linus lo avrebbe usato invece di creare git.

L'enfatizzazione della ramificazione è alquanto inevitabile su un sistema di controllo di versione distribuito, poiché ciascun clone agisce come una diramazione separata.

Stashing ( git stash) è, IIRC, abbastanza recente. I reflog, che utilizza, non erano presenti all'inizio.

Anche i telecomandi non c'erano inizialmente. Inizialmente, gli oggetti venivano copiati a mano utilizzando rsync.

Uno per uno, ognuna di queste funzioni è stata aggiunta da qualcuno. Non tutti, forse nemmeno la maggior parte, sono stati scritti da Linus. Ogni volta che qualcuno sente un bisogno che git non soddisfa, si può creare una nuova funzionalità sul livello "idraulico" di base di git e proporlo per l'inclusione. Se è buono, probabilmente verrà accettato, migliorando ulteriormente l'utilità di git (e la sua complessità da riga di comando).


"AFAIK, BitKeeper aveva anche un visualizzatore cronologico grafico." Sì, lo fa. Non è esattamente carino, ma è altamente funzionale. Vedi bitkeeper.com/Test.Using.Looking.html , anche se questo fa un cattivo lavoro nel mostrare come vengono visualizzati i rami.
Bryan Oakley,

1
Anche una lettura interessante, alcune e-mail selezionate dall'inizio di Git, che mostrano un po 'della sua evoluzione iniziale: kerneltrap.org/node/4982
CesarB,

I programmatori usavano emulare alcune funzionalità di git con cvs + rsync + httpd? Sarei interessato a sapere quali soluzioni casalinghe erano possibili.
Sridhar Sarnobat,

8

Penso che il punto principale sia semplicemente che git sia stato progettato dalla persona più qualificata del pianeta per farlo. E non sto parlando di talento, sto parlando di esperienza: dubito che ci sia qualcun altro che è stato responsabile di una base di codice con una combinazione comparabile di dimensioni e numero di contributori come il kernel Linux e che attualmente si occupa ancora della maggior parte dell'integrazione lavorare da solo.

Quindi Linus conosceva i requisiti e i casi d'uso di un sistema di controllo di versione distribuito meglio di chiunque altro. E naturalmente ha aiutato il fatto che la maggior parte di quel codice che stava trattando fosse in C, e gran parte della sua performance era critica.

Fondamentalmente è il massimo esempio di grattarsi il prurito.


6
"Singolo più qualificato"? Io non la penso così. Ci sono molte persone intelligenti qualificate per scrivere il controllo del codice sorgente distribuito. I ragazzi di BitMover (la compagnia dietro BitKeeper) sanno davvero cosa stanno facendo. Linus dà persino credito a Larry McVoy per avergli mostrato come dovrebbe funzionare il controllo del codice sorgente . Senza Larry non ci sarebbe niente da fare.
Bryan Oakley,

1
@BryanOakley, penso che possiamo evitare di colpire quando qualcuno sta completando qualcuno per qualcosa di buono. Tutti dentro sanno che questo requisito è un ottimo sviluppatore. Quindi, se domani ti viene presentato un grosso problema, potremmo ricordarti di te, come facciamo Dennis Ritchie. Nessuno è migliore dell'altro, solo che si sono imbattuti in un requisito riconosciuto in tutto il mondo e fornito prima una soluzione.
Pankaj Upadhyay,

2
@Bryan: Sono certo che l'esperienza nell'uso di BitKeeper abbia insegnato molto anche a Linus, e avrei dovuto menzionarlo. E sicuramente, ci sono molte altre persone intelligenti e qualificate che sanno cosa stanno facendo. Ma continuo a sostenere che l'esperienza di Linus nel mantenere il kernel lo rende il più qualificato, in termini di esperienza. Potrei sbagliarmi, ma puoi indicare un altro progetto così grande, con altrettanti collaboratori, e in cui la persona responsabile di tutto ciò è ancora così profondamente coinvolta nel far lavorare insieme il codice effettivo di tutti quei collaboratori?
Michael Borgwardt,

@Pankaj Upadhyay: non sto prendendo a pugni nessuno, stavo semplicemente spiegando perché ho annullato la votazione della risposta. Hai detto qualcosa a proposito di "fornito prima una soluzione" che penso significhi che pensi che Git sia stato in qualche modo "primo" in qualche modo. Cosa pensi sia stata la prima volta? Certamente non è stato il primo strumento scm distribuito da molto tempo.
Bryan Oakley,

1
@DeadMG: La parte più importante di questa affermazione viene dopo "... e gran parte delle sue prestazioni critiche". Dubito che troverai molti che sosterranno che C non è molto adatto all'implementazione di codice ad alte prestazioni a basso costo se lo conosci bene.
Michael Borgwardt,

6

È stato progettato praticamente esattamente come descritto in The Git Parable .

Immagina di avere un computer che non ha nient'altro che un editor di testo e alcuni comandi del file system. Ora immagina di aver deciso di scrivere un grande programma software su questo sistema. Poiché sei uno sviluppatore di software responsabile, decidi che devi inventare una sorta di metodo per tenere traccia delle versioni del tuo software in modo da poter recuperare il codice che hai precedentemente modificato o eliminato. Quella che segue è una storia su come è possibile progettare uno di questi sistemi di controllo della versione (VCS) e il ragionamento alla base di tali scelte di progettazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.