Warum sollte ich core.autocrlf = true in Git verwenden?

296

Ich habe ein Git-Repository, auf das sowohl unter Windows als auch unter OS X zugegriffen wird und von dem ich weiß, dass es bereits einige Dateien mit CRLF-Zeilenenden enthält. Soweit ich das beurteilen kann, gibt es zwei Möglichkeiten, damit umzugehen:

  1. Stellen Sie core.autocrlfzu falseüberall,

  2. Befolgen Sie die Anweisungen hier (auf den Hilfeseiten von GitHub), um das Repository so zu konvertieren, dass es nur LF-Zeilenenden enthält, und setzen Sie core.autocrlfes anschließend trueauf Windows und inputOS X. Das Problem dabei ist, dass ich Binärdateien im Repository habe Das:

    1. sind in Gitattributen nicht korrekt als binär markiert, und
    2. zufällig sowohl CRLFs als auch LFs enthalten,

    Sie werden beschädigt. Möglicherweise enthält mein Repository solche Dateien.

Warum sollte ich die Konvertierung von Git am Ende nicht einfach deaktivieren? Es gibt viele vage Warnungen im Internet, dass das core.autocrlfAusschalten Probleme verursacht, aber nur sehr wenige spezifische . Das einzige, was ich bisher gefunden habe, ist, dass kdiff3 keine CRLF-Endungen verarbeiten kann (für mich kein Problem) und dass einige Texteditoren Probleme mit dem Zeilenende haben (auch für mich kein Problem).

Das Repository befindet sich in meinem Unternehmen, sodass ich mich nicht darum kümmern muss, es für Personen mit unterschiedlichen Autocrlf-Einstellungen oder Zeilenendanforderungen freizugeben.

Gibt es andere Probleme, wenn ich nur die Zeilenenden so belasse, wie ich es nicht weiß?

Reich
quelle
1
Würde stackoverflow.com/questions/2333424/… helfen? Ich habe einen Link zu bestimmten Gründen, warum ich autocrlffalsch gehe.
VonC
3
@VonC Danke, aber ich kann bereits vorschreiben, dass alle Benutzer in der Firma <code> autocrlf </ code> auf false gesetzt haben und derzeit glauben, dass dies die beste Option ist. Aber ich möchte wissen, ob es Gründe gibt, warum ich das nicht tun sollte, weil ich feststellen kann, dass es viele Leute (z. B. GitHub) gibt, die sagen, dass ich autocrlf einstellen sollte , aber keine tatsächlichen Einzelheiten darüber , warum.
Rich
3
@VonC dh ich suche nicht nach Gründen, um autocrlfauf false zu setzen . Ich suche nach Gründen, um es auf wahr zu setzen.
Rich
9
Warum nicht verwenden autocrlf = input: Es scheint die perfekte Lösung zwischen den beiden Extremen zu sein: Sie halten Ihr Repo sauber von CRLF-Mist, und lokal können Windows-Entwickler verwenden, was sie wollen, ohne dass ihre lokalen Dateien automatisch etwas Magisches bewirken. (Sie möchten LF möglicherweise aus verschiedenen Gründen lokal, daher trueist es meiner Meinung nach schlecht.) Ich kann keine Nachteile bei der Verwendung feststellen autocrlf = input.
Bilderstürmer
7
@iconclast, ein Grund, auf den ich gestoßen bin, ist, wenn Sie Distributionen erstellen, die sowohl Windows-Batchdateien als auch Unix-Shell-Skripte enthalten. Sie möchten jeweils das richtige Zeilenende verwenden, und dies ist schwieriger, wenn Git Dinge herumwirbelt, selbst nachdem Sie sie explizit auf die eine oder andere Weise festgelegt haben.
user1809090

Antworten:

227

Die einzigen spezifischen Gründe, auf die gesetzt werden muss autocrlf, truesind:

  • Vermeiden Sie es git status, alle Ihre Dateien anzuzeigen, modifiedda beim Klonen eines Unix-basierten EOL Git-Repos auf ein Windows-Repo automatisch EOL konvertiert wird (siehe z. B. Problem 83 ).
  • und Ihre Codierungswerkzeuge hängen irgendwie von einem Muttersprachler ab EOL-Stil in Ihrer Datei vorhanden ist:

Sofern Sie eine spezifische Behandlung sehen , die müssen mit nativer EOL beschäftigen, sind Sie besser dran , verlassen autocrlfzufalse (git config --global core.autocrlf false ).

Beachten Sie, dass diese Konfiguration lokal ist Konfiguration handelt (da die Konfiguration nicht von Repo zu Repo verschoben wird).

Wenn Sie für alle Benutzer, die dieses Repo klonen, dieselbe Konfiguration wünschen, lesen Sie " Was ist die beste CRLFHandhabungsstrategie mit git? ". Verwenden Sie dazu das textAttribut in der .gitattributesDatei .

Beispiel:

*.vcproj    text eol=crlf
*.sh        text eol=lf

