La mia procedura per gestire i finali di linea è la seguente (test di battaglia su molti repository):
Quando si crea un nuovo repository:
- inserisci
.gitattributes
il primo commit insieme ad altri file tipici come .gitignore
eREADME.md
Quando si ha a che fare con un repository esistente:
- Crea / modifica di
.gitattributes
conseguenza
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
( --no-verify
è quello di saltare gli hook pre-commit)
- Devo farlo abbastanza spesso da definirlo un alias
alias fixCRLF="..."
- ripetere il comando precedente
- sì, è voodoo, ma generalmente devo eseguire il comando due volte, la prima volta che normalizza alcuni file, la seconda volta ancora più file. Generalmente è probabilmente meglio ripetere fino a quando non viene creato alcun nuovo commit :)
- andare avanti e indietro tra il vecchio (poco prima della normalizzazione) e il nuovo ramo alcune volte. Dopo aver cambiato il ramo, a volte git troverà ancora più file che devono essere rinormalizzati!
In .gitattributes
Dichiaro tutti i file di testo in modo esplicito come avere LF EOL poiché generalmente utensili di Windows è compatibile con LF, mentre non-Windows utensili non è compatibile con CRLF (anche molti nodejs comando strumenti da riga assumono LF e, quindi, possono cambiare l'EOL nei file).
Contenuti di .gitattributes
Di .gitattributes
solito il mio aspetto è:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Per capire quali estensioni distinte sono tracciate da git nel repository corrente, guarda qui
Problemi dopo la normalizzazione
Una volta fatto questo, c'è comunque un avvertimento più comune.
Dì che il tuo master
è già aggiornato e normalizzato, quindi fai il checkout outdated-branch
. Abbastanza spesso subito dopo aver verificato quel ramo, git contrassegna molti file come modificati.
La soluzione è fare un commit falso ( git add -A . && git commit -m 'fake commit'
) e poi git rebase master
. Dopo il rebase, il falso commit dovrebbe andare via.