5 Semplici Git Hooks per Gestire il Tuo Repository

5 Git Hooks 00 Immagine in Evidenza

Git è uno strumento brillante. Ti consente non solo di tenere traccia delle modifiche in un file tramite hook, ma anche di collaborare senza problemi con altre persone. In questo senso, Git è uno strumento che ha spinto in avanti lo sviluppo del FOSS.

Tuttavia, uno dei problemi più grandi con Git è che richiede tempo e impegno per gestire i tuoi repository. Ad esempio, effettuare commit e sincronizzare questi repository può richiedere da due a tre comandi git. Questo rende la loro gestione non solo noiosa, ma anche soggetta a errori da parte dell’utente. Qui ti mostriamo alcuni semplici, ma efficaci Git hooks per gestire meglio i tuoi repository.

Nota: puoi anche gestire Git in Emacs. Scopri come!

Indice dei Contenuti

  • Cosa Sono i Git Hooks?
    1. Prevenire il Push su Master
    1. Rifiutare i Push sul Branch Master
    1. Bloccare il Repository da Rebasing
    1. Forzare un Controllo di Stile e Sintassi sul Tuo Codice
    1. Notificare Automaticamente gli Utenti con le Modifiche al Repository
  • Domande Frequenti

Cosa Sono i Git Hooks?

Alla base, git-hook è un sottocomando flessibile che puoi utilizzare per creare script personalizzati che vengono eseguiti ogni volta che Git esegue un’azione su un repository. Ad esempio, è possibile utilizzare un hook per controllare automaticamente il tuo repository per errori di stile prima di effettuare un commit.

5 Git Hooks 02 Esempio Linter

Il sottocomando hook funziona leggendo la cartella “hooks” nella directory “ .git” del tuo repository. Questa cartella contiene un certo numero di file predefiniti che forniscono uno script di esempio per ogni azione in Git che puoi automatizzare.

5 Git Hooks 03 Directory Hooks Predefiniti

Per la maggior parte, puoi scrivere un git hook in qualsiasi linguaggio di scripting tu desideri. Questo lo rende incredibilmente flessibile e accessibile per qualsiasi sviluppatore software.

Suggerimento: per iniziare con Git, dovrai prima configurare il nome utente e l’email di Git. Scopri come in questa guida.

1. Prevenire il Push su Master

Uno degli errori più comuni che un utente commette in Git è quello di effettuare un push di un commit da un branch di sviluppo direttamente su master. Questo può essere incredibilmente frustrante se stai usando Github per tenere traccia e mantenere i tuoi progetti.

5 Git Hooks 04 Esempio Git Push

Puoi prevenire questo problema creando un Git hook “pre-push” che controllerà e confermerà ogni volta che cerchi di effettuare un push di un repository dal branch master.

  1. Vai al repository Git che desideri proteggere.

5 Git Hooks 05 Cd Al Repository

  1. Crea un file di hook Git con il tuo script di controllo. Poiché questo è un hook che dovrebbe essere eseguito prima di un “push”, devi creare un file di hook “pre-push”:
touch .git/hooks/pre-push
  1. Apri il tuo nuovo file di hook in un editor di testo.
nano .git/hooks/pre-push
  1. All’interno, scrivi il tuo nuovo hook “pre-push”. Ad esempio, il seguente è uno script che chiederà la tua conferma quando stai effettuando un push dal branch master:
#!/bin/sh  
  
protect='master'  
current=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')  
  
if[$protect = $current]  
then  
read-p"Conferma push su master? Y/n."-n1-r/dev/null  
then  
exit0  
fi  
exit1  
else  
exit0  
fi
  1. Salva il tuo nuovo hook. In nano, fai questo premendo Ctrl + O, poi Ctrl + X.

5 Git Hooks 07 Pre Push Hook Compilato

  1. Esegui il seguente comando per assicurarti che Git possa eseguire il tuo nuovo hook.
chmod +x .git/hooks/pre-push

2. Rifiutare i Push sul Branch Master

Oltre a prevenire il push su master, puoi anche creare un hook lato server che rifiuterà qualsiasi push sul suo branch master. Questo è incredibilmente utile se stai condividendo un repository con più sviluppatori.

5 Git Hooks 08 Esempio Git Log

Correggi questo creando un hook “pre-receive” che impedirà automaticamente a qualsiasi utente non autorizzato di effettuare push sul branch master.

  1. Crea il file Git hook “pre-receive” nel tuo repository remoto.
touch .git/hooks/pre-receive
  1. Apri questo file.
nano .git/hooks/pre-receive
  1. Aggiungi lo script di rifiuto nel tuo hook “pre-receive”. Ad esempio, le seguenti righe di codice dovrebbero funzionare subito:
#!/bin/sh  
  
branch=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')  
  
blacklist=(alice bob)  
  