Hinweis: Ab Git 2.8 (März 2016) führen Zusammenführungsmarkierungen keine gemischten Zeilenenden (LF) mehr in eine CRLF-Datei ein.
Siehe " Git dazu bringen, CRLF für die Zusammenführungslinien" <<<<<<< HEAD "zu verwenden ".

VonC
quelle
5
@VonC Danke! Dadurch fühle ich mich sicherer, dass ich es sicher verwenden kann autocrlf=false. Wissen Sie aus Interesse, warum git die EOL-Konvertierung auch dann noch durchführt, wenn Sie autocrlf auf false gesetzt haben?
Rich
14
@VonC: Ich denke nicht, dass diese Antwort richtig ist. Die Verwendung von core.autocrlf = true unter Windows funktioniert wie erwartet. Alle Dateien aus dem Repo (die in diesem Szenario LF-Zeilenenden haben sollten) werden beim Auschecken auf einen Windows-PC in CRLF-Zeilenenden konvertiert. Alle Dateien werden beim Festschreiben von einem Windows-PC zurück in LF-Zeilenenden konvertiert. Der Weg, um in Schwierigkeiten zu geraten, besteht darin, zunächst auf einen Windows-PC mit der falschen Einstellung core.autocrlf auszuchecken (was völlig zu einfach ist).
Michael Maddox
3
@Michael Ist in diesem Fall der einzige Grund, den core.autocrlf=falseich in meinem Szenario nicht verwenden sollte, wenn ich ein Tool / einen Editor hätte, das durch die Zeilenenden verwirrt würde?
Rich
49
Ich würde es definitiv benutzen false, ich war noch nie ein großer Fan von automatischen oder magischen Dingen, die im Hintergrund passieren. Verwenden Sie einfach \nund UTF-8überall und es wird Ihnen gut gehen. Wenn ein Nusskopf nicht versteht, dass es Konventionen und Regeln gibt, und vergisst, UTF-8oder zu verwenden \n, dann konvertiert jemand sie manuell und schlägt ihm ins Gesicht.
Turm
5
@ Pauld'Aoust Ich würde es immer noch vorziehen, den Dateityp, der diese CRLF benötigt, über core.eolAttribute in einer .gitattributesDatei anzugeben , anstatt diese globale core.autocrlfEinstellung zu verwenden, die wahllos für alle Dateien gilt.
VonC
40

Ich bin ein .NET-Entwickler und benutze Git und Visual Studio seit Jahren. Meine starke Empfehlung ist, die Zeilenenden auf true zu setzen. Und tun Sie dies so früh wie möglich in der Lebensdauer Ihres Repositorys.

Davon abgesehen hasse ich es, dass Git meine Zeilenenden ändert. Eine Quellcodeverwaltung sollte nur die von mir ausgeführte Arbeit speichern und abrufen, sie sollte sie NICHT ändern. Je. Aber es tut.

Was passiert, wenn nicht jeder Entwickler auf true gesetzt ist, ist, dass EIN Entwickler schließlich auf true gesetzt wird. Dadurch werden die Zeilenenden aller Ihrer Dateien in Ihrem Repo in LF geändert. Wenn Benutzer auf "Falsch" setzen, werden Sie von Visual Studio gewarnt und aufgefordert, diese zu ändern. Sie werden 2 Dinge sehr schnell passieren lassen. Erstens erhalten Sie immer mehr dieser Warnungen. Je größer Ihr Team ist, desto mehr erhalten Sie. Das zweite und schlimmere ist, dass es zeigt, dass jede Zeile jeder geänderten Datei geändert wurde (weil die Zeilenenden jeder Zeile vom wahren Kerl geändert werden). Schließlich können Sie Änderungen in Ihrem Repo nicht mehr zuverlässig verfolgen. Es ist VIEL einfacher und sauberer, alle dazu zu bringen, wahr zu bleiben, als zu versuchen, alle falsch zu halten. So schrecklich es auch ist, mit der Tatsache zu leben, dass Ihre vertrauenswürdige Quellcodeverwaltung etwas tut, was sie nicht tun sollte. Je.

