Mondi su mondi, sistemi di sistemi.

Da Subversion a Git

Qualche tempo fa avevo descritto alcuni dei miei pro­ce­di­menti per snel­lire le pro­ce­dure di deploy­ment sfrut­tando gli hooks1 di Subversion.2

Addio Subversion, buon­giorno Git!

Da allora sono pas­sato a Git. Dovendo quindi rive­dere il pro­cesso ho cer­cato anche di sfrut­tare le poten­zia­lità di que­sto soft­ware per il con­trollo di ver­sione. Per chi non avesse mai sen­tito par­lare di Git, diciamo che la dif­fe­renza prin­ci­pale rispetto a Subversion è che il primo è un sistema distri­buito, men­tre il secondo è cen­tra­liz­zato3.

Perché Git?

La prima con­se­guenza è una distin­zione molto più netta fra il con­trollo di ver­sione e la pub­bli­ca­zione delle pro­prie modi­fi­che. In Subversion l’atto stesso di fare il com­mit implica la pub­bli­ca­zione della nostra attività.

Per alle­viare il pro­blema potremmo fare il com­mit su un ramo pri­vato per poi far con­fluire que­ste revi­sioni nel filone prin­ci­pale. Qui però ci scon­triamo con un secondo limite di Subversion che è una minore robu­stezza nel ricon­ci­liare le revi­sioni. Subversion cal­cola le dif­fe­renze al momento della ricon­ci­lia­zione, igno­rando la genea­lo­gia delle due revi­sioni; Git applica le ope­ra­zioni che hanno por­tato da una revi­sione all’altra.

Nuove pos­si­bi­lità

Comunque, il punto fon­da­men­tale in que­sto con­te­sto è che in virtù della natura distri­buita di Git, ogni repo­si­tory fa sto­ria a sé ed è anche per que­sto che può dia­lo­gare con altre repo­si­tory, scam­bian­dosi le revi­sioni. Possiamo quindi crearne più d’una, anche per un sin­golo pro­getto, ognuna con la pro­pria con­fi­gu­ra­zione e con gli hooks adatti. Facciamo un paio di esempi.

Il primo è quello in cui abbiamo due repo­si­tory, una per lo sta­ging e una per la pro­du­zione. Dalla mia mac­china di svi­luppo posso man­dare le revi­sioni sull’una o sull’altra, oppure spe­dire le revi­sioni da sta­ging a pro­du­zione: gli hooks pen­se­ranno al resto. In que­sto modo pos­siamo ripor­tare in pro­du­zione la ver­sione testata in sta­ging o, se neces­sa­rio, instal­lare una modi­fica urgente diret­ta­mente in produzione.

Il secondo riguarda i fil­tri, che di solito uso per minia­tu­riz­zare CSS e JavaScript, che si appli­cano all’entrata e all’uscita, per così dire, dei con­te­nuti dalla repo­si­tory. In que­sto caso, le ope­ra­zioni aggan­ciate a que­sti fil­tri hanno senso solo nelle fasi di deploy­ment, per­ché altri­menti ci por­te­remmo nel pro­getto le ver­sioni minia­tu­riz­zate. Per fare que­sto basta atti­varli solo sulla repo­si­tory di sta­ging ed entre­ranno in azione quando espor­te­remo da lì il sorgente.

Cos’è cam­biato negli script, quindi?

Il prin­ci­pio di base non è cam­biato e con­si­ste nello sfrut­tare gli hooks messi a dispo­si­zione, in par­ti­co­lare quello di post-receive, che viene appli­cato quando una repo­si­tory riceve delle revi­sioni da un’altra4. In aggiunta ho sfrut­tato la pos­si­bi­lità di defi­nire dei fil­tri per scar­tare alcuni file, come gli unit tests o appli­care delle tra­sfor­ma­zioni ad altri.

Dato che però ora ogni repo­si­tory fa sto­ria a sé, non esi­ste più un elenco di tutti i pro­getti da con­trol­lare; poi, visto che Git non usa un numero pro­gres­sivo per indi­care la ver­sione, le con­tor­sioni per tro­vare il tag cor­retto. Per il resto la logica è invariata.

  1. Ovvero, script ese­guiti in con­co­mi­tanza di deter­mi­nati eventi
  2. Coda & Subversion
  3. In realtà la que­stione è un po’ più com­plessa per­ché Git non nasce come VCS ma, di fatto, lo usano tutti per quello
  4. È inte­res­sante notare che non esi­stono agganci alla crea­zione di un tag su una repo­si­tory. Per farlo devo rice­vere la ver­sione tag­gata da un’altra repo­si­tory

Per proseguire

Commenti e trackback sono disabilitati.