Windows Git "Warnung: LF wird durch CRLF ersetzt", ist diese Warnung rückwärts?

146

env:

  • Windows 7
  • msysgit

Wenn ich git commit, heißt es:

warning: LF will be replaced by CRLF. 

Ist dieser Warnschwanz rückwärts?
Ich bearbeite Dateien in Windows, das Zeilenende ist CRLFgenau wie in diesem Bild:
Geben Sie hier die Bildbeschreibung ein
Und Git ändert es in, LFum sich zum Repo zu verpflichten.
Ich denke also, die richtige Warnung lautet:

warning: CRLF will be replaced by LF. 
Honghe.Wu
quelle
2
@devnull Ich meine, die Warnung ist Schwanz rückwärts, oder?
Honghe.Wu
@ Honghe.Wu Nein, es ist nicht unter Windows. Ich habe meine Antwort unten
VonC
11
Gute Frage, denn in der Tat scheint die Warnung rückwärts zu sein. Es ist wirklich verwirrend, diese Warnung über die Konvertierung in CRLF bei einem Commit zu erhalten, und es hilft nicht, Gits Umgang mit Leerzeichen zu erklären, da die Warnung rückwärts ist .
Stijn de Witt
1
@StijndeWitt Ich würde mich freuen, wenn Sie einen Kommentar als Antwort auf Ihre Bewertung abgeben.
user1460043

Antworten:

182

Warnung: LF wird durch CRLF ersetzt.

Je nach Editor Sie verwenden, um eine Textdatei mit LF wäre nicht notwendig , mit CRLF gespeichert: recent Editoren können bewahren EOL - Stil. Aber diese Git-Konfigurationseinstellung besteht darauf, diese zu ändern ...

Stellen Sie einfach sicher, dass (wie ich hier empfehle ):

git config --global core.autocrlf false

Auf diese Weise vermeiden Sie jede automatische Umwandlung und können sie dennoch über eine .gitattributesDatei und core.eolAnweisungen angeben .


Windows Git "LF wird durch CRLF ersetzt"
Ist diese Warnung rückwärts?

Nein, Sie arbeiten unter Windows und auf der git configHilfeseite wird dies erwähnt

Verwenden Sie diese Einstellung, wenn Sie CRLFZeilenenden in Ihrem Arbeitsverzeichnis haben möchten, obwohl das Repository keine normalisierten Zeilenenden hat.

Wie unter " Git ersetzen von LF durch CRLF " beschrieben, sollte es nur beim Auschecken (nicht beim Festschreiben) mit auftreten core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Wie in der Antwort von XiaoPeng erwähnt , ist diese Warnung dieselbe wie:

Warnung: (Wenn Sie es mit Ihrer aktuellen core.autocrlfKonfiguration auschecken / oder in einen anderen Ordner klonen ,) LF wird durch CRLF ersetzt.
Die Datei hat ihre ursprünglichen Zeilenenden in Ihrem (aktuellen) Arbeitsverzeichnis.

Wie in git-for-windows/gitAusgabe 1242 erwähnt :

Ich bin immer noch der Meinung, dass diese Nachricht verwirrend ist. Die Nachricht könnte um eine bessere Erklärung des Problems erweitert werden, zum Beispiel: "LF wird durch CRLF ersetzt, file.jsonnachdem die Datei entfernt und erneut ausgecheckt wurde."

Hinweis: Git 2,19 (September 2018), bei der Verwendung core.autocrlf, die gefälschten „LF wird durch CRLF ersetzt werden“ Warnung wird nun unterdrückt .


Wie Quaylar zu Recht bemerkt , ist es nur eine Konvertierung beim FestschreibenLF .

Diese spezielle Warnung " LF will be replaced by CRLF" stammt von convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Es heißt von convert.c#crlf_to_git(), selbst von convert.c#convert_to_git(), von convert.c#renormalize_buffer().

Und das letzte renormalize_buffer()wird nur von aufgerufen merge-recursive.c#blob_unchanged().

Ich vermute also, dass diese Konvertierung git commitnur dann erfolgt, wenn das Festschreiben Teil eines Zusammenführungsprozesses ist.


Hinweis: Mit Git 2.17 (Q2 2018) wird durch eine Codebereinigung eine Erklärung hinzugefügt.

Siehe Commit 8462ff4 (13. Januar 2018) von Torsten Bögershausen ( tboegi) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 9bc89b1 , 13. Februar 2018)

convert_to_git (): safe_crlf / checksafe wird zu int conv_flags

Beim Aufruf definierte convert_to_git()der checksafeParameter, was passieren soll, wenn die EOL-Konvertierung ( CRLF --> LF --> CRLF) nicht sauber umrundet.
Darüber hinaus wurde auch definiert, ob Zeilenenden renormiert ( CRLF --> LF) oder unverändert beibehalten werden sollen.