if[[${blacklist[*]} =~ $USER]]; then  
if["$branch" == "master"]; then  
echo"Non sei autorizzato a effettuare commit in questo branch"  
exit1  
fi  
fi
  1. Salva il tuo nuovo file di hook. Nel mio caso, devo premere Ctrl + O, poi Ctrl + X per salvare il file.

  2. Salva il tuo script di hook e rendilo eseguibile.

chmod +x .git/hooks/pre-receive

Suggerimento: puoi anche utilizzare alias Git per rendere l’uso di Git più efficiente.

3. Bloccare il Repository da Rebasing

Un altro errore comune che un utente commette in Git è il rebasing del branch attivo corrente. Questo può essere un problema frustrante se stai lavorando su un repository con più collaboratori, poiché il rebasing rimuoverà i commit che altri utenti hanno effettuato.

5 Git Hooks 11 Pagina Man di Git Rebase

Puoi prevenire questo problema creando un hook “pre-rebase” che controllerà se il branch corrente è bloccato.

  1. Crea un file “pre-rebase” nella tua directory “ .git/hooks”:
touch .git/hooks/pre-rebase
  1. Apri questo file per modificarlo.
nano .git/hooks/pre-rebase
  1. Aggiungi lo script di rebase all’interno del tuo nuovo file di hook.
#!/bin/sh  
  
branch="$2"  
[-n"$branch"]||branch=$(git rev-parse--abbrev-ref HEAD)  
lock="branch.${branch}.rebaselock"  
  
if["$(git config --bool "$lock")" = true]; then  
echo"pre-rebase hook: "$lock" è impostato su true. Rifiuto di fare rebase."  
exit1  
fi
  1. Salva il tuo nuovo file di hook e rendilo eseguibile.
chmod +x .git/hooks/pre-rebase

4. Forzare un Controllo di Stile e Sintassi sul Tuo Codice

Uno degli usi più utili di un Git hook è collegarlo a un linter di codice. Questo è un programma semplice che controlla se il tuo codice segue lo stile e il formato per un progetto.

5 Git Hooks 14 Pagina Man di Shellcheck

  1. Per collegare un linter al tuo repository Git, prima crea un file di hook “pre-commit”.
touch .git/hooks/pre-commit
  1. Installa il linter appropriato per il linguaggio del tuo progetto. In questo caso, sto usando “shellcheck” per analizzare il mio codice Bash:
sudo apt install shellcheck
  1. Apri il tuo nuovo file di hook e aggiungi il seguente script.
#!/bin/bash  
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')  
do  
  
shellcheck "$file"# Esegui il linter per ogni nuovo file.  
  
if[$?-ne0]; then  
exit1# Termina il commit se il linter fallisce.  
fi  
done
  1. Salva il tuo nuovo file di hook e rendilo eseguibile:
chmod +x .git/hooks/pre-commit

5. Notificare Automaticamente gli Utenti con le Modifiche al Repository

Infine, puoi anche creare un Git hook che invierà automaticamente un’email ogni volta che il tuo repository riceve un nuovo commit. Questo è utile se desideri creare un semplice sistema di notifiche per il tuo repository.

  1. Crea un file di hook “post-receive” nella directory .git/hooks del tuo repository:
touch .git/hooks/post-receive
  1. Apri il tuo nuovo file di hook Git e inserisci il seguente script:
#!/bin/sh  
  
commit_message=$(git log-1--pretty=%B)  
users=("[email protected]""[email protected]""[email protected]")  
  
for user in"${users[@]}"; do  
    mail -s"Nuovo Commit: $commit_message"$user
  1. Salva il tuo nuovo file di hook e rendilo eseguibile.
chmod +x .git/hooks/post-receive

Domande Frequenti

Posso scrivere i miei Git hooks in un linguaggio compilato, come C?

Una delle maggiori limitazioni dei Git hooks è che richiede di utilizzare un linguaggio che puoi eseguire direttamente dal terminale. Questo significa che i Git hooks non supportano alcun linguaggio compilato per i loro script. Ad esempio, puoi creare un nuovo Git hook utilizzando Python o Shell, ma non C o C++.

È possibile eseguire più hook nello stesso repository Git?

Sì. Anche se gli esempi sopra mostrano gli hook come funzionalità singole e discrete, puoi facilmente combinarli per creare il tuo flusso di lavoro unico, rendendo i Git hooks incredibilmente flessibili e adattabili a qualsiasi situazione di codifica. Ad esempio, puoi utilizzare sia l’hook “Prevenire Push su Master” che l’hook “Controllo Sintassi” nel tuo repository.

Perché gli hook email di Git non inviano un’email agli utenti?

Questo problema è molto probabilmente dovuto al fatto che il tuo server remoto non è in grado di inviare correttamente email in uscita. Per risolvere questo, assicurati che il tuo server remoto sia sicuro e che abbia un agente di consegna email funzionante insieme a un dominio SMTP.

Crediti immagine: Unsplash. Tutte le modifiche e gli screenshot Ramces Red.