Informationen zu Zeilenenden
Jedes Mal, wenn du auf der Tastatur die EINGABETASTE drückst, fügst du ein unsichtbares Zeichen ein, nämlich ein Zeilenende. Verschiedene Betriebssysteme handhaben Zeilenenden unterschiedlich.
Wenn du mit Git und GitHub an Projekten zusammenarbeitest, kann Git unerwartete Ergebnisse liefern, wenn du beispielsweise an einem Windows-Computer arbeitest und deine Projektmitarbeiterin eine Änderungen unter macOS vorgenommen hat.
Du kannst Git so konfigurieren, dass es Zeilenenden automatisch setzt, so dass Du effektiv mit Leuten zusammenarbeiten kannst, die verschiedene Betriebssysteme verwenden.
Globale Einstellungen für Zeilenabschlüsse
Der Befehl git config core.autocrlf
wird verwendet, um zu ändern, wie Git Zeilenenden verarbeitet. Dazu ist ein einziges Argument nötig.
Übergebe unter macOS einfach input
an die Konfiguration. Beispiel:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
Übergebe unter Windows einfach true
an die Konfiguration. Beispiel:
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
Übergebe unter Linux einfach input
an die Konfiguration. Beispiel:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
Repository-abhängige Einstellungen
Optional kannst du eine .gitattributes
-Datei konfigurieren, um zu verwalten, wie Git Zeilenenden in einem bestimmten Repository liest. Wenn du diese Datei in ein Repository committest, überschreibt sie die core.autocrlf
-Einstellung für alle Mitwirkenden des Repositorys. Dadurch wird ein konsistentes Verhalten für alle Benutzer unabhängig von ihren Git-Einstellungen und ihrer Umgebung sichergestellt.
Die Datei .gitattributes
muss im Stamm des Repositorys erstellt und wie jede andere Datei committet werden.
Eine .gitattributes
-Datei sieht wie eine Tabelle mit zwei Spalten aus:
- Links ist der Dateiname, den Git abgleichen soll.
- Rechts befindet sich die Konfiguration für Zeilenabschlüsse, die Git für diese Dateien verwenden soll.
Beispiel
Im Anschluss ist ein Beispiel für eine Datei vom Typ .gitattributes
angegeben. Du kannst sie als Vorlage für Deine Repositorys verwenden:
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
Wie du siehst, werden Dateien abgeglichen (*.c
, *.sln
, *.png
), durch ein Leerzeichen getrennt und dann mit einer Einstellung (text
, text eol=crlf
oder binary
) versehen. Nachfolgend sehen wir uns einige mögliche Einstellungen an.
-
text=auto
Git verarbeitet die Dateien so, wie es für sinnvoll erachtet wird. Das ist eine gute Standardoption. -
text eol=crlf
Git wandelt Zeilenenden beim Check-Out immer inCRLF
um. Verwende diese Einstellung für Dateien, die dieCRLF
-Enden behalten sollen, auch unter OS X oder Linux. -
text eol=lf
Git wandelt Zeilenenden beim Check-Out immer inLF
um. Verwende diese Einstellung für Dateien, die die LF-Abschlüsse behalten sollen, auch unter Windows. -
binary
Git erkennt, dass die angegebenen Dateien keine Textdateien sind, und versucht nicht, sie umzuwandeln. Diebinary
-Einstellung ist ein Alias für-text -diff
.
Ein Repository nach dem Ändern der Zeilenabschlüsse aktualisieren
Nachdem du die Option core.autocrlf
festgelegt oder eine Datei vom Typ .gitattributes
committet hast, ändert Git die Zeilenenden automatisch entsprechend deiner neuen Konfiguration. Möglicherweise meldet Git Änderungen an Dateien, die du nicht geändert hast.
Um sicherzustellen, dass alle Zeilenenden in deinem Repository mit deiner neuen Konfiguration übereinstimmen, sichere deine Dateien mit Git. Entferne dann alle Dateien, und stelle sie wieder her, um die Zeilenenden zu normalisieren.
-
Überprüfe vor dem Hinzufügen oder Committen von Änderungen, ob Git die Konfiguration ordnungsgemäß angewendet hat. Beispielsweise bestimmt Git automatisch, ob es sich bei Dateien in einem Repository um Text- oder Binärdateien handelt. Um eine Beschädigung von Binärdateien in deinem Repository zu vermeiden, wird empfohlen, Dateien in
.gitattributes
explizit als binär zu markieren. Weitere Informationen findest du in der Git-Dokumentation unter gitattributes - Defining attributes per path (gitattributes: Festlegen von Attributen pro Pfad). -
Um den Verlust lokaler Änderungen an Dateien im Repository zu vermeiden, füge alle ausstehenden Änderungen hinzu, und committe sie, indem du die folgenden Befehle ausführst:
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
Führe die folgenden Befehle aus, um alle Dateien im aktuellen Branch entsprechend der neuen Konfiguration zu aktualisieren:
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
Führe den folgenden Befehl aus, um die neu geschriebenen, normalisierten Dateien anzuzeigen:
Shell git status
git status
-
Führe optional den folgenden Befehl aus, um ausstehende Änderungen in deinem Repository zu committen:
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
Weiterführende Themen
- Anpassen von Git – Git-Attribute im Pro Git-Buch
- git-config auf der Manpage für Git
- Erste Schritte: Erstes Git-Setup im Pro Git-Buch
- Denke an das Ende deiner Zeile von Tim Clem