checksafe war eine safe_crlfAufzählung mit folgenden Werten:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Beachten Sie, dass eine in 8462ff4 (" convert_to_git(): safe_crlf/checksafewird int conv_flags", 2018-01-13, Git 2.17.0) im Git 2.17-Zyklus eingeführte Regression dazu führte , dass beim autocrlfUmschreiben trotz Einstellungsafecrlf=false eine Warnmeldung ausgegeben wurde .

Siehe Commit 6cb0912 (04. Juni 2018) von Anthony Sottile ( asottile) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 8063ff9 , 28. Juni 2018)

VonC
quelle
1
Ja, die meisten Editoren können den EOL-Stil beibehalten, aber bei den meisten Editoren hat dies keine Auswirkungen, wenn eine neue Datei im selben Projekt erstellt wird. Stellen Sie sicher, dass Sie kein LF-Projekt auschecken, denken Sie "psh, mein Editor kann LF-Zeilenenden verarbeiten, ich benötige kein Autocrlf" und vergessen Sie dann, neue Dateien manuell auf LF-Zeilenenden festzulegen.
15
@VonC Ich muss gestehen, dass ich es nicht verstehe. Das Git-Book gibt an, dass Git dies handhaben kann, indem CRLF-Zeilenenden beim Festschreiben automatisch in LF konvertiert werden und umgekehrt, wenn Code auf Ihrem Dateisystem ausgecheckt wird. Dies bedeutet, dass beim Festschreiben eine Konvertierung in LF und niemals in CRLF erfolgt . Dies bedeutet, dass die erwähnte Warnung falsch ist. Haben core.autocrlf=truewird immer in LF im Repo und CRLF im Arbeitsbaum imho ergeben (auch unter Nicht-Windows). Quelle: Link
Quaylar
12
"Ist diese Warnung rückwärts? Sie sollte nur beim Auschecken auftreten." Ich sehe diese genaue Warnung beim Festschreiben . Also ja , es ist rückwärts. Da ich rückwärts war, suchte ich danach. Ich bin froh, dass andere es auch bemerkt haben! Es ist sehr verwirrend für Leute, die diese Warnungen tatsächlich lesen, zu sehen, dass sie in einer Commit-Nachricht in CRLF konvertiert werden.
Stijn de Witt
7
"Ich vermute also, dass diese Konvertierung bei einem Git-Commit nur dann erfolgt, wenn das Commit Teil eines Zusammenführungsprozesses ist." Nee. Ich sehe dies bei regelmäßigen Commits.
Stijn de Witt
3
Der Teil, der mich an der Nachricht stört, ist, dass sie überhaupt auftaucht. Warum muss ich gewarnt werden, dass Git genau das tun wird, wofür ich es konfiguriert habe? Ich brauche keine Warnung mit der Aufschrift "Hey, wir konvertieren immer noch Zeilenenden für Sie, wie Sie uns darum gebeten haben". Wenn sich das System aufgrund seines Designs verhält, sollte es keine unnötigen Warnungen ausgeben, oder die Leute verpassen die wichtigen Warnungen in einem Meer irrelevanter Nachrichten.
Brent Larsen
27

JA, die Warnung ist rückwärts.

Und in der Tat sollte es überhaupt keine Warnung sein. Weil diese Warnung nur besagt (aber leider rückwärts), dass die CRLF-Zeichen in Ihrer Datei mit Windows-Zeilenenden beim Festschreiben durch LFs ersetzt werden. Dies bedeutet, dass es auf dieselben Zeilenenden normalisiert ist, die von * nix und MacOS verwendet werden.

Es passiert nichts Seltsames, das ist genau das Verhalten, das Sie normalerweise wollen würden.

Diese Warnung in ihrer aktuellen Form ist eines von zwei Dingen:

  1. Ein unglücklicher Fehler kombiniert mit einer übervorsichtigen Warnmeldung oder
  2. Eine sehr clevere Handlung, die Sie wirklich zum Nachdenken anregt ...

;)

Stijn de Witt
quelle
1
Was seltsam ist, ist, dass wenn Sie lokale Dateien unter Windows zwangsweise in LF konvertieren, Sie nicht einmal die Dateien hinzufügen können, die Nachricht sich beschwert und Ihr Commit ungültig macht.
Phpguru
24

- Update am 9. Juli ---

"Es ist korrekt und genau" wurde entfernt, wie von @mgiuca kommentiert

======

NEIN . Es geht NICHT um Ihre Dateien mit CRLF. Es geht stattdessen um Dateien mit LF.

Es sollte lauten:

