Git e Git Lab

GitLab

Buongiorno a tutti! Quando si vuole programmare dei software di grandi dimensioni non è possibile scambiarsi i codici tramite pennetta USB o Google Drive. Abbiamo bisogno di qualcosa di più professionale. Qualcosa che effettui un versioning efficace e gestisca i conflitti all'interno del codice.
Questo software si chiama Git. Nella prima parte di questo post analizziamo l'utilizzo del comando Git e nella seconda parte ci occuperemo di installare Git Lab: il luogo in cui hostare i nostri progetti Git.

 

GIT
Innanzitutto dobbiamo verificare la presenza di git all'interno del nostro sistema:

sudo apt-get install git

oppure:

sudo dnf install git

Una delle cose fondamentali per poter utilizzare git è avere un repository git abilitato. Una volta che abbiamo questo repository, possiamo manipolarlo a nostro piacimento, utilizzando tutte le utility che ci vengono messe a disposizione da git stesso.
Quindi, vediamo come far in modo di abilitare un nostro progetto ossia un repository git.
Aprendo un terminale, digitiamo il seguente comando:

git init nome_progetto

dove banalmente “nome_progetto” è il nome della directory del nostro progetto.
Una volta che abbiamo abilitato il repository a git, se ci spostiamo dentro, e diamo il seguente comando:

ls -la

possiamo notare che è apparsa la seguente directory “.git”, dove ci sono tutte le impostazioni necessarie per far funzionare tutto correttamente.

ls-la

È buona norma non modificare niente all’interno di questa directory, a meno che non si sa cosa si sta facendo.

Bene, ora che abbiamo inizializzato il nostro progetto, possiamo manipolarlo a nostro piacere. Vediamo dei comandi che ci saranno molto utili nel lavorare con git.

Se ci posizioniamo all’inizio della nostra directory del progetto, e diamo il seguente comando:

git status

esso ci mostrerà tutte le modifiche che sono state effettuate all’interno del progetto, davvero molto utile nei casi in cui il nostro progetto è condiviso con altri sviluppatori.

 

 

COME FUNZIONA GIT
Nei progetti git, i file possono avere diversi stati.

 

Untracked
Inizialmente, quando un file è stato appena creato, si trova nello stato untracked. Questi file non fanno ancora parte del nostro repository git. Per far in modo di inserirli dobbiamo dare il seguente comando, sempre alla radice del nostro progetto:

git add .

In questo modo, ogni file che era nello stato untracked, ora è passato allo stato tracked. Volendo possiamo aggiungere anche dei singoli file, dove il comando di prima si trasforma nel seguente:

git add nome_file

in questo caso, solo il file nome_file verrà aggiunto nello stato tracked.
Il comando git add, non permette solo di aggiungere file dallo stato untracked allo stato tracked, ma di manipolare file che sono già nello stato tracked.

 

Tracked
In questo stato, un file può essere in tre situazioni diverse, ossia: staged, unmodified e modified.
Quando un file passa dallo stato untracked a questo, esso si trova in staged. Un file in questa situazione, ancora non fa’ parte del repository git. Per far in modo che esso diventi ufficialmente parte del repository, dobbiamo usare il seguente comando:

git commit -m “messaggio commit”

in tal modo, il file (o i file), si troveranno nella situazione unmodified, e finalmente faranno parte del nostro repository.
Se noi ora modifichiamo un file che è in questa situazione, esso andrà in modified, e per farlo ritornare in unmodified, dobbiamo ripetere la stessa procedura di prima, ossia farlo passare prima in staged con git add . e infine in unmodified con git commit -m “messaggio commit”.

git_lyfecycle

Git ci mette anche a disposizione una storia di tutti i commit eseguiti all’interno del nostro repository. Se vogliamo vederli tutti basta dare il seguente comando, sempre nella radice della directory:

git log

 

GIT COMANDI AVANZATI

Fin qui abbiamo visto dei comandi base che ci mette a disposizione git, ora vediamo le sue potenzialità.

 

Come avrete notato prima, lanciando il comando git log, esso vi avrà dato una storia di tutti i commit eseguiti nel repository. Ogni commit ha un identificativo univoco simile al seguente:

commit caed6baff27657925486911c60cf42be7d9e0abc

