#howto - Guida all'utilizzo di GIT, parte 5: ignorare
← Articolo precedente, parte 4: remote e branch
→ Articolo successivo, parte 6: stash, gitkeep e assume-unchanged
Quando si parla di software di versioning, Git
è sicuramente il primo programma che ci viene in mente. Rappresenta l’alternativa più diffusa a sistemi come svn
, utilizzata anche in ambito enterprise.
Rappresenta anche uno dei primi scogli che dipendenti alle prime armi affrontano in azienda.
Ecco quindi una guida passo passo a Git, parte 5: ignorare.
Obiettivi
Questo articolo affronterà i seguenti argomenti:
- gitignore
- troubleshoot
- caratteri jolly
- gitignore.io
File da ignorare
Dopo aver creato un nuovo progetto, il primo passo fondamentale è indicare una serie di file e cartelle da escludere dalla sincronizzazione. Non tutti i file sono destinati a essere sincronizzati, spesso all’interno dei progetti si trovano file che possono essere rigenerati, file binari o contenenti informazioni sensibili.
Per gestire questa situazione, è necessario creare un file gitignore, che consiste in una lista di “percorsi” che Git ignorerà durante la verifica dei file modificati. Questo file risiede nella cartella principale del progetto e deve essere nominato .gitignore
(è importante che ci sia il punto davanti).
Il file supporta anche l’utilizzo di alcuni caratteri jolly, come *
, per indicare “qualsiasi combinazione di caratteri”, molto utile per specificare ad esempio solo le estensioni dei file.
Per esempio, nel caso di un progetto Java, potrebbe essere opportuno escludere dalla verifica di Git i file binari generati durante la compilazione dei sorgenti. In tal caso, il contenuto del file .gitignore
potrebbe essere:
bin/
*class
I caratteri jolly
Come spiegato, alcuni caratteri son visti dal file di gitignore come “caratteri jolly”, ovvero sono utilizzati per indicare gruppi di caratteri, negazioni o altro. Ecco una lista completa:
*
indica una qualunque sequenza di caratteri. Ad esempio*class
son tutti i file che finiscono ocnclass
?
indica un qualunque carattere singolo. Ad esempioMari?
rappresenta siaMario
cheMaria
che qualunque parola che inizia con Mari de ha un ulteriore carattere alla fine.!
: Esclude un pattern dal gitignore, utile quando si è utilizzato un carattere jolly per ignorare molti files, ma ci son eccezioni.- Ad esempio scrivendo prima
foglio?
e nella linea dopo!foglio2
si escludono tutti i file che iniziano con foglio, continuano con un carattere, ma non foglio2, che fa eccezione.
- Ad esempio scrivendo prima
#
: Indica un commento. Le righe che iniziano con # sono ignorate.[]
: Tra le parentesi quadre si può specificare un insieme di caratteri consentiti in una posizione specifica nel nome del file.- Ad esempio scrivendo
foglio[0123456789]
si ignoreranno tutti i file che iniziano con foglio e continuano con un numero.
- Ad esempio scrivendo
[!]
: Il contrario del precedente, indica un insieme di caratteri che devono essere esclusi dal pattern.- Ad esempio scrivendo
foglio[!2]
si ignoreranno tutti i file che iniziano con foglio e continuano con un carattere, ma non foglio2 che fa eccezione.
- Ad esempio scrivendo
\
: Permette di escludere caratteri speciali come [, ], , ?, e \ stessi. Ad esempio, foo* corrisponderà a un file chiamato foo, ignorando il carattere jolly *.
gitignore.io
Un sito utilizzatissimo per la gestione del gitignore è Gitignore.io, inserendo una serie di parole chiave genererà per voi un gitignore.
Ad esempio usando le parole chiave: “java” e “maven” si avrà:
# Created by https://www.toptal.com/developers/gitignore/api/java,maven
# Edit at https://www.toptal.com/developers/gitignore?templates=java,maven
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### Maven ###
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
# Eclipse m2e generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
# End of https://www.toptal.com/developers/gitignore/api/java,maven
Git-ignore
Un altro progetto molto interessante è git-ignore, un utility da terminale che si può trovare a questo link Github.
Questo progettino scritto in rust amplia le funzionalità di Git generando da linea di comando il gitignore.
Per utilizzarlo innanzitutto bisogna avere Rust, si proceda con l’installazione.
Installare Rust su Ubuntu
Per installare Rust su Ubuntu basta eseguire:
apt install cargo
Installare Rust su Fedora
Per installare Rust su Fedora basta eseguire:
dnf install cargo
Installare Rust su ArchLinux
Per installare Rust su ArchLinux basta eseguire:
pacman -S rust
Scaricare ed installare git-ignore
Innanzitutto si proceda con il download il progetto con git:
git clone https://github.com/janniks/git-ignore.git
quindi entrate nella cartella:
cd git-ignore
Quindi si può compilare il progetto con il tool cargo
, fornito insieme all’installazione di rust:
cargo build
il file che vi si genera nella cartella target/debug chiamato git-ignore
è il binario da usare.
Va trasferito in una cartella coperta da variabile d’ambiente PATH, ad esempio /usr/bin
:
cp target/debug/git-ignore /usr/bin/git-ignore
Ora alla creazione di un progetto si può digitare:
git-ignore
Oppure:
git ignore
Il software si scaricherà i template dal sito (bisogna avere una connessione attiva) darà la possibilità di scegliere il template direttamente da terminale, appendendo il risultato ad un attuale .gitignore
pre-esistente oppure creandone uno nuovo.
Nota:
La ricerca si aggiorna in tempo reale, alla pressione dei tasti appariranno i risultati, con un invio si selezionerà il template sotto cursore. Per terminare, dare un invio senza scrivere nulla.
Troubleshoot: Rimuovere un file precedentemente ignorato
Spesso mi è capitato di vedere la seguente scena: un progetto iniziato, alcuni file da ignorare committati e solo dopo un file .gitignore con quei file. I file però non si cancellano dal remote, e chiunque scarica il progetto se li ritroverà. Come fare?
Con queste semplici istruzioni. Per prima cosa va rimosso il file ma in cache:
git rm --cached percorso/file
Con questa istruzione il file verrà rimosso soltanto dalla cache ma non fisicamente, è ora possibile fare “commit di questa rimozione”:
git commit
Infine è possibile ora fare la push:
git push
Dal repository remoto il file sarà sparito, tuttavia in locale sarà ancora presente.