modulo 01 / lezione 05
Fondamenti e modello mentale
.gitignore, .gitattributes, fine riga, encoding
Decidere cosa entra in repo e cosa no, evitando file generati, segreti e differenze di piattaforma.
.gitignore, .gitattributes, fine riga, encoding
Un repository non deve contenere tutto ciò che appare nella cartella del progetto. Deve contenere ciò che serve a ricostruire, capire, testare e distribuire il progetto. Il resto è rumore, rischio o output generato.
.gitignore decide cosa Git deve ignorare. .gitattributes decide come Git deve trattare certi file: fine riga, diff, merge, linguaggio. Sono file piccoli, ma possono evitare giornate perse in diff inutili e conflitti artificiali.
Perché questa lezione conta
Committare file sbagliati crea danni reali:
- segreti esposti;
- repo pesante;
- conflitti su file generati;
- diff illeggibili;
- problemi tra Windows, macOS e Linux;
- build non riproducibili.
Un buon ignore non è una lista enorme copiata senza capire. È una scelta: quali file sono fonte, quali sono artefatti, quali sono locali, quali sono pericolosi.
Obiettivo operativo
Alla fine della lezione devi saper scrivere un .gitignore minimale per il tuo stack, capire perché un file già tracciato non viene ignorato e usare .gitattributes per normalizzare line ending e migliorare diff.
.gitignore
Esempio per progetto web:
# dipendenze installate
node_modules/
# build output
dist/
.astro/
# ambiente locale
.env
.env.*
!.env.example
# log e cache
*.log
.DS_Store
La riga !.env.example è una negazione: ignora .env, ma traccia un esempio senza segreti. È una pratica utile perché il team sa quali variabili servono senza esporre valori reali.
File già tracciati
.gitignore non rimuove file già entrati nel repository. Se hai committato dist/, aggiungere dist/ a .gitignore non basta.
Serve:
git rm -r --cached dist/
git commit -m "Rimuovi dist dal repository"
--cached rimuove dall’index e dalla storia futura, non dal disco. Il file resta locale, ma Git smette di tracciarlo.
Pattern utili
*.log # tutti i log
logs/ # cartella logs
/dist/ # dist solo alla radice
temp* # file/cartelle che iniziano per temp
!keep.log # eccezione
Attenzione alle negazioni: per ri-includere un file dentro una cartella ignorata, può essere necessario ri-includere anche la cartella.
.gitattributes
Esempio semplice:
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
*.jpg binary
package-lock.json merge=ours
text=auto chiede a Git di gestire file testuali in modo coerente. eol=lf impone LF per script shell, evitando problemi su Linux. I file binari vengono marcati come binari, così Git non prova a mostrare diff testuali inutili.
La regola merge=ours va usata con molta cautela: può nascondere conflitti reali. È utile solo per file rigenerabili dove la scelta è deliberata e documentata.
Fine riga
Il problema CRLF/LF appare spesso in team misti Windows/macOS/Linux. Senza regole, un file può risultare modificato anche se nessuno ha cambiato contenuto logico.
Configurazione consigliata nel repo:
* text=auto
*.js text eol=lf
*.ts text eol=lf
*.css text eol=lf
*.md text eol=lf
Meglio definire la policy nel repo che affidarsi alle configurazioni personali di ogni sviluppatore.
Segreti
.gitignore riduce il rischio, ma non è sicurezza completa. Se un segreto entra in un commit, consideralo compromesso. Anche se poi lo rimuovi, resta nella storia finché non la riscrivi e comunque potrebbe essere già stato copiato.
Regola pratica:
.envignorato;.env.exampletracciato;- scanner segreti in pre-commit o CI;
- rotazione immediata se un segreto viene committato.
Laboratorio guidato
Prendi un progetto reale. Esegui:
git status --ignored
Poi classifica i file non tracciati:
- sorgente da committare;
- generato da ignorare;
- locale da ignorare;
- sensibile da escludere e proteggere;
- dubbio da discutere nel README.
Scrivi o correggi .gitignore e aggiungi .gitattributes minimale.
Output atteso
Un commit con:
.gitignoremotivato;.gitattributesper line ending;- eventuale
.env.example; - rimozione da index dei file generati già tracciati.
Errori comuni
Copiare template enormi. Un ignore troppo grande può nascondere file che invece andrebbero versionati.
Ignorare dopo aver tracciato. Serve git rm --cached, non solo .gitignore.
Committare segreti e poi cancellarli. La cancellazione nel commit successivo non elimina il problema.
Non gestire fine riga nel repo. La coerenza deve viaggiare con il progetto.
Checklist di verifica
- so perché ogni voce del mio
.gitignoreesiste; .envè ignorato e.env.exampleè tracciato;- so rimuovere dall’index un file già tracciato;
.gitattributesgestisce almeno testo e binari principali;- il repo non contiene artefatti generati inutili.
Collegamenti
- Modulo: Fondamenti e modello mentale — lezione 5 del corso.
- Nel modulo 2 userai questi file per evitare commit sporchi e diff rumorosi.