Warnung: ( Wenn Sie es mit Ihrer aktuellen core.autocrlf-Konfiguration auschecken / oder in einen anderen Ordner klonen , wird LF durch CRLF ersetzt

Die Datei hat ihre ursprünglichen Zeilenenden in Ihrem ( aktuellen ) Arbeitsverzeichnis.

Dieses Bild sollte erklären, was es bedeutet. Geben Sie hier die Bildbeschreibung ein

Xiao Peng - ZenUML.com
quelle
1
Schöne Illustration. +1. Ich habe Ihre Antwort in meiner für mehr Sichtbarkeit verwiesen.
VonC
Was für mich gut funktioniert, ist: 1) core.autocrlf = false 2) in Intellij set Line Separator (\ n). Ich verwende Intellij Idea sowohl auf Mac als auch auf Windows.
Xiao Peng - ZenUML.com
Dies kann passieren, wenn die Datei in Windows erstellt wurde, aber ein Unix / Mac-Zeilenende (lf) hat und Ihre git config-Eigenschaft autocrlf true ist. Im Wesentlichen wird Git die von Ihnen erstellte Datei nicht ändern, aber es wird sie auschecken / mit Windows-Zeilenenden klonen (aufgrund Ihrer Autocrlf-Einstellung)
Patrick
1
Wie ist die Warnung korrekt und genau, wenn Sie sie mit "Wenn Sie sie auschecken / oder in einen anderen Ordner mit Ihrer aktuellen core.autocrlf-Konfiguration klonen" qualifizieren müssen? Das steht nicht in der Originalnachricht. Es heißt, dass es durch CRLF ersetzt wird (möglicherweise nicht), was bedeutet, dass es im CRLF-Modus im Repo selbst gespeichert wird, nicht in einer hypothetischen zukünftigen Prüfung.
mgiuca
12

All dies setzt voraus core.autocrlf=true

Ursprünglicher Fehler:

Warnung: LF wird durch CRLF ersetzt.
Die Datei hat ihre ursprünglichen Zeilenenden in Ihrem Arbeitsverzeichnis.

Was sollte der Fehler lauten:

Warnung: LF wird in Ihrem Arbeitsverzeichnis durch CRLF ersetzt.
Die Datei hat ihre ursprünglichen LF-Zeilenenden im Git-Repository

Erklärung hier :

Der Nebeneffekt dieser praktischen Konvertierung, und darum geht es in der Warnung, die Sie sehen, besteht darin, dass eine Textdatei, die Sie ursprünglich erstellt haben, LF-Endungen anstelle von CRLF hatte, wie gewohnt mit LF gespeichert wird, aber wenn diese Option aktiviert ist später wird es CRLF-Endungen haben. Für normale Textdateien ist dies normalerweise in Ordnung. Die Warnung ist in diesem Fall ein "zu Ihrer Information", aber falls git eine Binärdatei fälschlicherweise als Textdatei bewertet, ist sie eine wichtige Warnung, da git dann Ihre Binärdatei beschädigen würde.

Grundsätzlich hat eine lokale Datei, die zuvor LF war, jetzt lokal CRLF

mikew
quelle
6

git config --global core.autocrlf false funktioniert gut für globale Einstellungen.

Wenn Sie jedoch Visual Studio verwenden, müssen Sie möglicherweise auch Änderungen .gitattributesfür bestimmte Projekttypen vornehmen ( z. B. c # -Klassenbibliotheksanwendung ):

  • Linie entfernen * text=auto
Eric Wang
quelle
1

Nachdem ich festgelegt hatte, erhielt core.autocrlf=trueich "LF wird durch CRLF ersetzt" (beachten Sie, dass "CRLF wird durch LF ersetzt"), als ich bearbeitete Dateien in Windows in einem Repository (das verwendet wird) bearbeitete git add(oder war es vielleicht auf git commit?) LF) das wurde ausgecheckt bevor ich eingestellt habe core.autocrlf=true.

Ich habe eine neue Kasse mit gemacht core.autocrlf=trueund jetzt bekomme ich diese Nachrichten nicht mehr.

Marsette Vona
quelle
0

Wenn Sie Visual Studio 2017, 2019 verwenden, können Sie:

  1. Öffnen Sie den Haupt-Gitignore (aktualisieren oder entfernen Sie andere Gitignore-Dateien in anderen Projekten in der Lösung).
  2. Fügen Sie den folgenden Code ein:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process
Javier Cañon
quelle
1
Dieser "Code" sollte sich in einer Konfigurationsdatei wie .gitconfigoder .git/confignicht befinden .gitignore, die Dateien angibt, die von git ignoriert werden sollen.
Davida
Ich habe dies zu .git / config hinzugefügt, aber es wird immer noch "Warnung: CRLF wird durch LF ersetzt" angezeigt
Sergei
0

Mach einfach eine Sache:

  1. Öffnen Sie git-hub (Shell) und navigieren Sie zu der Verzeichnisdatei, zu der gehört (cd / a / b / c / ...).
  2. Führen Sie dos2unix aus (manchmal dos2unix.exe)
  3. Versuchen Sie es jetzt. Wenn Sie den gleichen Fehler erneut erhalten. Führen Sie alle oben genannten Schritte aus, außer dass Sie anstelle von dos2unix unix2dox (unix2dos.exe irgendwann) ausführen.
Antriksh Jain
quelle