Gemischte Zeilenenden: .gitattributes fehlt #26

Closed
opened 2026-08-23 16:56:26 +00:00 by florian.wilde · 1 comment
Owner

Problem

Im Repository liegen Dateien teils mit CRLF, teils mit LF. Beispiele mit
CRLF: src/server/actions/papierkorb.ts,
src/app/(app)/vorgaenge/[id]/page.tsx, tests/vorgaenge.test.ts.
Die meisten anderen Dateien haben LF.

Es gibt keine .gitattributes, die das vereinheitlicht.

Warum das eine Falle ist

Ein zeilenweise arbeitendes Werkzeug — sed -i, ein Formatierer, ein
Skript — schreibt die Datei mit LF zurück. Der Diff zeigt dann nicht die
drei geänderten Zeilen, sondern die ganze Datei. Genau das ist bei der
Arbeit an Issue #7 passiert (578 Diff-Zeilen statt 8); es fiel vor dem
Push auf, hätte aber ebenso gut durchgehen können.

Nebenwirkung: git diff --check meldet bei CRLF-Dateien jede hinzugefügte
Zeile als „trailing whitespace", weil es das CR so wertet. Damit ist die
Prüfung für diese Dateien wertlos.

Was ich will

  • .gitattributes mit * text=auto eol=lf, damit im Repository
    einheitlich LF steht
  • Die vorhandenen CRLF-Dateien in einem eigenen Commit normalisieren,
    der nur Zeilenenden ändert — damit die Historie lesbar bleibt
  • .sh-Dateien ausdrücklich auf LF festnageln (ein CRLF im Shebang
    macht das Update-Skript unter Linux unbrauchbar)