questo lungo codice esadecimale ci sarà di grande aiuto. Ogni volta che facciamo un commit, noi applichiamo una modifica al nostro progetto. Come facciamo se per caso abbiamo sbagliato e vogliamo tornare indietro? Git ci viene in aiuto utilizzando il seguente comando:

git checkout id-commit

dando questo comando, noi facciamo ritornare il nostro progetto al commit identificato dall’id “id-commit”, che è esattamente l’identificativo che otteniamo lanciando git log.

Dunque, come possiamo immaginare, i commit sono una sequenza di modifiche apportate al nostro progetto. Abbiamo l’ultimo commit effettuato, fino ad arrivare all’i-esimo commit. Possiamo immaginare tutti questi commit collegati tra di loro, come se fosse una lista, ossia il più recente punta a quello meno recente, che punta a quello ancora meno recente e cosi via.
All’inizio di questa lista abbiamo abbiamo la testa, ossia un’entità che fa’ riferimento all’ultimo commit effettuato. Questa cosa si chiama branch. Di default il branch principale è il master. Quindi in generale ogni commit effettuato, verrà inserito dentro il branch master.
Supponiamo di voler fare una modifica in parallelo, senza andar a toccare tale branch, ne servirebbe uno nuovo. Anche qui git ci viene in aiuto con il seguente comando:

git branch branch-name

in tal modo, abbiamo creato un nuovo branch.
Ora dobbiamo far in modo che i nuovi commit inseriti, siano messi dentro il nuovo branch da noi creato. Per far questo dobbiamo dire a git di non considerare più come branch principale master, ma il nostro nuovo branch. Tecnicamente, git modifica un HEAD che non farà più riferimento ad master ma al nuovo branch.
Per fare questo, diamo il seguente comando:

git checkout branch-name

bene, ora i commit saranno aggiunti al nuovo branch.
Una volta apportate le modifiche, può essere necessario far in modo di riunirle tutte in un unico branch.
Per far questo, possiamo utilizzare il seguente comando:

git merge branch-name

ossia prende tutte le modifiche contenute in branch-name e le inserisce all’interno del branch corrente.
Qui possono esserci dei problemi, ossia un file modificato in maniera diversa in entrambi i branch. In questo caso, git rileverà un conflitto, e non continuerà con il merge, fino a quando esso non sarà risolto ad esempio editando i file coinvolti.

Tutto quello che abbiamo visto fino ad ora, viene effettuato in locale, ossia nessun altro sviluppatore che sta collaborando con noi, vedrà le nostre modifiche. Come possiamo fare affinché anche gli altri vedano il nostro lavoro? Idealmente dobbiamo caricare da qualche parte in remoto il nostro repository aggiornato, e fare in modo che anche loro possano avere la stessa copia aggiornata.
Per fare questo, git ci viene in aiuto con pochi semplici comandi.
Come prima cosa, facciamo in modo di caricare il nostro progetto in remoto. Quindi dopo aver dato le varie “add” e i vari “commit”, diamo i seguenti comandi:

git remote add nostro_progetto 'url'
 git push

con il primo comando, specifichiamo dove sarà caricato in remoto il nostro progetto, (non dare questo comando se il progetto è stato ottenuto con git clone, tra poco vedremo come farlo), ed il secondo comando permette di mandare il nostro progetto direttamente all’url specificato.

Come fanno ora gli altri sviluppatori ad ottenere la versione aggiornata, o eventualmente scaricarsi tutto il progetto?

Nel primo caso basta dare il comando:

git pull

in questo modo esso scaricherà solo i file che sono stati modificati. Mentre se si vuole l’intero progetto, diamo il seguente comando:

git clone url

In tal modo, otteniamo il progetto completo, e successivamente, se vogliamo fare una “push”, non abbiamo la necessità di dover specificare l’url.

 

 

GIT LAB
Tutto quello che abbiamo visto fino ad ora su Git è solo una faccia della medaglia. L'altra risulta essere il luogo su cui risiede il repository di Git.
Le soluzioni sono varie. Possiamo affidarci a gestori di terze parti come GitHub ecc o utilizzare un nostro server per fare da host al nostro repository.
Questa soluzione ha due principali punti a favore:

  • Il repository resta su un nostro server, che quindi è privato.
  • Il costo di mantenimento è inferiore: infatti è possibile hostare anche con un piccolo server.

