Git & Tricks – Pillole di source code management | Parte 1: un ambiente confortevole

0

Essere un sysadmin, un developer, un DevOp o addirittura un DevSecOp nel 2023 può voler dire tante cose, ma se c’è un aspetto comune relativo a queste figure è quello di non poter prescindere dagli strumenti che permettono di gestire il codice.

Perché tutto è codice.

Un concetto da sempre chiaro agli sviluppatori, e tutti i sysadmin hanno almeno sentito parlare una volta di Infrastructure As Code, ossia la metodologia che consente di convertire in codice interi datacenter. Vien quindi da se come padroneggiare il tool che consente una gestione fluida del codice sia diventato un requisito fondamentale per ogni operatore informatico.

E quel tool da ormai quasi un ventennio ha un solo nome: git.

Creato da Linus Torvalds, lo sviluppatore open-source più famoso di tutti i tempi e creatore del Kernel Linux, git è frutto dell’esigenza di collaborazione all’interno del team di sviluppo del Kernel, e come tutti gli strumenti di questo tipo va dritto al punto.

Questa serie di articoli vuole condividere alcuni suggerimenti, trucchi e best-practice sull’utilizzo di Git raccolti con vari appunti nel corso degli anni, con l’idea di creare una serie che nel tempo possa essere aggiornata ed arricchita per essere il più utile possibile a tutti.

Il repository di test

Chi vive nella linea di comando lo sa, c’è poco da fare, shortcut e automazioni sono la vera salvezza per la produttività, ed in questa prima parte verranno esplorati alcuni suggerimenti utili in questo senso.

Per svolgere gli esercizi verrà utilizzato un repository di test, nella cartella /git contenente semplici file di testo.

Il repository verrà inizializzato per utilizzare come branch principale main che oggi è il default su tutte le piattaforme online. In passato questo valore era master, ma nell’ottica di essere più inclusivi questo non è più utilizzato, pertanto il comando di inizializzazione sarà git init -b main:

/git # git init -b main
Initialized empty Git repository in /git/.git/

Per operare all’interno del repository è necessario indicare due dati essenziali da parte dell’operatore che sono il nome utente e la sua mail di riferimento, mediante il comando git config --global:

/git # git config user.name "Raoul Scarazzini"

/git # git config user.email "rasca@mmul.it"

Questi comandi inizializzeranno la creazione del file config molto importante nel contesto git, creato all’interno della directory del progetto .git ed il cui contenuto è in formato ini:

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[user]
	name = Raoul Scarazzini
	email = rasca@mmul.it

Nella cartella di progetto verranno creati cinque file, a cui verranno associati cinque commit:

/git # for FILEn in Primo Secondo Terzo Quarto Quinto; \
do echo "Contenuto del $FILEn file." > $FILEn\.txt; \
git add $FILEn\.txt; \
git commit -m "$FILEn commit" -m "Questa la descrizione estesa del $FILEn commit."; \
done

Il risultato dovrebbe essere qualcosa di simile a questo:

[main (root-commit) 8956c84] Primo commit
 1 file changed, 1 insertion(+)
 create mode 100644 Primo.txt
[main 988610d] Secondo commit
 1 file changed, 1 insertion(+)
 create mode 100644 Secondo.txt
[main 1d98266] Terzo commit
 1 file changed, 1 insertion(+)
 create mode 100644 Terzo.txt
[main ed13160] Quarto commit
 1 file changed, 1 insertion(+)
 create mode 100644 Quarto.txt
[main 8a8ce4b] Quinto commit
 1 file changed, 1 insertion(+)
 create mode 100644 Quinto.txt

Query e comandi alias

A questo punto il repository di test è popolato ed è già possibile interrogarlo per ricavarne informazioni, mediante git log, il quale invocato senza opzioni mostrerà la versione estesa dei commit in modalità paginabile.

Con le opportune opzioni però, git log potrà invece mostrare informazioni più sintetiche e compatte:

/git # git log --pretty=oneline
8a8ce4bfd333fe7e04dae08eeadc515dc5af13f3 (HEAD -> main) Quinto commit
ed13160750cd3f6bb5dcc72d65229f532583d5fc Quarto commit
1d982665aa7088d99cb37d666c647854930d0f5f Terzo commit
988610dc4f018c7fd92a910d0146cf969375c0f1 Secondo commit
8956c84893ecc8b2e166eecb351d131e3048459b Primo commit

Le funzioni passabili a git log sono numerose e possono passare da una versione del precedente output ancora più compatta:

