Added it/drawbacks.txt
[gitmagic.git] / it / multiplayer.txt
blob00e8757db4a7e2977c843a75ee4150e45e2b5d6e
1 == Git multi-giocatore ==
3 Inizialmente usavo Git per progetti privati dove ero l'unico
4 sviluppatore. Tra i comandi legati alla natura distribuita di Git, avevo
5 bisogno solamente di *pull* e *clone* così da tenere lo stesso progetto
6 in posti diversi. 
8 Più tardi ho voluto pubblicare il mio codice tramite Git e includere
9 modifiche di diversi contributori. Ho dovuto imparare a gestire progetti
10 con multipli sviluppatori da tutto il mondo. Fortunatamente questo è il
11 punto forte di Git, e probabilmente addirittura la sua ragion d'essere.
13 === Chi sono? ===
15 Ogni commit ha il nome e l'indirizzo e-mail di un autore, i quali
16 sono mostrati dal comando *git log*. Per default Git utilizza i valori
17 di sistemamastery per definire questi campi. Per configurarli
18 esplicitamente, digitate:
20   $ git config --global user.name "John Doe"
21   $ git config --global user.email johndoe@example.com
23 Omettete l'opzione '--global' per configurare questi valori solo per il
24 deposito corrente. 
26 === Git via SSH e HTTP ===
28 Supponiamo che avete un accesso SSH a un server web sul quale Git non è
29 però installato. Anche se meno efficiente rispetto al suo protocollo
30 nativo, Git può comunicare via HTTP.
32 Scaricate, compilate e installate Git sul vostro conto, e create un
33 deposito nella vostra cartella web:
35  $ GIT_DIR=proj.git git init
36  $ cd proj.git
37  $ git --bare update-server-info
38  $ cp hooks/post-update.sample hooks/post-update
40 Con versioni meno recenti di Git il comando di copia non funziona e
41 dovete eseguire:
43  $ chmod a+x hooks/post-update
45 Ora potete trasmettere le vostre modifiche via SSH da qualsiasi clone:
47  $ git push web.server:/path/to/proj.git master
49 e chiunque può ottenere il vostro progetto con:
51  $ git clone http://web.server/proj.git
53 === Git tramite qualsiasi canale ===
55 Volete sincronizzare dei depositi senza server o addirittura senza
56 connessione di rete? Avete bisogno di improvvisare durante un'emergenza?
57 abbiamo già visto che<<makinghistory, *git fast-export* e *git
58 fast-import* possono convertire depositi in un semplice file, e
59 viceversa>>. Possiamo quindi inviare questo tipo di file avanti e
60 indietro per trasportare depositi Git attraverso un qualsiasi canale. Ma
61 uno strumento più efficace è il comando *git bundle*. 
63 Il mittente crea un pacchetto, detto 'bundle':
65  $ git bundle create qualche_file HEAD
67 poi trasmette il bundle, +qualche_file+, al destinatario attraverso
68 qualsiasi metodo: email, chiave USB, stampa e riconoscimento caratteri,
69 lettura di bit via telefono, segnali di funo, ecc. Il destinatario può
70 recuperare i commit dal bundle digitando:
72  $ git pull qualche_file
74 Il destinatario può effettuare ciò anche in deposito interamente vuoto.
75 Malgrado la sua dimensione, +qualche_file+ contiene l'intero deposito
76 Git originario.
78 Nel caso di progetti grandi, riducete gli sprechi includendo nel bundle
79 solo i cambiamenti che mancano nell'altro deposito. Per esempio,
80 supponiamo che il commit ``1b6d...'' è il commit più recente che è
81 condiviso dai due depositi. Possiamo ora eseguire:
83  $ git bundle create qualche_file HEAD ^1b6d
85 Se fatta di frequente, potremmo facilmente dimenticare quale commit è
86 stato mandato per ultimo. La pagina d'aiuto suggerisce di utilizzare
87 delle 'tag' per risolvere questo problema. In pratica, appena dopo aver
88 inviato il bundle, digitate:
90  $ git tag -f ultimo_bundle HEAD
92 e create un nuovo bundle con: 
94  $ git bundle create nuovo_bundle HEAD ^ultimo_bundle
96 === Le patch: la moneta di scambio globale ===
98 Le patch sono delle rappresentazioni testuali dei vostri cambiamenti che
99 possono essere facilmente comprensibili sia per computer che umani. È
100 quello che le rende interessanti. Potete mandare una patch per email ad
101 altri sviluppatori indipendentemente dal sistema di controllo di
102 versione che utilizzano. A partire dal momento che possono leggere le
103 loro email, possono vedere le vostre modifiche. Similarmente, da parte
104 vostra non avete bisogno che di un indirizzo email: non c'è neanche
105 bisogno di avere un deposito Git online
107 Ricordatevi dal primo capitolo, il comando:
109  $ git diff 1b6d > my.patch
111 produce una patch che può essere incollata in un'email per discussioni.
112 In un deposito Git, eseguite:
114  $ git apply < my.patch
116 per applicare la patch.
118 In un contesto più formale, quando è il nome e magari la firma
119 dell'autore devono essere presenti, generate le patch a partire da un
120 certo punto digitando:
122  $ git format-patch 1b6d
124 I file risultanti possono essere passati a *git-send-email*, o inviati
125 a mano. Potete anche specificare un intervallo tra due commit:
127  $ git format-patch 1b6d..HEAD^^
129 Dalla parte del destinatario salvate l'email in un file (diciamo
130 'email.txt') e poi digitate:
132  $ git am < email.txt
134 Questo applica le patch ricevute e crea inoltre un commit, includendo
135 informazioni come il nome dell'autore.
137 Se utilizzate un client email in un navigatore web potreste dover
138 cercare il modo di vedere il messaggio nel suo formato "raw" originario
139 prima di salvare la patch come file.
141 Ci sono delle leggere differenze nel caso di client email che si basano
142 sul formato mbox, ma se utilizzate uno di questi, siete probabilmente il
143 tipo di persona che riesce a risolverle senza bisogno di leggere questo
144 tutorial!
146 === Ci dispiace, abbiamo cambiato indirizzo ===
148 Dopo aver conato un deposito, l'esecuzione di *git push* o *git pull*
149 farà automaticamente riferimento all'URL del deposito d'origine. Come fa
150 Git? Il segreto risiede nelle opzioni di configurazione create durante
151 la clonazione. Diamoci un'occhiata:
153  $ git config --list
155 L'opzione +remote.origin.url+  determina l'URL della sorgente;
156 ``origin'' è l'alias del deposito d'origina. Come per la convenzione di
157 nominare ``master'' la branch principale, possiamo cambiare o cancellare
158 questo alias ma non c'è normalmente nessuna ragione per farlo. 
160 Se l'indirizzo del deposito originario cambia, potete modificare il suo
161 URL con:
163  $ git config remote.origin.url git://new.url/proj.git
165 L'opzione +branch.master.merge+ specifica la branch di default
166 utilizzata dal comando *git pull*. Al momento della clonazione iniziale
167 il nome scelto è quello della branch corrente del deposito originario.
168 Anche se l'HEAD del deposito d'origine è spostato verso un'altra branch,
169 il comando pull continuerà a seguire fedelmente la branch iniziale.
171 Quest'opzione si applicherà unicamente al deposito usato nel clonazione
172 iniziale, cioè quello salvato nell'opzione +branch.master.remote+. Se
173 effettuiamo un pull da un altro deposito dobbiamo indicare
174 esplicitamente quale branch vogliamo:
176  $ git pull git://example.com/other.git master
178 Questo spiega tra l'altro come mai alcuni dei precedenti esempi di
179 'push' e 'pull' non avevano nessun argomento.
181 === Branch remote ===
183 Quando cloniamo un deposito, cloniamo anche tutte le sue branch. Magari
184 non ve ne siete accorti perché Git le nascondei: dovete chiedere
185 esplicitamente di vederle. Questo impedisce alle branch del deposito
186 remoto d'interferire con le vostre branch, e rende l'uso di Git più
187 facile per i novizi. 
189 Per ottenere una lista delle branch remote eseguite:
191  $ git branch -r
193 Dovreste ottenere qualcosa come:
195  origin/HEAD
196  origin/master
197  origin/experimental
199 Questi sono le branch e l'HEAD del deposito remoto, e possono essere
200 usati in normali comandi Git. Supponiamo per esempio di aver fatto molti
201 commit e che ora volete paragonare le differenze con l'ultima versione
202 ottenibile con fetch. Potreste cercare nel log il codice SHA1
203 appropriato, ma è molto più semplice scrivere:
205  $ git diff origin/HEAD
207 Oppure potete anche vedere che cosa sta succedendo nella branch
208 ``experimental':'
210  $ git log origin/experimental
212 === Depositi remoti multipli ===
214 Supponiamo che due altri sviluppatori stanno lavorando sul vostro
215 progetto, e che vogliate tenerli d'occhio entrambi. Possiamo seguire
216 più  depositi allo stesso tempo con:
218  $ git remote add altro git://example.com/un_deposito.git
219  $ git pull altro una_branch
221 Ora abbiamo fatto un merge con una branch di un secondo deposito e
222 possiamo avere facile accesso a tutte le branch di tutti i depositi:
224  $ git diff origin/experimental^ altro/una_branch~5
226 Ma come fare se vogliamo solo paragonare i loro cambiamenti senza
227 modificare il nostro lavoro? I altre parole, vogliamo esaminare le loro
228 branch senza che le loro modifiche invadano la nostra cartella di
229 lavoro. In questo caso, invece di fare un pull, eseguite:
231  $ git fetch        # Fetch dal deposito d'origine, il default
232  $ git fetch altro  # Fetch dal secondo programmatore.
234 Questo fa un fetch solamente delle storie. Nonostante la cartella di
235 lavoro rimane intatta, possiamo riferirci a qualsiasi branch in
236 qualsiasi deposito con i comandi Git, perché ora abbiamo una copia
237 locale.
239 Ricordatevi che dietro le quinte, un *pull* è semplicemente un *fetch*
240 seguito da un *merge*. Normalmente facciamo un *pull* perché vogliamo
241 ottenere un merge delle ultime modifiche dopo aver fatto un fetch. La
242 situazione precedente è una notevole eccezione. 
244 Guardate *git help remote* per sapere come eliminare depositi remoti,
245 ignorare delle branch, e ancora di più.
247 === Le mie preferenze ===
249 Per i miei progetti mi piace che i contributori preparino depositi dai
250 quali posso fare in pull. Alcuni servizi di host Git permettono di
251 creare i vostri cloni di un progetto con il click di un bottone.  
253 Dopo aver fatto il fetch di una serie di modifiche, utilizzo i comandi
254 Git per navigare e esaminare queste modifiche che, idealmente, saranno ben
255 organizzate e descritte. Faccio il merge dei miei cambiamenti, e forse
256 qualche modifica in più. Una volta soddisfatto, faccio un push verso il
257 deposito principale.
259 Nonostante non riceva molto spesso dei contributi, credo che questo
260 approccio scali bene. In proposito, vi consiglio di guardare 
261 http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[
262 questo post di Linus Torvalds].
264 Restare nel mondo di Git è un po' più pratiche che usare file di
265 patch, visto che mi risparmia di doverli convertire in commit Git.
266 Inoltre, Git gestisce direttamente dettagli come salvare il nome
267 e l'indirizzo email dell'autore, così come la data e l'ora, e chiede
268 anche all'autore di descrivere i cambiamenti fatti.