Introduzione
Un file .gitignore elenca i pattern che Git deve trattare come untracked e non offrire mai di aggiungere. Mantiene fuori dal repository artefatti di build, segreti, metadati del sistema operativo e file temporanei dell'editor.
Sintassi dei pattern
name: corrisponde a file o directory chiamatinamea qualsiasi profondità./name: corrisponde solo alla radice del repository.name/: corrisponde solo alle directory.*.log: glob; corrisponde a qualsiasi file.log.**/build: corrisponde abuilda qualsiasi profondità.!important.log: ri-includi un path precedentemente ignorato.#all'inizio di una riga è un commento.
Un esempio realistico
# .gitignore
# Output di build
/dist/
/build/
*.o
*.pyc
# Dipendenze
/node_modules/
/vendor/
# Editor
.idea/
.vscode/
*.swp
# OS
.DS_Store
Thumbs.db
# Segreti
.env
*.pem
Più file .gitignore
Puoi mettere un .gitignore a qualsiasi livello. I pattern sono relativi alla directory del file, e i file più profondi sovrascrivono quelli più superficiali. C'è anche un file di ignore globale per le tue preferenze personali:
git config --global core.excludesFile ~/.gitignore_global
Usalo per file di swap dell'editor e spazzatura del sistema operativo, non per path specifici di progetto.
Tracciare file già tracciati
Aggiungere un path a .gitignore non lo rimuove dal repository. Smetti di tracciare un file mantenendolo su disco:
git rm --cached secrets.env
git commit -m "Stop tracking secrets.env"
Debug degli ignore
Perché Git sta ignorando (o non ignorando) un path? Chiedi:
git check-ignore -v path/to/file
L'output nomina il file e la riga che hanno fatto match.
Ordine di valutazione
Git valuta le regole di ignore da diverse fonti, in questo ordine: argomenti della riga di comando, poi file .gitignore per directory (dal più profondo), poi $GIT_DIR/info/exclude, infine il core.excludesFile globale. Le regole successive (più specifiche) sovrascrivono quelle precedenti, e una negazione (!pattern) re-include un path solo se la sua directory padre non è essa stessa esclusa. Questa ultima regola inciampa molti utenti:
# Sbagliato: non si può un-ignore un file in una directory ignorata
/build/
!/build/keep.log
# Giusto: ignora i contenuti ma mantieni la directory dentro
/build/*
!/build/keep.log
Per repository e exclude globali
Due meccanismi extra di ignore complementano .gitignore. Il file untracked per repository .git/info/exclude si applica solo al tuo clone (buono per file IDE che non vuoi committare in .gitignore per tutto il team). Il core.excludesFile globale si applica a tutti i tuoi repo:
echo ".idea/" >> .git/info/exclude
git config --global core.excludesFile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global
Usali per preferenze personali; riserva il .gitignore committato per le regole valide per tutto il team.
Errori comuni
Aggiungere secrets.env a .gitignore dopo che è già stato committato e assumere che il segreto sia sparito. È ancora nella storia; ruota il segreto e considera di usare git filter-repo per cancellarlo. Un'altra trappola: ignorare una directory con build quando intendevi /build, sopprimendo accidentalmente un file chiamato build in profondità nell'albero. Infine, committare .gitignore stesso è essenziale; senza di esso, ogni collaboratore deve inventare le proprie regole di ignore. .gitignore appartiene al repository, non fuori.