Per fare tutto questo utilizziamo il software Git Lab.

 

 

INSTALLAZIONE
Per la nostra esperienza abbiamo installato Git Lab su un Raspberry Pi 2. A seconda del server che utilizzate il pacchetto da selezionare è diverso. Per differenti sistemi operativi visitiamo questa pagina.

Per prima cosa installiamo tutti i pacchetti necessari con il comando:

sudo apt-get install curl openssh-server ca-certificates postfix apt-transport-https
 curl https://packages.gitlab.com/gpg.key | sudo apt-key add -

Una volta terminato il tutto, diamo il comando:

sudo curl -sS https://packages.gitlab.com/install/repositories/gitlab/raspberry-pi2/script.deb.sh | sudo bash

sudo apt-get install gitlab-ce

in modo da installare gitlab.
Ora non ci resta che far partire il server con:

sudo gitlab-ctl reconfigure

 

 

CONFIGURAZIONE DI SSMTP PER GIT LAB
Git Lab utilizza l'interfaccia sendmail per inviare mail ai suoi utilizzatori. In questo post abbiamo visto una configurazione base di SSMTP.
Per prima cosa seguiamo quindi questa guida per l'installazione e il primo utilizzo.

A questo punto dobbiamo configurare Git Lab in modo che questo utilizzi ssmtp.
Editiamo il file /etc/gitlab/gitlab.rb e inseriamo il listato seguente:

gitlab_rails['smtp_enable'] = true
 gitlab_rails['smtp_address'] = "smtp.server"
 gitlab_rails['smtp_port'] = 465
 gitlab_rails['smtp_user_name'] = "smtp user"
 gitlab_rails['smtp_password'] = "smtp password"
 gitlab_rails['smtp_domain'] = "example.com"
 gitlab_rails['smtp_authentication'] = "login"
 gitlab_rails['smtp_enable_starttls_auto'] = true
 gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

Andando a sostituire opportunamente le singole voci con i dati dell'account mail di sistema. Git Lab fornisce per alcuni gestori mail delle configurazioni già compilate. È possibile vederle visitando questa pagina.

Ridiamo a questo punto il comando:

sudo gitlab-ctl reconfigure

A questo punto verrete rediretti sulla pagina di Git Lab per la scelta di Username e Password.

 

 

CONSIDERAZIONI FINALI
Git e Git Lab sono due fenomenali software per il versioning e lo sviluppo condiviso. Fondamentali per effettuare sviluppo con altre persone e per sofware di certe dimensioni. Per questo è molto importante saperli usare e sapere che cosa sono.
Voi li conoscete? Li usate, o ne usate altri? Fatecelo sapere nei commenti!

 

 

FONTI

Dottore in Informatica. Appassionato di computer fin dal primo PC Olivetti con Windows 95 e la bellezza di 8 MB di RAM.
Utilizzatore Linux da 5 anni, credo profondamente nella filosofia open source.
Dopo tante distro provate sul mio fidato Toshiba, uso Fedora per lo studio e il divertimento.

2 risposte

  1. Bellissima spiegazione.
    Peccato che sono un vecchietto di 70 anni pieno di curiosità e passione per l'elettronica.
    Io sono rimasto quando c'erano le valvole ECL84, 6V6,EL36,ECC82-83-84,DY87 Quando si riparavano le TV.
    Ora tutto è cambiato, cerco di capire le nuove introduzioni di Arduino, Raspberry,Linux. Ma faccio fatica per la programmazione ! Un osso duro almeno per me.
    Come posso apprendere meglio questo scoglio? Cosa devo fare? Si può avere un aiuto da un Esperto.
    Saluto e ringrazio della visione.
    Mario Luosi

    • Emanuele Lovera - Blogger

      Ciao,
      Per apprendere Arduino ti consiglio inanzitutto la sezione Learning della pagina ufficiale di Arduino. Poi molta pratica. Se lavoravi nel campo delle televisioni non credo tu abbia problemi dal punto di vista dell'elettronica.
      Per la programmazione, il consiglio che mi sento di darti, e' fare attenzione all'idea che c'e' sotto e capire bene che cosa succede man mano che il codice viene eseguito da Arduino. Uno degli esercizi migliori e' simulare su carta che cosa succede. Lento ma efficace.
      Emanuele

Lascia un commento