JGTaylor
quelle
Mein Unternehmen ist so klein, dass wir leicht festlegen können, dass überall falsch verwendet wird, und ich hätte gedacht, dass größere Unternehmen dies über Richtlinien tun könnten, aber ich denke, dies ist ein legitimer Grund für die Verwendung von "wahr", also stimme ich zu wie auch immer. Vielen Dank!
Rich
1
Das Problem bei einer Richtlinie (erzwungene Datei) besteht darin, dass Sie auf einem Windows-Computer eine lokale, eine globale und eine versteckte Konfigurationsdatei (ProgramData / Git / Confg) haben können. Sie können das lokale erzwingen, indem Sie es in das Repo einchecken, aber das globale UND die versteckten Dateien haben Vorrang. Es ist auch möglich, dass lokal und global (oder versteckt) unterschiedlich sind. Wenn dies der Fall ist, stehen sie auf dem gleichen Computer in Konflikt miteinander und verursachen Zeilenendfehler, wenn keine vorhanden sind. Dies ist ein Schmerz zu finden. :(
JGTaylor
7
genau das was ich denke. Es ist nicht die Aufgabe einer Quellcodeverwaltung, mit Codedateien herumzuspielen, wie es ihnen gefällt. Zeilenenden sollten lediglich ein Anliegen der Bearbeitungswerkzeuge sein, nicht mehr.
Tuncay Göncüoğlu
6
Wenn Ihr Projekt nur Windows ist, gibt es kein Problem. Wenn Sie oder Ihre Kollegen jedoch auf einer * nix-Plattform arbeiten, führt Ihre "starke Empfehlung" zu Problemen. Versuchen Sie, ein Bash-, Perl- oder Python-Skript auszuführen, dessen Shebang mit endet, \r\nund Sie werden sehen.
Phuclv
6
Die Situation, die Sie als kein Problem von GIT beschrieben haben, setzen Sie die Einstellung auf FALSE, wie es normalerweise sein sollte, und es ist weg. Instad, es ist ein Problem in der Teamarbeit. Was bedeutet es "irgendwann setzt ein Entwickler true"? Warum würden Sie ihnen das überhaupt erlauben? Wenn Sie sie für den Zugriff auf Git Repo einrichten, können Sie bestimmte Bereiche nicht mit unterschiedlichen Langs verschmutzen (damit jeder, der daran arbeitet, sie lesen kann), oder Sie behalten Zweige / Zusammenführungen / Rebases / usw. entlang der ausgewählten Politik sollten sie eine klare Regel bekommen: Stellen Sie die richtige crlf ein.
Quetzalcoatl
12

Update 2 :

Xcode 9 scheint eine "Funktion" zu haben, mit der die aktuellen Zeilenenden der Datei ignoriert werden. Verwenden Sie stattdessen einfach Ihre Standardeinstellung für das Zeilenende, wenn Sie Zeilen in eine Datei einfügen, was zu Dateien mit gemischten Zeilenenden führt.

Ich bin mir ziemlich sicher, dass dieser Fehler in Xcode 7 nicht vorhanden war. Ich bin mir bei Xcode 8 nicht sicher. Die gute Nachricht ist, dass es in Xcode 10 behoben zu sein scheint.

Für die Zeit, in der es existierte, verursachte dieser Fehler eine kleine Heiterkeit in der Codebasis, auf die ich mich in der Frage beziehe (die bis heute verwendet wird autocrlf=false), und führte dazu, dass viele "EOL" -Commit-Nachrichten und schließlich ein Git- pre-commitHook geschrieben wurden, um dies zu überprüfen für / verhindern das Einführen von gemischten Leitungsenden.

Update :

Hinweis: Wie von VonC, von Git Start 2.8, merge Marker wird nicht Unix-Zeilenende zu einer Windows-style - Datei einführen .

Original :

Ein kleines Problem, das mir bei diesem Setup aufgefallen ist, ist, dass bei Zusammenführungskonflikten die Zeilen, die git hinzufügt, um die Unterschiede zu kennzeichnen, keine Windows-Zeilenenden haben, selbst wenn der Rest der Datei dies tut, und Sie am Ende enden können mit einer Datei mit gemischten Zeilenenden, z.

// Some code<CR><LF>
<<<<<<< Updated upstream<LF>
// Change A<CR><LF>
=======<LF>
// Change B<CR><LF>
>>>>>>> Stashed changes<LF>
// More code<CR><LF>

Dies verursacht uns keine Probleme (ich kann mir vorstellen, dass jedes Tool, das beide Arten von Zeilenenden verarbeiten kann, auch mit gemischten Zeilenenden sinnvoll ist - sicherlich alle, die wir verwenden), aber es ist etwas, das Sie beachten sollten.

Die andere Sache *, die wir gefunden haben, ist, dass beim git diffAnzeigen von Änderungen an einer Datei mit Windows-Zeilenenden die hinzugefügten Zeilen ihre Zeilenumbrüche anzeigen, also:

    // Not changed

+   // New line added in^M
+^M
    // Not changed
    // Not changed

* Es verdient nicht wirklich den Begriff: "Problem".

Reich
quelle
2
Hinweis: Wenn Visual Studio auf eine solche Datei stößt, können Sie die Zeilenenden für Sie normalisieren. Das Auswählen von Windows-Zeilenenden oder das Nicht- Normalisieren der Zeilenenden funktioniert einwandfrei (da VS diese weiterhin korrekt anzeigt, wurden die fehlerhaften Zeilen gelöscht, sobald der Konflikt gelöst wurde).
Rich
2
Leider sind die Nazis der Unternehmensversionskontrolle damit nicht einverstanden (LF on Merge Conflict Marker) und sind kein Problem.
Ilia G
1
Ich bin damit einverstanden, dass LF bei Zusammenführungskonfliktmarkern kein Problem darstellen sollte. Diese Zeilen sollten sowieso nicht für das Repo festgelegt werden.
Rob
1
Hinweis: Ab Git 2.8 (März 2016) haben Zusammenführungsmarkierungen tatsächlich ein CRLF-Zeilenende. Siehe stackoverflow.com/a/35474954/6309
VonC