3 In vecchi sistemi di controllo di versione l'operazione standard per
4 ottenere dei file era il checkout. Ottenete così un insieme di file
5 corrispondenti a un particolare stato precedentemente salvato.
7 In Git e altri sistemi distribuiti di controllo versione, l'operazione
8 standard è il clonaggio. Per ottenere dei file si crea un 'clone' di
9 tutto il deposito. In altre parole, diventate praticamente un
10 http://it.wikipedia.org/wiki/Mirror_(informatica)[mirror] del server
11 centrale. Tutto ciò che può fare il deposito centrale, potete farlo
14 === Sincronizzazione tra computers ===
16 Posso tollerare l'idea di creare degli archivi *tar* o di utilizzare
17 *rsync* per backup di base. Ma a volte lavoro sul mio laptop, altre
18 volte sul mio desktop, e può darsi che nel frattempo le due macchine non
21 Inizializzate un deposito Git e fate un *commit* dei vostri file su una
22 macchina. Poi sull'altra eseguite:
24 $ git clone altro.computer:/percorso/verso/il/file
26 per creare una seconda copia dei file in un deposito Git. Da adesso in
30 $ git pull altro.computer:/percorso/verso/il/file HEAD
32 trasferirà lo stato dei file sull'altro computer aggiornando quello su
33 cui state lavorando. Se avete recentemente fatto delle modifiche
34 conflittuali dello stesso file, Git ve lo segnalerà e dovrete ripetere
35 nuovamente il commit, dopo che avrete risolto il conflitto.
37 === Controllo classico di file sorgente ===
39 Inizializzate il deposito Git dei vostri file:
43 $ git commit -m "Commit iniziale"
45 Sul server centrale inizializzate un 'deposito nudo' (*nudo* nella
46 terminologia Git) in una cartella qualunque:
51 $ touch proj.git/git-daemon-export-ok
53 Se necessario, lanciate il daemon:
55 $ git daemon --detach # potrebbe già essere in esecuzione
57 Per servizi di hosting Git, seguite le istruzioni per il setup del
58 deposito Git che inizialmente sarà vuoto. Tipicamente bisognerà riempire
59 un formulario in una pagina web.
61 Trasferite il vostro progetto sul server centrale con:
63 $ git push git://server.centrale/percorso/fino/a/proj.git HEAD
65 Per ottenere i file sorgente, uno sviluppatore deve eseguire:
67 $ git clone git://server.centrale/percorso/fino/a/proj.git
69 Dopo aver fatto delle modifiche, lo sviluppatore le salva in locale:
73 Per aggiornare alla versione corrente:
77 Tutti i conflitti nel momento del merge devono essere risolti e
82 Per inviare le modifiche locali al deposito centrale:
86 Se il server principale ha nuove modifiche introdotte da altri
87 sviluppatori, il push fallisce et lo sviluppatore deve aggiornarsi
88 all'ultima versione, risolvere eventuali conflitti , e provare di
91 Perché i comandi pull e push precedenti funzionino bisogna avere
92 accesso SSH. Comunque, chiunque può vedere il codice sorgente digitando:
94 $ git clone git://server.centrale/percorso/fino/a/proj.git
96 Il protocollo nativo git è come l'HTTP: non c'è nessuna autenticazione,
97 così che tutti possono ottenere il progetto. Quindi, per default, push è
98 proibito con protocollo git.
100 === File sorgente segreti ===
102 Per un progetto chiuso, omettete il comando touch, e assicuratevi di mai
103 creare un file chiamato `git-daemon-export-ok`. Il deposito in questo
104 caso non potrà più essere ottenuto con il protocollo git; solo chi ha
105 accesso SSH potrà vederlo. Se tutti i vostri deposito sono chiusi,
106 lanciare il daemon git non è necessario perché la comunicazione avviene
109 === Depositi nudi ===
111 Un deposito nudo (*bare repository*) si chiama così perché non possiede
112 una cartella di lavoro; contiene solo i file che sono solitamente
113 nascosti nella sottocartella `.git`. In altre parole, mantiene
114 unicamente la storia del progetto, e e non conserva nessuna versione.
116 Un deposito nudo gioca un ruolo simile a quello di un server principale
117 in un sistema di controllo di versione centralizzato: è dove è
118 localizzato il vostro progetto. Altri sviluppatori clonano il nostro
119 progetto da lì, e vi trasferiscono gli ultimi modifiche ufficiali.
120 Tipicamente si trova su un server che non fa altro che distribuire dati.
121 Lo sviluppo avviene nei cloni, così che il deposito principale non ha
122 bisogno di una cartella di lavoro.
124 Molti comandi git non funzionano per depositi nudi, a meno che la
125 variabile globale `GIT_DIR` non viene definita con il percorso al
126 deposito, o si utilizza l'opzione `--bare`.
130 Perché abbiamo introdotto il comando `push`, invece di affidarci
131 al più familiare comando `pull`? Prima di tutto il comando `pull` non
132 funziona con depositi nudi: in questo caso bisogna invece usare `fetch`,
133 un comando che discuteremo più tardi. Ma anche se avessimo un deposito
134 normale sul server centrale, usare `pull` sarebbe sarebbe scomodo.
135 Bisognerebbe per prima cosa connettersi al server e poi dare come
136 argomento a `pull` l'indirizzo della macchina dalla quale vogliamo
137 ottenere le modifiche. I firewalls potrebbero interferire nel processo,
138 e cosa faremmo se non avessimo nemmeno accesso shell al server?
140 In ogni caso, questo caso a parte, vi scoraggiamo l'uso di `push` per
141 via della confusione che potrebbe generare quando la destinazione ha una
144 In conclusione, mentre state imparando ad usare Git, usate `push` solo
145 se la destinazione è un deposito nudo; altrimenti usate `pull`.
147 === Fare il forking di un progetto ===
149 Stufi del modo in cui un progetto è amministrato? Pensate che potreste
150 fare un lavoro migliore? In questo caso, dal vostro server eseguite:
152 $ git clone git://server.principale/percorso/verso/i/files
154 Informate ora tutti del vostro fork del progetto sul vostro server.
156 In seguito potete includere le modifiche provenenti dal progetto
161 === Il sistema definitivo di salvataggio ===
163 Volete degli archivi ridondanti e geograficamente distribuiti? Se il
164 vostro progetto ha moti sviluppatori non c'è bisogno di fare niente!
165 Ogni clone del vostro codice è effettivamente un backup. Non solo dello
166 stato corrente, ma dell'intera storia del vostro progetto. Grazie al
167 hashing crittografico, se qualcuno dovesse avere un clone corrotto,
168 sarà individuato non appena si connetterà agli altri.
170 Se il vostro progetto non è molto popolare, trovate il più alto numero
171 possibile di server che possano ospitare dei cloni.
173 Il vero paranoico dovrebbe anche sempre annotarsi l'ultimo codice SHA1
174 dell'HEAD di 20 bytes in un posto sicuro. Deve essere sicuro, non
175 privato. Ad esempio, pubblicarlo in un giornale funzionerebbe bene,
176 visto che sarebbe difficile realizzare un attacco modificando tutte le
179 === Multi-tasking alla velocità della luce ===
181 Immaginiamo di voler lavorare simultaneamente su diverse funzionalità.
182 In questo caso fate un commit del progetto e eseguite:
184 $ git clone . /una/nuova/cartella
186 Grazie ai http://it.wikipedia.org/wiki/Collegamento_fisico[collegamenti
187 fisici], i cloni locali richiedono meno tempo e spazio che i backup
190 Potete ora lavorare simultaneamente su due funzionalità
191 indipendentemente. Ad esempio, potete modificare un clone mentre l'altro
192 sta compilando. Ad ogni modo, potete validare con 'commit' le vostre
193 modifiche e importare con `pull` i cambiamenti dagli altri cloni:
195 $ git pull /il/mio/altro/clone HEAD
197 === Controllo di versione da battaglia ===
199 State lavorando ad un progetto che usa qualche altro sistema di
200 controllo di versione, e vi manca disperatamente Git? In tal caso,
201 inizializzate un deposito Git nella vostra cartella di lavoro:
205 $ git commit -m "Commit iniziale"
209 $ git clone . /una/nuva/cartella
211 Ora navigate alla nuova cartella e lavorate da qua, utilizzando Git come
212 volete. Di tanto in tanto, quando volete sincronizzarvi con gli altri,
213 recatevi nella cartella originale, sincronizzate utilizzando l'altro
214 sistema di controllo di gestione, e poi digitate:
217 $ git commit -m "Sincronizzazione con gli altri"
219 Andate quindi nella nuova cartella e lanciate:
221 $ git commit -a -m "Descrizione delle mie modifiche"
224 La procedura per condividere le vostre modifiche con gli altri dipende
225 d'altro canto dall'altro sistema di controllo di versione. La nuova
226 cartella contiene i file con i vostri cambiamenti. Lanciate qualsiasi
227 comando dell'altro sistema di controllo di gestione sia necessario per
228 inviarli al deposito centrale.
230 Subversion, che è forse il migliore sistema di gestione di versione
231 centralizzato, è utilizzato da innumerevoli progetti. Il comando *git
232 svn* automatizza la procedura precedente per i depositi Subversion, e
233 può anche essere usato per esportare un progetto Git in un deposito
238 Mercurial è un sistema di controllo di versione che può funzionare
239 in tandem con Git in modo quasi trasparente. Con il plugin `hg-git` un
240 utente di Mercurial può, senza svantaggi, inviare a (push) e ottenere
241 (pull) da un deposito Git.
243 Scaricate il plugin `hg-git` con Git:
245 $ git clone git://github.com/schacon/hg-git.git
249 $ hg clone http://bitbucket.org/durin42/hg-git/
251 Sfortunatamente, non sembra ci sia un plugin analogo per Git. Per questa
252 ragione, mi sembra preferibile utilizzare Git piuttosto che Mercurial
253 per i depositi principali. Nel caso di un progetto Mercurial di solito
254 un volontario mantiene in parallelo un deposito Git che accomoda utenti
255 Git, mentre, grazie al plugin `hg-git`, un progetto Git accomoda
256 automaticamente utenti Mercurial.
258 Nonostante il plugin può convertire un deposito Mercurial in uno Git
259 trasferendolo in un deposito vuoto, questo è più facile con lo script
260 `hg-fast-export.sh`, ottenibile da:
262 $ git clone git://repo.or.cz/fast-export.git
264 Per fare una conversione, in una nuovo cartella eseguite:
267 $ hg-fast-export.sh -r /depot/hg
269 dopo aver aggiunto lo script al vostro `$PATH`.
273 Menzioniamo brevemente Bazaar perché è il sistema di controllo di
274 versione distribuito gratuito più popolare dopo Git e Mercurial.
276 Bazaar ha il vantaggio del senno di poi, visto che è relativamente
277 giovane; i suoi disegnatori hanno potuto imparare dagli errori commessi
278 nel passato e evitare gli scogli storici. Inoltre, i suoi sviluppatori
279 sono attenti a questioni come la portabilità e l'interoperabilità con
280 altri sistemi di controllo di versione.
282 Un plugin chiamato `bzr-git` permette agli utilizzatori di Bazaar di
283 lavorare con depositi Git in una certa misura. Il programma `tailor`
284 converte depositi Bazaar in depositi Git, e può farlo in maniera
285 incrementale, mentre `bzr-fast-export` è fatto per le conversioni
288 === Perché utilizzo Git ===
290 Ho originariamente scelto Git perché avevo sentito che era in grado di
291 gestire l'inimmaginabilmente ingestibile sorgente del kernel Linux. Non
292 ho mai sentito la necessità di cambiare. Git mi ha servito un servizio
293 impeccabile, e non sono mai stato colto alla sprovvista dai suoi
294 limiti. Siccome utilizzo primariamente Linux, i problemi che appaiono
295 sulle altre piattaforme non mi concernono.
297 In più preferisco programmi in C e scripts in bash rispetto agli
298 eseguibili tipo gli scripts Python: ci sono meno dipendenze, e sono
299 dipendente all'alta velocità di esecuzione.
301 Ho riflettuto a come migliorare Git, arrivando fino al punto di scrivere
302 la mia propria versione, ma solo come un esercizio accademico. Anche se
303 avessi completato il mio progetto, sarei rimasto a Git comunque, visto
304 che i vantaggi sarebbero stati minimi per giustificare l'utilizzazione
305 di un sistema solitario.
307 Naturalmente, i vostri bisogni e richieste probabilmente differiscono
308 dai miei, e quindi potreste trovarvi meglio con un altro sistema.
309 Nonostante ciò, non potete sbagliarvi scegliendo Git.