/git # git log --graph --decorate --pretty=oneline --abbrev-commit --all
* 8a8ce4b (HEAD -> main) Quinto commit
* ed13160 Quarto commit
* 1d98266 Terzo commit
* 988610d Secondo commit
* 8956c84 Primo commit

Fino all’utilizzo di una specifica formattazione personalizzata, con tanto di colori:

/git # git log --graph --pretty=format:'%Cred%h%Creset - %Cgreen(%ci) %C(yellow)%d%Creset %s %C(bold blue)<%an>%Creset' --no-merges --no-abbrev-commit --date=relative
* 8a8ce4b - (2023-09-29 16:14:41 +0000)  (HEAD -> main) Quinto commit <Raoul Scarazzini>
* ed13160 - (2023-09-29 16:14:41 +0000)  Quarto commit <Raoul Scarazzini>
* 1d98266 - (2023-09-29 16:14:41 +0000)  Terzo commit <Raoul Scarazzini>
* 988610d - (2023-09-29 16:14:41 +0000)  Secondo commit <Raoul Scarazzini>
* 8956c84 - (2023-09-29 16:14:41 +0000)  Primo commit <Raoul Scarazzini>

Vien da sé come ricordarsi tutte queste opzioni possa risultare problematico, ed è proprio per questo che Git supporta nel file di configurazione di cui sopra la dichiarazione degli alias, il cui formato è il seguente:

[alias]                                                                         
        lol = log --graph --decorate --pretty=oneline --abbrev-commit           
        lola = log --graph --decorate --pretty=oneline --abbrev-commit --all    
        lg = log --graph --pretty=format:'%Cred%h%Creset - %Cgreen(%ci) %C(yellow)%d%Creset %s %C(bold blue)<%an>%Creset' --no-merges --no-abbrev-commit --date=relative

Creazione di uno standard operativo

Ma c’è di più.

Git offre la possibilità di dichiarare un file di configurazione generale, che deve risiedere nella home directory dell’utente e chiamarsi .gitconfig all’interno del quale possono essere dichiarate le opzioni di default che verranno adottate su ciascun repository.

Questo file offre la possibilità di non doversi più preoccupare per ciascun repository di inserire ad esempio il nome o la mail, ma di fare in modo che ogni comando git lanciato nel proprio sistema erediti le impostazioni dal file principale.

Interessante vero?

E la complessità di questo file dipende dalle proprie esigenze.

Per fare un esempio, il file che da sempre ho nella mia home directory ha questo contenuto:

[apply]
        whitespace = strip
[user]
        email = rasca@mmul.it
        name = Raoul Scarazzini                                                 
[color]
        diff = auto
        status = auto
        branch = auto
        ui = auto
        interactive = auto
[push]                                                                          
        default = matching                                                      
[core]                                                                          
        editor = vim                                                            
        pager = less -R                                                         
        abbrev = 12                                                             
[pager]                                                                         
        color = true                                                            
[alias]                                                                         
        cat = !cat @                                                            
        diverges = !bash -c 'diff -u <(git rev-list --first-parent "${1}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' -
        st = status
        ci = commit
        br = branch
        co = checkout
        df = diff
        up = !sh -c 'git pull --rebase --prune && git log --pretty=format:\"%Cred%ae %Creset- %C(yellow)%s %Creset(%ar)\" HEAD@{1}..'
        lol = log --graph --decorate --pretty=oneline --abbrev-commit
        lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
        ls = ls-files
        ds = diff --stat
        lg = log --graph --pretty=format:'%Cred%h%Creset - %Cgreen(%ci) %C(yellow)%d%Creset %s %C(bold blue)<%an>%Creset' --no-merges --no-abbrev-commit --date=relative
        csv = log --pretty=format:'\"%h\"\\%s\\%ci\\%an <%ae>' --no-abbrev-commit --date=relative

Curiosi di sapere tutti quegli alias cosa fanno? Non rimane che testarli, magari proprio sul repository di test creato per questo articolo.

Conclusioni

La prima parte dell’articolo si conclude qui, nei prossimi verranno illustrate le varie modalità di commit, il concetto di amend ed il terrore dei sette mari: il rebase!

La serie sino ad ora

Git & Tricks – Pillole di source code management | Parte 1: un ambiente confortevole

Git & Tricks – Pillole di source code management | Parte 2: gestire i commit con empatia

Git & Tricks – Pillole di source code management | Parte 3: l’importanza del rebase per un mondo migliore

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.