Akzeptanzkriterien

  • .gitattributes liegt im Wurzelverzeichnis
  • Kein \r\n mehr in versionierten Textdateien
  • Der Normalisierungs-Commit enthält keine inhaltlichen Änderungen
  • git diff --check meldet für neue Änderungen keine falschen
    Whitespace-Treffer mehr
  • scripts/*.sh behalten ihr Ausführungsrecht und LF-Enden

Hinweis

Keine Migration. Der Normalisierungs-Commit berührt viele Dateien —
vorher sicherstellen, dass kein anderer Branch offen ist.

Angelegt auf Zuruf im Chat, nicht aus dem Dashboard — bitte in Nebula
nachtragen.

## Problem Im Repository liegen Dateien teils mit CRLF, teils mit LF. Beispiele mit CRLF: `src/server/actions/papierkorb.ts`, `src/app/(app)/vorgaenge/[id]/page.tsx`, `tests/vorgaenge.test.ts`. Die meisten anderen Dateien haben LF. Es gibt keine `.gitattributes`, die das vereinheitlicht. ## Warum das eine Falle ist Ein zeilenweise arbeitendes Werkzeug — `sed -i`, ein Formatierer, ein Skript — schreibt die Datei mit LF zurück. Der Diff zeigt dann nicht die drei geänderten Zeilen, sondern die ganze Datei. Genau das ist bei der Arbeit an Issue #7 passiert (578 Diff-Zeilen statt 8); es fiel vor dem Push auf, hätte aber ebenso gut durchgehen können. Nebenwirkung: `git diff --check` meldet bei CRLF-Dateien jede hinzugefügte Zeile als „trailing whitespace", weil es das CR so wertet. Damit ist die Prüfung für diese Dateien wertlos. ## Was ich will - `.gitattributes` mit `* text=auto eol=lf`, damit im Repository einheitlich LF steht - Die vorhandenen CRLF-Dateien in einem eigenen Commit normalisieren, der **nur** Zeilenenden ändert — damit die Historie lesbar bleibt - `.sh`-Dateien ausdrücklich auf LF festnageln (ein CRLF im Shebang macht das Update-Skript unter Linux unbrauchbar) ## Akzeptanzkriterien - [ ] `.gitattributes` liegt im Wurzelverzeichnis - [ ] Kein `\r\n` mehr in versionierten Textdateien - [ ] Der Normalisierungs-Commit enthält keine inhaltlichen Änderungen - [ ] `git diff --check` meldet für neue Änderungen keine falschen Whitespace-Treffer mehr - [ ] `scripts/*.sh` behalten ihr Ausführungsrecht und LF-Enden ## Hinweis Keine Migration. Der Normalisierungs-Commit berührt viele Dateien — vorher sicherstellen, dass kein anderer Branch offen ist. _Angelegt auf Zuruf im Chat, nicht aus dem Dashboard — bitte in Nebula nachtragen._
florian.wilde added the in-arbeit label 2026-08-23 21:30:37 +00:00
florian.wilde started working 2026-08-23 21:34:04 +00:00
florian.wilde worked for 54 minutes 2026-08-23 22:28:21 +00:00
Author
Owner

🚀 Umgesetzt und nach main übernommen.

  • Merge-Commit: 9ea78a4
  • Pull Request: #36 (gemergt)
  • Gesamtaufwand: 00:54

Zwei Commits, bewusst getrennt

  1. .gitattributes mit * text=auto eol=lf — nur die Regel.
  2. Normalisierung der 29 Dateien: 7448 Zeilen, aber git diff --ignore-cr-at-eol darüber ist leer. Kein Zeichen Inhalt hat sich geändert. Beim Durchsehen der Historie lässt sich dieser Commit überspringen.

Shell-Skripte stehen zusätzlich einzeln in der Datei — ein \r im Shebang macht sie auf Linux unbrauchbar, und das sieht man ihnen nicht an. Nachgeprüft: alle drei enden auf \n, Ausführungsrecht 100755 unverändert.

Danach: null CRLF-Dateien, Arbeitsbaum sauber, 137 von 137 End-to-End-Tests grün, 655 Unit-Tests, Typecheck und Lint sauber.

So prüfst du es

  1. git switch main && git pull
  2. git ls-files -z | xargs -0 file | grep -c CRLF → 0
  3. git show --stat HEAD~1 zeigt den Normalisierungs-Commit; git show HEAD~1 --ignore-cr-at-eol ist leer.
  4. head -c 20 scripts/update.sh | od -c → Shebang endet auf \n, nicht \r\n.

Weder Changelog noch Version — sichtbar ändert sich nichts.

🚀 **Umgesetzt und nach `main` übernommen.** <!-- claude-status branch: fix/26-zeilenenden merge: 9ea78a4 pr: 36 zeit_sekunden: 3257 --> - Merge-Commit: `9ea78a4` - Pull Request: #36 (gemergt) - Gesamtaufwand: 00:54 **Zwei Commits, bewusst getrennt** 1. `.gitattributes` mit `* text=auto eol=lf` — nur die Regel. 2. Normalisierung der 29 Dateien: 7448 Zeilen, aber `git diff --ignore-cr-at-eol` darüber ist **leer**. Kein Zeichen Inhalt hat sich geändert. Beim Durchsehen der Historie lässt sich dieser Commit überspringen. **Shell-Skripte** stehen zusätzlich einzeln in der Datei — ein `\r` im Shebang macht sie auf Linux unbrauchbar, und das sieht man ihnen nicht an. Nachgeprüft: alle drei enden auf `\n`, Ausführungsrecht 100755 unverändert. **Danach:** null CRLF-Dateien, Arbeitsbaum sauber, 137 von 137 End-to-End-Tests grün, 655 Unit-Tests, Typecheck und Lint sauber. **So prüfst du es** 1. `git switch main && git pull` 2. `git ls-files -z | xargs -0 file | grep -c CRLF` → `0` 3. `git show --stat HEAD~1` zeigt den Normalisierungs-Commit; `git show HEAD~1 --ignore-cr-at-eol` ist leer. 4. `head -c 20 scripts/update.sh | od -c` → Shebang endet auf `\n`, nicht `\r\n`. Weder Changelog noch Version — sichtbar ändert sich nichts.
florian.wilde removed the in-arbeit label 2026-08-23 22:29:38 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Total Time Spent: 54 minutes
florian.wilde
54 minutes
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/betreuungs-cockpit#26