Ich habe viele verschiedene Fragen und Antworten zum Stapelüberlauf sowie eine Git- Dokumentation zur Funktionsweise der Einstellung core.autocrlf gelesen .
Dies ist mein Verständnis von dem, was ich gelesen habe:
Unix- und Mac OSX-Clients (Pre-OSX verwendet CR) verwenden LF-Zeilenenden.
Windows-Clients verwenden CRLF-Zeilenenden.
Wenn core.autocrlf auf dem Client auf true gesetzt ist, speichert das Git-Repository Dateien immer im LF-Zeilenendenformat, und Zeilenenden in Dateien auf dem Client werden beim Auschecken / Festschreiben für Clients (dh Windows), die nicht verwenden, hin und her konvertiert -LF-Zeilenenden, unabhängig vom Format der Zeilenendendateien auf dem Client (dies stimmt nicht mit der Definition von Tim Clem überein - siehe Update unten).
Hier ist eine Matrix, die versucht, dasselbe für die Einstellungen 'input' und 'false' von core.autocrlf mit Fragezeichen zu dokumentieren, bei denen ich mir nicht sicher bin, ob das Konvertierungsverhalten am Zeilenende endet.
Meine Fragen sind:
- Was sollen die Fragezeichen sein?
- Ist diese Matrix für die "Nicht-Fragezeichen" korrekt?
Ich werde die Fragezeichen aus den Antworten aktualisieren, da sich ein Konsens zu bilden scheint.
core.autocrlf Wert true input false -------------------------------------------------- -------- begehen | Konvertieren ? ? neu | in LF (in LF konvertieren?) (keine Konvertierung?) begehen | konvertieren zu ? Nein vorhanden | LF-Konvertierung (in LF konvertieren?) Kasse | konvertieren zu ? Nein vorhanden | CRLF-Konvertierung (keine Konvertierung?)
Ich bin nicht wirklich auf der Suche nach Meinungen zu den Vor- und Nachteilen der verschiedenen Einstellungen. Ich suche nur nach Daten, die deutlich machen, wie zu erwarten ist, dass Git mit jeder der drei Einstellungen funktioniert.
- -
Update 17.04.2012 : Nachdem ich den Artikel von Tim Clem gelesen habe, der von JJD in den Kommentaren verlinkt wurde, habe ich einige der Werte in den "unbekannten" Werten in der obigen Tabelle geändert und "vorhandene Kasse | true" geändert, um sie zu konvertieren in CRLF anstatt in Client konvertieren ". Hier sind die Definitionen, die er gibt, die klarer sind als alles, was ich anderswo gesehen habe:
core.autocrlf = false
Dies ist die Standardeinstellung, aber die meisten Benutzer werden aufgefordert, dies sofort zu ändern. Das Ergebnis der Verwendung von false ist, dass Git niemals mit Zeilenenden in Ihrer Datei herumspielt. Sie können Dateien mit LF oder CRLF oder CR oder einer zufälligen Mischung dieser drei einchecken, und Git ist das egal. Dies kann das Lesen von Unterschieden erschweren und das Zusammenführen erschweren. Die meisten Leute, die in einer Unix / Linux-Welt arbeiten, verwenden diesen Wert, weil sie keine CRLF-Probleme haben und Git keine zusätzliche Arbeit benötigen, wenn Dateien in die Objektdatenbank geschrieben oder in das Arbeitsverzeichnis geschrieben werden.
core.autocrlf = true
Dies bedeutet, dass Git alle Textdateien verarbeitet und sicherstellt, dass CRLF beim Schreiben dieser Datei in die Objektdatenbank durch LF ersetzt wird, und dass alle LF beim Schreiben in das Arbeitsverzeichnis wieder in CRLF umgewandelt werden. Dies ist die empfohlene Einstellung unter Windows, da dadurch sichergestellt wird, dass Ihr Repository auf anderen Plattformen verwendet werden kann, während CRLF in Ihrem Arbeitsverzeichnis beibehalten wird.
core.autocrlf = Eingabe
Dies bedeutet, dass Git alle Textdateien verarbeitet und sicherstellt, dass CRLF durch LF ersetzt wird, wenn diese Datei in die Objektdatenbank geschrieben wird. Das Gegenteil ist jedoch nicht der Fall. Wenn Sie Dateien wieder aus der Objektdatenbank lesen und in das Arbeitsverzeichnis schreiben, haben sie immer noch LFs, um das Zeilenende zu kennzeichnen. Diese Einstellung wird im Allgemeinen unter Unix / Linux / OS X verwendet, um zu verhindern, dass CRLFs in das Repository geschrieben werden. Die Idee war, dass Git sicherstellen würde, wenn Sie Code aus einem Webbrowser einfügen und versehentlich CRLFs in eine Ihrer Dateien einfügen, dass diese beim Schreiben in die Objektdatenbank durch LFs ersetzt werden.
Tims Artikel ist ausgezeichnet. Ich kann mir nur vorstellen, dass das Repository im LF-Format vorliegt, was nicht unbedingt der Fall ist, insbesondere für Windows-Projekte.
Der Vergleich von Tims Artikel mit der bisher am höchsten bewerteten Antwort von jmlane zeigt eine perfekte Übereinstimmung hinsichtlich der wahren und Eingabeeinstellungen und Uneinigkeit hinsichtlich der falschen Einstellung.
quelle
autocrlf
zu falsch scheint so viel einfacher;) stackoverflow.com/questions/2333424/...Antworten:
Die beste Erklärung für die Funktionsweise
core.autocrlf
finden Sie auf der Manpage gitattributes imtext
Abschnitt Attribute.So
core.autocrlf
scheint es derzeit zu funktionieren (oder zumindest seit Version 1.7.2, soweit mir bekannt ist):core.autocrlf = true
LF
Zeichen enthalten, werdenCRLF
in Ihrem Arbeitsbaum normalisiert . Dateien, dieCRLF
im Repository enthalten sind, werden nicht berührtLF
Zeichen im Repository enthalten, werden vonCRLF
bis normalisiert ,LF
wenn sie wieder in das Repository übernommen werden. Dateien, dieCRLF
im Repository enthalten sind, werden unberührt festgeschrieben.core.autocrlf = input
CRLF
Zeichen werden normalisiert,LF
wenn sie wieder in das Repository übernommen werden.core.autocrlf = false
core.eol
diktiert EOL-Zeichen in den Textdateien Ihres Arbeitsbaums.core.eol = native
Standardmäßig bedeutet dies, dass sich Windows-EOLsCRLF
und * nix-EOLsLF
in Arbeitsbäumen befinden.gitattributes
Einstellungen bestimmen die EOL-Zeichennormalisierung für Commits in das Repository (Standard ist die Normalisierung aufLF
Zeichen).Ich habe dieses Problem erst kürzlich untersucht und finde die Situation auch sehr kompliziert. Die
core.eol
Einstellung hat definitiv dazu beigetragen, zu verdeutlichen, wie EOL-Zeichen von git behandelt werden.quelle
core.autocrlf = false
, wenn ich nicht über einegitattributes
Datei bedeutet es , dass es keine Normalisierung sein? Oder bedeutet dies, dass die Standardnormalisierung verwendet wird?.gitattributes
Datei nicht Vorrang vor dercore.autocrlf
Einstellung haben?Das Problem der EOLs in Projekten mit gemischten Plattformen hat mein Leben lange Zeit miserabel gemacht. Die Probleme in der Regel entstehen , wenn es bereits Dateien mit unterschiedlichen und gemischten EOLs bereits im Repo. Dies bedeutet, dass:
CRLF
undLF
in derselben Datei.Wie dies geschieht, ist hier nicht das Problem, aber es passiert.
Ich habe unter Windows einige Konvertierungstests für die verschiedenen Modi und deren Kombinationen durchgeführt.
Folgendes habe ich in einer leicht modifizierten Tabelle erhalten:
Wie Sie sehen, gibt es zwei Fälle, in denen die Konvertierung beim Festschreiben erfolgt (3 linke Spalten). In den übrigen Fällen werden die Dateien unverändert festgeschrieben.
Beim Auschecken (3 rechte Spalten) gibt es nur einen Fall, in dem die Konvertierung erfolgt, wenn:
core.autocrlf
isttrue
undLF
EOL.Am überraschendsten für mich, und ich vermute, die Ursache für viele EOL-Probleme ist, dass es keine Konfiguration gibt, in der gemischte EOL wie
CRLF
+LF
normalisiert werden.Beachten Sie auch, dass "alte" Mac EOLs von
CR
nur auch nie konvertiert werden.Dies bedeutet, dass wenn ein schlecht geschriebenes EOL-Konvertierungsskript versucht, eine gemischte Enddatei mit
CRLF
s +LF
s zu konvertieren , indem nurLF
s inCRLF
s konvertiert wird, die Datei in einem gemischten Modus mit "einsamen"CR
s belassen wird, wo immer aCRLF
konvertiert wurdeCRCRLF
.Git konvertiert dann auch im
true
Modus nichts und EOL-Chaos geht weiter. Dies ist mir tatsächlich passiert und hat meine Dateien sehr durcheinander gebracht, da einige Editoren und Compiler (z. B. VS2010) Mac EOLs nicht mögen.Ich denke, die einzige Möglichkeit, diese Probleme wirklich zu lösen, besteht darin, gelegentlich das gesamte Repo zu normalisieren, indem alle Dateien im
input
oder imfalse
Modus ausgecheckt, eine ordnungsgemäße Normalisierung ausgeführt und die geänderten Dateien (falls vorhanden) erneut festgeschrieben werden. Nehmen Sie unter Windows vermutlich die Arbeit wieder aufcore.autocrlf true
.quelle
core.autocrlf true
. Ich persönlich glaube,input
dass das immer verwendet werden sollte.Mit dem kommenden Git 1.7.2 werden sich die Dinge im Bereich "EOL Conversion" ändern :
Eine neue Konfigurationseinstellung
core.eol
wird hinzugefügt / weiterentwickelt :Andere Entwicklungen werden in Betracht gezogen :
Git 2.8 (März 2016) verbessert die Art und Weise, wie
core.autocrlf
das EOL beeinflusst wird:Siehe commit 817a0c7 (23 Feb 2016), commit 6e336a5 , commit df747b8 , commit df747b8 (10 Feb 2016), commit df747b8 , commit df747b8 (10 Feb 2016) und commit 4b4024f , commit bb211b4 , commit 92cce13 , commit 320d39c , commit 4b4024f , Commit bb211b4 , Commit 92cce13 , Commit 320d39c (05. Februar 2016) von Torsten Bögershausen (
tboegi
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit c6b94eb, 26. Februar 2016)Wie Torek in den Kommentaren hinzufügt :
Weitere Informationen hierzu finden Sie unter " Was ist der Unterschied zwischen autocrlf und eol? ".
quelle
core.eol
geht aber darum, nur das "automatisch zu ändern", was Sie explizit in einer Datei deklarieren.gitattributes
. Dies unterscheidet sich von dem,core.autocrlf
was für jede Datei im Repo gilt. Es ist ein deklarativer Prozess.git add
und nicht zurgit commit
Zeit. (Beachten Sie jedoch, dassgit commit -a
oder--only
oder--include
fügen Sie dem Index zu diesem Zeitpunkt Dateien hinzu.) Für das, was es wert ist, hassen Sie, ich und Linus Torvalds die Idee, dass ein VCS jemals ändert, was festgeschrieben wird. Aber es gibt all diese Windows-Benutzer ... :-)core.autocrlf
Der Wert hängt nicht vom Betriebssystemtyp ab, sondern vom Windows-Standardwerttrue
und für Linux -input
. Ich habe 3 mögliche Werte für Commit- und Checkout-Fälle untersucht und dies ist die resultierende Tabelle:quelle
CR
allein werden nie berührt.false
Berührt niemals Zeilenenden.true
begeht immer alsLF
und checkt als ausCRLF
. Undinput
begeht immer wieLF
und checkt wie es ist.Hier ist mein bisheriges Verständnis für den Fall, dass es jemandem hilft.
core.autocrlf=true
undcore.safecrlf = true
Sie haben ein Repository, in dem alle Zeilenenden gleich sind , aber Sie arbeiten auf verschiedenen Plattformen. Git stellt sicher, dass Ihre Zeilenenden in den Standard für Ihre Plattform konvertiert werden. Warum ist das wichtig? Angenommen, Sie erstellen eine neue Datei. Der Texteditor auf Ihrer Plattform verwendet die Standardzeilenenden. Wenn Sie beim Einchecken nicht "core.autocrlf" auf "true" gesetzt haben, haben Sie eine Inkonsistenz für das Zeilenende für jemanden auf einer Plattform eingeführt, die standardmäßig ein anderes Zeilenende verwendet. Ich habe immer auch safecrlf eingestellt, weil ich wissen möchte, dass die crlf-Operation reversibel ist. Mit diesen beiden Einstellungen ändert git Ihre Dateien, überprüft jedoch, ob die Änderungen umkehrbar sind .
core.autocrlf=false
Sie haben ein Repository, in dem bereits gemischte Zeilenenden eingecheckt sind, und das Korrigieren der falschen Zeilenenden kann andere Probleme verursachen. In diesem Fall ist es am besten, git nicht anzuweisen, Zeilenenden zu konvertieren, da dies das Problem, für das es entwickelt wurde, verschärft. Dadurch werden Unterschiede leichter lesbar und Zusammenführungen weniger schmerzhaft. Mit dieser Einstellung ändert git Ihre Dateien nicht .
core.autocrlf=input
Ich verwende dies nicht, da der Grund dafür darin besteht, einen Anwendungsfall abzudecken, in dem Sie eine Datei mit CRLF-Zeilenenden auf einer Plattform erstellt haben, die standardmäßig LF-Zeilenenden enthält. Ich bevorzuge stattdessen, dass mein Texteditor immer neue Dateien mit den Standardeinstellungen für das Zeilenende der Plattform speichert.
quelle
Nein, die @ jmlane-Antwort ist falsch.
Für
Checkin (git add, git commit)
:text
EigenschaftSet, Set value to 'auto'
aktiviert ist , erfolgt die Konvertierung, wenn die Datei mit 'CRLF' festgeschrieben wurde.text
Eigentum istUnset
: nichts passiert, enen fürCheckout
text
Eigenschaft istUnspecified
, hängt die Konvertierung von abcore.autocrlf
autocrlf = input or autocrlf = true
die Konvertierung nur erfolgt, wenn die Datei im Repository 'LF' ist. Wenn es sich um 'CRLF' handelt, geschieht nichts.autocrlf = false
nichts passiertFür
Checkout
:text
Eigentum istUnset
: nichts passiert.text
Eigentum istSet, Set value to 'auto
: es hängt ab voncore.autocrlf
,core.eol
.core.eol
text
Eigentum istUnspecified
, kommt es darauf ancore.autocrlf
.2.1
2.2
text
Eigentum istUnspecified
Standardverhalten
Das Standardverhalten ist also
text
Eigenschaft istUnspecified
undcore.autocrlf = false
:Schlussfolgerungen
text
Eigenschaft festgelegt ist, hängt das Eincheckverhalten von sich selbst und nicht von autocrlf abquelle
Habe einige Tests sowohl unter Linux als auch unter Windows durchgeführt. Ich verwende eine Testdatei mit Zeilen, die auf LF enden, und Zeilen, die auf CRLF enden.
Die Datei wird festgeschrieben, entfernt und dann ausgecheckt. Der Wert von core.autocrlf wird vor dem Festschreiben und auch vor dem Auschecken festgelegt. Das Ergebnis ist unten.
quelle