--- UPDATE 3 --- (widerspricht nicht UPDATE 2)
In Anbetracht des Falls, dass Windows-Benutzer lieber arbeiten CRLF
und Linux / Mac-Benutzer lieber LF
an Textdateien arbeiten. Bereitstellung der Antwort aus der Sicht eines Repository-Betreuers :
Für mich ist die beste Strategie (weniger Probleme zu lösen): Behalten Sie alle Textdateien mit LF
Inside Git Repo bei, auch wenn Sie an einem Windows-Projekt arbeiten. Geben Sie den Kunden dann die Freiheit, an dem von ihnen bevorzugten Zeilenendstil zu arbeiten , vorausgesetzt, sie wählen einen core.autocrlf
Eigenschaftswert aus, der Ihre Strategie (LF on Repo) berücksichtigt, während sie Dateien für das Festschreiben bereitstellen.
Staging ist das, was viele Leute verwirren, wenn sie versuchen zu verstehen, wie Newline-Strategien funktionieren. Es ist wichtig, die folgenden Punkte zu verstehen, bevor Sie den richtigen Wert für die core.autocrlf
Immobilie auswählen :
- Das Hinzufügen einer Textdatei zum Festschreiben ( Staging ) entspricht dem Kopieren der Datei an eine andere Stelle im
.git/
Unterverzeichnis mit konvertierten Zeilenenden (abhängig vom core.autocrlf
Wert in Ihrer Client-Konfiguration). All dies erfolgt vor Ort.
- Die Einstellung
core.autocrlf
ist wie eine Antwort auf die Frage (genau dieselbe Frage auf allen Betriebssystemen):
- "Sollte git-client a. LF-zu-CRLF konvertieren, wenn die Repo-Änderungen von der Fernbedienung ausgecheckt (gezogen) werden, oder b. CRLF-zu-LF konvertieren, wenn eine Datei zum Festschreiben hinzugefügt wird? " Und die möglichen Antworten (Werte) sind:
false:
" mach keines der oben genannten ",
input:
" mach nur b "
true
: " mach a und und b "
- Beachten Sie, dass es KEIN " do only a " gibt.
Glücklicherweise
- Die Standardeinstellungen des Git-Clients (Windows :
core.autocrlf: true
, Linux / Mac
core.autocrlf: false
:) sind mit der LF-Only-Repo- Strategie kompatibel .
Bedeutung : Windows-Clients werden beim Auschecken des Repositorys standardmäßig in CRLF konvertiert und beim Hinzufügen zum Festschreiben in LF konvertiert. Und Linux-Clients führen standardmäßig keine Konvertierungen durch. Dies hält theoretisch Ihr Repo nur für.
Unglücklicherweise:
- Möglicherweise gibt es GUI-Clients, die den Git-
core.autocrlf
Wert nicht berücksichtigen
- Es kann Leute geben, die keinen Wert verwenden, um Ihre lf-repo-Strategie zu respektieren.
core.autocrlf=false
Zum Beispiel verwenden sie eine Datei mit CRLF und fügen sie zum Festschreiben hinzu.
Um ASAP-Nicht-lf-Textdateien zu erkennen, die von den oben genannten Clients festgeschrieben wurden , können Sie den Anweisungen in --- Update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
auf einem Client folgen , der mit: --with-libpcre
flag kompiliert wurde ).
Und hier ist der Haken : . Ich als Repo-Betreuer behalte eine, git.autocrlf=input
damit ich falsch festgeschriebene Dateien reparieren kann, indem ich sie erneut für die Festschreibung hinzufüge. Und ich stelle einen Festschreibungstext bereit: "Korrigieren falsch festgeschriebener Dateien".
Soweit .gitattributes
bekannt. Ich zähle nicht darauf, weil es mehr UI-Clients gibt, die es nicht verstehen. Ich verwende es nur, um Hinweise für Text- und Binärdateien bereitzustellen und möglicherweise einige außergewöhnliche Dateien zu kennzeichnen, die überall die gleichen Zeilenenden behalten sollten:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Frage: Aber warum interessieren wir uns überhaupt für die Newline-Handling-Strategie?
Antwort: Um ein Festschreiben eines einzelnen Buchstabens zu vermeiden, wird es als Änderung mit 5000 Zeilen angezeigt, nur weil der Client, der die Änderung durchgeführt hat, die vollständige Datei automatisch von crlf in lf (oder umgekehrt) konvertiert hat, bevor er sie zum Festschreiben hinzufügt. Dies kann sehr schmerzhaft sein, wenn es sich um eine Konfliktlösung handelt . Oder es könnte in einigen Fällen die Ursache für unangemessene Konflikte sein.
--- UPDATE 2 ---
Die Fehler des Git-Clients funktionieren in den meisten Fällen. Selbst wenn Sie nur Windows-Clients, Linux-Clients oder beides haben. Diese sind:
- windows:
core.autocrlf=true
bedeutet, dass beim Auschecken Zeilen in CRLF und beim Hinzufügen von Dateien in LF konvertiert werden.
- Linux:
core.autocrlf=input
bedeutet, dass beim Auschecken keine Zeilen konvertiert werden müssen (dies ist nicht erforderlich, da erwartet wird, dass Dateien mit LF festgeschrieben werden) und beim Hinzufügen von Dateien keine Zeilen in LF konvertiert werden (falls erforderlich). ( - update3 - : Scheint, dass dies false
standardmäßig ist, aber es ist wieder in Ordnung)
Die Eigenschaft kann in verschiedenen Bereichen festgelegt werden. Ich würde vorschlagen, den Bereich explizit --global
festzulegen, um einige am Ende beschriebene IDE-Probleme zu vermeiden.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Außerdem würde ich dringend davon abraten , Windows zu verwenden git config --global core.autocrlf false
(falls Sie nur Windows-Clients haben), im Gegensatz zu dem, was für die Git-Dokumentation vorgeschlagen wird . Wenn Sie auf false setzen, werden Dateien mit CRLF im Repo festgeschrieben. Aber es gibt wirklich keinen Grund. Sie wissen nie, ob Sie das Projekt für Linux-Benutzer freigeben müssen. Außerdem ist dies ein zusätzlicher Schritt für jeden Client, der dem Projekt beitritt, anstatt Standardeinstellungen zu verwenden.
Nun können Sie für einige Sonderfälle von Dateien (z. B. *.bat
*.sh
), die mit LF oder CRLF ausgecheckt werden sollen, diese verwenden.gitattributes
Zusammenfassend ist für mich die beste Vorgehensweise :
- Stellen Sie sicher, dass jede nicht-binäre Datei mit LF auf Git Repo festgeschrieben wird (Standardverhalten).
- Verwenden Sie diesen Befehl, um sicherzustellen, dass keine Dateien mit CRLF festgeschrieben werden:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Hinweis: Auf Windows-Clients funktioniert dies nur über git-bash
und auf Linux-Clients, wenn es mit --with-libpcre
in kompiliert wurde. ./configure
)
- Wenn Sie solche Dateien finden, indem Sie den obigen Befehl ausführen, korrigieren Sie sie. Dies beinhaltet (zumindest unter Linux):
- set
core.autocrlf=input
( --- Update 3 - )
- Ändern Sie die Datei
- Änderung rückgängig machen (Datei wird weiterhin als geändert angezeigt)
- begehen Sie es
- Verwenden Sie nur das Nötigste
.gitattributes
- Weisen Sie die Benutzer an, die
core.autocrlf
oben beschriebenen Werte auf die Standardwerte zu setzen.
- Zählen Sie nicht 100% auf das Vorhandensein von
.gitattributes
. Git-Clients von IDEs können sie ignorieren oder unterschiedlich behandeln.
Wie gesagt, einige Dinge können in Git-Attributen hinzugefügt werden:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Ich denke, einige andere sichere Optionen für .gitattributes
anstelle der automatischen Erkennung für Binärdateien:
-text
(zB für *.zip
oder *.jpg
Dateien: Wird nicht als Text behandelt. Daher werden keine Konvertierungen am Zeilenende versucht. Diff ist möglicherweise durch Konvertierungsprogramme möglich.)
text !eol
(zB für *.java
, *.html
: Wird als Text behandelt, aber die Präferenz für den EOL-Stil ist nicht festgelegt. Daher wird die Client-Einstellung verwendet.)
-text -diff -merge
(zB für *.hugefile
: Nicht als Text behandelt. Kein Diff / Merge möglich)
--- VORHERIGES UPDATE ---
Ein schmerzhaftes Beispiel für einen Client, der Dateien falsch festschreibt:
Netbeans 8.2 (Windows), wird fälschlicherweise alle Textdateien mit Commit CRLFs, es sei denn , Sie haben ausdrücklich festgelegt , core.autocrlf
wie global . Dies widerspricht dem Standardverhalten des Git-Clients und verursacht später beim Aktualisieren / Zusammenführen viele Probleme. Dies führt dazu, dass einige Dateien auch beim Zurücksetzen anders aussehen (obwohl dies nicht der Fall ist) .
Das gleiche Verhalten in Netbeans tritt auch dann auf, wenn Sie .gitattributes
Ihrem Projekt korrekt hinzugefügt haben .
Wenn Sie nach einem Commit den folgenden Befehl verwenden, können Sie zumindest frühzeitig erkennen, ob in Ihrem Git-Repo Probleme mit dem Zeilenende auftreten: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Ich habe Stunden damit verbracht, die bestmögliche Nutzung zu finden .gitattributes
, um endlich zu erkennen, dass ich mich nicht darauf verlassen kann.
Leider besteht .gitattributes
die sichere Lösung darin, LF überall zu erzwingen, selbst auf Editorebene, solange es JGit-basierte Editoren gibt (die nicht richtig handhaben können).
Verwenden Sie die folgenden anti-CRLF
Desinfektionsmittel.
.gitattributes
?