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
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.
Lascia un commento