Das Symptom
Du änderst ein einziges Wort. git diff zeigt 400 geänderte Zeilen. Oder du klonst ein
Repository, rührst nichts an – und git status behauptet, du hättest die halbe Codebasis
umgeschrieben. Der Diff sieht aus, als sei etwas fürchterlich schiefgegangen.
Die „Layer 8“-Wahrheit
Es ist tatsächlich alles geändert. Nur nicht von dir, und nicht sichtbar.
Am Ende jeder Zeile steht ein unsichtbares Zeichen, und die Computerwelt hat sich nie
darauf einigen können, welches. Unix beendet eine Zeile mit einem Zeichen: LF. Windows
verwendet zwei: CR und LF, ein Erbe der Fernschreiber, bei denen der Druckkopf erst
zurückfahren und dann eine Zeile vorrücken musste. Diese Mechanik gibt es seit
Jahrzehnten nicht mehr. Das Zeichen ist geblieben.
Git vergleicht Bytes, nicht Absichten. Wenn eine Datei mit LF eingecheckt und auf einem
Windows-Rechner mit CRLF gespeichert wird, hat sich jede einzelne Zeile geändert – und
Git meldet das völlig korrekt. Der Diff lügt nicht. Er zeigt Ihnen eine Wahrheit, die Sie
nicht sehen können, weil Ihr Editor die Zeichen versteckt.
Der eigentliche Fehler liegt anderswo: Die meisten lösen das mit core.autocrlf auf ihrem
eigenen Rechner. Das funktioniert – für sie. Der nächste Kollege mit anderer Konfiguration
bringt das Problem umgehend zurück, und niemand versteht mehr, warum. Ein Problem, das das
gesamte Repository betrifft, gehört auch dort gelöst: in einer .gitattributes, die für
jeden gilt, der klont, egal auf welchem System er sitzt.
Die echte, verifizierte Lösung
1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:
1.Das Symptom erkennen
Sie ändern ein Wort, und git diff markiert 400 Zeilen als geändert. Oder git status meldet Dateien als verändert, die Sie nie angefasst haben. Beides sind klassische Anzeichen für einen Streit um die Zeilenenden – nicht für ein kaputtes Repository.
2.Die Ursache verstehen
Windows beendet eine Zeile mit zwei Zeichen (CRLF), Unix mit einem (LF). Wechselt eine Datei zwischen beiden Welten, ändert sich damit jede einzelne Zeile – zumindest aus Sicht von Git, das Bytes vergleicht und keine Absichten kennt.
3.Eine .gitattributes anlegen
Die einzige Lösung, die für alle im Team gilt, liegt im Repository selbst. Diese Datei legt fest, dass Textdateien im Repository einheitlich mit LF gespeichert werden – unabhängig davon, welches Betriebssystem der Einzelne benutzt.
* text=auto eol=lf
4.Binärdateien ausnehmen
Bilder, Archive und andere Binärdateien dürfen unter keinen Umständen umgeschrieben werden – das zerstört sie. Markieren Sie diese Typen ausdrücklich, damit Git die Finger von ihnen lässt.
*.png binary
*.jpg binary
*.pdf binary
5.Den Bestand einmalig normalisieren
Die neue Regel gilt zunächst nur für neu geschriebene Dateien. Der vorhandene Bestand muss einmalig umgestellt werden. Dieser Commit sollte nichts anderes enthalten – sonst geht die eigentliche Änderung in tausenden Zeilen unter.
git add --renormalize . && git commit -m "Zeilenenden normalisiert"
6.Nicht mit core.autocrlf herumdoktern
Diese Einstellung gilt nur auf Ihrem Rechner. Sie behebt das Problem für Sie und lässt es für alle anderen bestehen – und beim nächsten Kollegen mit anderer Konfiguration ist es wieder da. Ein Problem des Repositorys gehört im Repository gelöst.