Git und das Zeilenendeproblem

Problembeschreibung

Es gibt mehrere Optionen für das Zeilenende:

  • Windows (CR+LF)
  • Unix, Linux und Mac OS (ab OS X) (LF)
  • Mac (bis Version 9) (CR)

Das bedeutet, dass jedes Format anders ist, in der Größe weicht aber nur Windows ab, die Dateien sind größer, da zwei Zeichen das zeilenende markieren.

Die globalen Einstellungen dafür findet man in der Datei

C:\Users\Nutzer\.gitconfig

Den Speicherort dieser Datei kann man im Zweifelsfall mit


git config --global --edit

herausfinden.

In der Datei steht dann z.B.

[core]
autocrlf = true

Man kann sich die gesamt Konfiguration auch einfach mit git config --global --list anzeigen lassen. Außer dem Parameter global gibt es noch --system und --local. --system befindet sich in C:\Program Files\Git\etc\gitconfig und --local befindet sich in Laufwerk:\Vollständiger Pfad der Repo\.git\config Die obige Einstellung gilt global für alle Repos.

Problemlösung

Man kann diese Einstellung ändern mit git config --global core.autocrlf input Dadurch werden alle CRLF bis LF beim Festschreiben festgelegt. Oder git config --global core.autocrlf true Dadurch wird sichergestellt, dass beim Auschecken in Windows alle LF in CRLF konvertiert werden.

Daneben kann man die Einstellung auch für jede Repo festlegen, und zwar mit einer Datei .gitattributes Man beachte den Punkt am Beginn des Dateinamens. Dort kann man angeben: * text=auto Dadurch werden alle Dateien als Textdateien behandelt und beim Auschecken in die Zeile des Betriebssystems und beim automatischen Festschreiben wieder in LF konvertiert. Wenn Sie explizit mitteilen möchten, verwenden Sie

* text eol=crlf
* text eol=lf

Der erste ist für das Auschecken und der zweite für das Festschreiben.

*.jpg binary 

Behandle alle .jpg Bilder als Binärdateien. Also keine Umstellung nötig.

Test

Es wurde eine Repo angelegt. https://github.com/bpgs/zeilenendetest enthält drei am PC mit Notepad++ unter Windows angelegte Dateien. In Notepad++ gibt es die Möglichkeit, oben genannten unterschiedlichen Zielenendeoptionen zu verwenden. Diese drei Dateien sind:

  • format-zeilenende-mac.txt mit 107 Byte
  • format-zeilenende-unix.txt mit 107 Byte
  • format-zeilenende-win.txt mit 110 Byte

Wenn man die Repo als zip-Datei herunter lädt und entpackt haben sie die ursprüngliche Größe wie am PC erstellt.

Mit Git Gui wurde die Repo gecloned (Clone Existing Repository). Jetzt haben die Dateien:

  • format-zeilenende-mac.txt 107 Byte
  • format-zeilenende-unix.txt 110 Byte
  • format-zeilenende-win.txt mit 110 Byte

Die Unix-/Linux-Datei hat jetzt, wie man auch in Notepad++ sehen kann, ein Windows-Zeilenende. Wenn man jetzt in Git Gui die Repo auf Veränderungen überorüft, dann wird nur das veränderte Modification Date genannt.

git config --global -l zeigt den Wert core.autocrlf=true an.

Jetzt wird mit

git config --global core.autocrlf input

der Modus geändert. Dann habe ich die alte geclonte Repo auf dem PC gelöscht und wieder geclont. Nun haben sie

Jetzt haben die Dateien:

  • format-zeilenende-mac.txt 107 Byte
  • format-zeilenende-unix.txt 107 Byte
  • format-zeilenende-win.txt mit 110 Byte

Größenvergleich der Datei index.php im Wurzelverzeichnis des phpSQLiteCMS bzw. des MySQLiteCMS

  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\chirurg-tychy-cms-master-org\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\ilosuna-phpsqlitecms-d9b8219-mit-zusatz\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\ilosuna-phpsqlitecms-d9b8219-org\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-3-a-org\index.php: 6.014 Byte (auch UNIX-Zeilenende aber anderer Inhalt)
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-3-b-org\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-3-d-org\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-emanuel4you-anpassungen\index.php: 5.730 Byte
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-theasgar\index.php: 5.758 Byte (auch UNIX-Zeilenende aber anderer Inhalt)
  • E:\software\php\anwendungen\phpsqlitecms\phpsqlitecms-3.x\phpsqlitecms-master-ztatement\index.php: 5.758 Byte (auch UNIX-Zeilenende aber anderer Inhalt)
  • H:\xampp-webs\phpsqlitecms\www\3.2015.04.02-bs01\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\3.2015.04.02-org\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\emanuel4you\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mein-wunschname.4lima.de\index.php: 5.929 Byte (auch UNIX-Zeilenende aber anderer Inhalt)
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-01\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-02\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-03\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-04\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-05\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-06\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-07\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-08\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-09\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-10\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-11\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-12\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-13\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-14\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\github-15\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.0.1\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.1.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.2.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.3.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.4.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.5.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.5.1\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.0\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.1\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.2\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.3\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.4\index.php: 5.730 Byte
  • H:\xampp-webs\phpsqlitecms\www\mysqlitecms-github\MySQLiteCMS-Version-3.6.5\index.php: 5.730 Byte