Added clone.txt
[gitmagic.git] / it / clone.txt
blob030bb9ab422e972f2d9ca6f30c0b86f657d9fd8c
1 == Cloniamo ==
3 In vecchi sistemi di controllo di versione l'operazione standard per
4 ottenere dei files era il checkout. Ottenete così un insieme di files
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 files 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
12 anche voi.
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
19 si siano parlate.
21 Inizializzate un deposito Git e fate un *commt* dei vostri files su una
22 macchina. Poi sull'altra eseguite:
24  $ git clone altro.computer:/percorso/verso/il/file
26 per creare una seconda copia dei files in un deposito Git. Da adesso in
27 avanti,
29  $ git commit -a
30  $ git pull altro.computer:/percorso/verso/il/file HEAD
32 trasferirà lo stato dei files 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 files sorgente ===
39 Inizializzate il deposito Git dei vostri files:
41  $ git init
42  $ git add .
43  $ git commit -m "Commit iniziale"
45 Sul server central inizializzate un 'deposito nudo' (*nudo* nella
46 terminologia Git) in una cartella qualunque:
48  $ mkdir proj.git
49  $ cd proj.git
50  $ git init --bare
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 files surgente, 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:
71  $ git commit -a
73 Per aggiornare alla versione corrente:
75  $ git pull
77 Tutti i conflitti nel momento del merge devono essere risolti e
78 validati:
80  $ git commit -a
82 Per inviare le modifiche locali al deposito centrale:
84  $ git push
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
89 nuovo.
91 Perché i comandi pull e pushj 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
107 via SSH.
109 === Depositi nudi ===
111 Un deposito nudo (*bare repository*) si chiama così perché non possiede
112 una cartella di lavoro; contiene solo i files 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`.
128 === Push vs pull ===
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
142 cartella di lavoro.
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
157 originale con:
159  $ git pull
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 close 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
177 copie del giornale.
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
188 usuali.
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:
203  $ git init
204  $ git add .
205  $ git commit -m "Commit iniziale"
207 poi clonatelo:
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:
216  $ git add .
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"
222  $ git pull
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 files 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
234 Subversion.
236 === Mercurial ===
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 reposito Git.
243 Scaricate il plugin `hg-git` con Git:
245  $ git clone git://github.com/schacon/hg-git.git
247 o Mercurial:
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:
266  $ git init
267  $ hg-fast-export.sh -r /depot/hg
269 dopo aver aggiunto lo script al vostro `$PATH`.
271 === Bazaar ===
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
286 uniche.
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.