Mein Verfahren für den Umgang mit den Zeilenenden ist wie folgt (Kampf auf vielen Repos getestet):
Beim Erstellen eines neuen Repos:
- Setzen Sie
.gitattributes
das allererste Commit zusammen mit anderen typischen Dateien als .gitignore
und einREADME.md
Beim Umgang mit einem bestehenden Repo:
.gitattributes
Entsprechend erstellen / ändern
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
ist es, Pre-Commit-Hooks zu überspringen)
- Ich muss es oft genug tun, um es als Alias zu definieren
alias fixCRLF="..."
- Wiederholen Sie den vorherigen Befehl
- Ja, es ist Voodoo, aber im Allgemeinen muss ich den Befehl zweimal ausführen, beim ersten Mal werden einige Dateien normalisiert, beim zweiten Mal noch mehr Dateien. Im Allgemeinen ist es wahrscheinlich am besten zu wiederholen, bis kein neues Commit erstellt wird :)
- Gehen Sie einige Male zwischen dem alten (kurz vor der Normalisierung) und dem neuen Zweig hin und her. Nach dem Wechseln des Zweigs findet git manchmal noch mehr Dateien, die neu normalisiert werden müssen!
In .gitattributes
Ich erkläre alle Textdateien explizit als LF EOL, da Windows-Tools im Allgemeinen mit LF kompatibel sind, während Nicht-Windows-Tools nicht mit CRLF kompatibel sind (selbst viele Befehlszeilentools von nodejs setzen LF voraus und können daher die EOL in Ihren Dateien ändern).
Inhalt von .gitattributes
Mein .gitattributes
sieht normalerweise so aus:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Um herauszufinden, welche unterschiedlichen Erweiterungen von git im aktuellen Repo verfolgt werden, klicken Sie hier
Probleme nach der Normalisierung
Sobald dies erledigt ist, gibt es noch eine weitere Einschränkung.
Angenommen, Sie master
sind bereits auf dem neuesten Stand und normalisiert, und dann checken Sie aus outdated-branch
. Sehr oft markiert git viele Dateien direkt nach dem Auschecken dieses Zweigs als geändert.
Die Lösung besteht darin, ein falsches Commit ( git add -A . && git commit -m 'fake commit'
) durchzuführen und dann git rebase master
. Nach dem Rebase sollte das gefälschte Commit verschwinden.