Wie zwinge ich git, unter Windows LF anstelle von CR + LF zu verwenden?

335

Ich möchte git zwingen, Dateien unter Windows mit einfach LFnicht auszuchecken CR+LF. Ich habe die beiden Konfigurationsoptionen überprüft, konnte jedoch nicht die richtige Kombination von Einstellungen finden.

Ich möchte, dass alle Dateien konvertiert werden LFund LFdie Dateien beibehalten werden.

Anmerkung: Ich habe verwendet, autocrlf = inputaber dies repariert nur die Dateien, wenn Sie sie festschreiben. Ich möchte es erzwingen, damit sie es benutzen LF.

Wahrscheinlich war mir nicht so klar: Das Repository verwendet bereits, LFaber die mit msysgit ausgecheckten Dateien werden verwendet, CR+LFund ich möchte msysgit dazu zwingen, sie zu erhalten LF: Erzwingen von Unix-Zeilenenden .

>git config --list | grep crlf
core.autocrlf=input
Sorin
quelle
2
autocrlf=inputist die richtige Option. Natürlich schützt es Sie nicht vor Dateien, die sich wirklich cr+lfim Repository befinden oder mit denen Sie Dateien cr+lfin einem anderen Tool erstellen , bevor Sie sie zu git hinzufügen. Welche Probleme haben Sie, bei denen dies nicht funktioniert?
CB Bailey
2
Die Dateien im Repository werden bereits nur verwendet, LFaber wenn ich sie unter Windows bekomme, konvertiert msysgit sie in CR+LF.
Sorin
Es muss etwas mit Ihrer Konfiguration los sein; Ich habe dies gerade auf meiner msysgit-Installation getestet. Mit autocrlfset to inputlässt git lfLinefeeds in Ruhe. Können Sie die Ausgabe von posten git config?
CB Bailey
1
In diesem Fall schlage ich vor, dass Sie einen Fehler protokollieren. Zeigen Sie vorzugsweise auf ein Test-Repository, das Ihr Problem aufweist, und geben Sie Schritte zur Reproduktion an, da das angezeigte Verhalten definitiv falsch ist (aber ich kann es nicht reproduzieren).
CB Bailey
1
Ein kleiner Tipp ist, auch sicherzustellen, dass Sie die git-Befehle auf dem 'git' ausführen, von dem Sie glauben, dass Sie es sind. Beispielsweise können Sie Git unter Windows und Git unter Cygwin installiert haben. Stellen Sie daher sicher, dass Sie die richtige Git-Konfiguration festgelegt haben.
Alfred

Antworten:

106

Das OP fügte in seiner Frage hinzu:

Die mit msysgit ausgecheckten Dateien werden verwendet CR+LFund ich möchte msysgit zwingen, sie abzurufenLF

Ein erster einfacher Schritt wäre immer noch in einer .gitattributesDatei:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(wie in den Kommentaren von Enkelkindern erwähnt , die sich auf die .gitattributesKonvertierung am Zeilenende beziehen ), um jegliche CRLFKonvertierung für Dateien mit korrekter Qualität zu vermeiden eol.

Und ich habe immer empfohlen git config --global core.autocrlf false , jede Konvertierung zu deaktivieren (die für alle versionierten Dateien gelten würde ).

Siehe Best Practices für die plattformübergreifende Git-Konfiguration?

Seit Git 2.16 (Q1 2018) können Sie git add --renormalize .diese .gitattributesEinstellungen sofort anwenden .


Ein zweiter, leistungsfähigerer Schritt umfasst einen Gitattribute-Filtertreiber und das Hinzufügen eines Verschmutzungsschritts

Filtertreiber

Wann immer Sie Ihren Arbeitsbaum aktualisieren, kann ein Skript nur für die Dateien, die Sie in angegeben haben .gitattributes, die LF eolund jede andere Formatierungsoption erzwingen, die Sie erzwingen möchten.
Wenn das clearSkript " " nichts bewirkt, haben Sie (nach dem Festschreiben) Ihre Dateien transformiert und genau das Format angewendet, dem Sie folgen müssen.

VonC
quelle
Eine Frage: * .txt bezieht sich auf alle Dateien mit der Erweiterung .txt oder auf alle Textdateien (nicht binär)? Ich kann keine Liste mit allen Arten von Dateierweiterungen erstellen, die ich im Projekt haben werde.
Sorin
1
@ Sorin: Alle Dateien mit .txtErweiterung. Es ist vorzuziehen, dies zuerst festzulegen und an einer bestimmten Gruppe zu testen, bevor Sie auf * verallgemeinern, und eine negative Regel hinzuzufügen !*.xyz ..., um einige wenige Dateien von dieser Regel auszuschließen.
VonC
1
Inzwischen sollten die .gitattributesZeilen lauten: *.txt text eol=lfgemäß git-scm.com/docs/gitattributes
Enkelkind
@ Enkelkind Danke. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
Ich denke, nachdem wir hinzugefügt .gitattributeshaben, müssen wir tungit add --renormalize .
Shuva
460

Der richtige Weg , LF Endungen in Windows zu erhalten , ist zum ersten Satz core.autocrlfan false:

git config --global core.autocrlf false

Sie müssen dies tun, wenn Sie msysgit verwenden, da es truein den Systemeinstellungen festgelegt ist.

Jetzt führt git keine Normalisierung am Zeilenende durch. Wenn Sie möchten, dass Dateien, die Sie einchecken, normalisiert werden, gehen Sie folgendermaßen vor: Legen text=autoSie .gitattributesfür alle Dateien Folgendes fest:

* text=auto

Und setzen Sie core.eolauf lf:

git config --global core.eol lf

Jetzt können Sie auch einzelne Repos durch Ausführen auf crlf (im Arbeitsverzeichnis!) Umschalten

git config core.eol crlf

Nachdem Sie die Konfiguration vorgenommen haben, möchten Sie möglicherweise, dass git alle Dateien im Repo normalisiert . Gehen Sie dazu zum Stammverzeichnis Ihres Repos und führen Sie die folgenden Befehle aus:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Wenn Sie jetzt möchten, dass git auch die Dateien in Ihrem Arbeitsverzeichnis normalisiert , führen Sie die folgenden Befehle aus:

git ls-files -z | xargs -0 rm
git checkout .
Chronial
quelle
3
Ich bekomme fatale Pfadspezifikation '' stimmte nicht mit irgendwelchen Dateien überein, gleich danachgit diff --cached --name-only -z | xargs -0 git add
CMCDragonkai
3
Was ist die Ausgabe von git diff --cached --name-only?
Chronial
1
Es kann erwähnenswert sein, dass Sie diese Konfiguration festlegen können, während Sie das betreffende Repo klonen, z git clone --config core.autocrlf=false <repo path>.
Chris Long
240

Ich komme ziemlich oft auf diese Antwort zurück, obwohl keine davon für mich ganz richtig ist. Die richtige Antwort für mich ist jedoch eine Mischung aus den anderen.

Was ich finde, funktioniert wie folgt:

 git config --global core.eol lf
 git config --global core.autocrlf input

Bei Repos, die nach dem Festlegen dieser globalen Einstellungen ausgecheckt wurden, wird alles wie im Repo ausgecheckt - hoffentlich LF( \n). Alle CRLFwerden nur LFbeim Einchecken konvertiert.

Mit einem vorhandenen Repo, das Sie bereits ausgecheckt haben - das die richtigen Zeilenenden im Repo hat, aber nicht Ihre Arbeitskopie - können Sie die folgenden Befehle ausführen, um das Problem zu beheben:

git rm -rf --cached .
git reset --hard HEAD

Dadurch werden ( rm) rekursiv ( r) ohne Eingabeaufforderung ( -f) alle Dateien außer den von Ihnen bearbeiteten ( --cached) aus dem aktuellen Verzeichnis ( .) gelöscht . Das resetbringt dann alle diese Dateien in einen Zustand zurück, in dem sie ihre wahren Zeilenenden haben (passend zu dem, was im Repo steht).

Wenn Sie die Zeilenenden von Dateien in einem Repo korrigieren müssen, empfehle ich, einen Editor zu verwenden, mit dem Sie dies in großen Mengen wie IntelliJ oder Sublime Text tun können, aber ich bin sicher, dass jeder gute dies wahrscheinlich unterstützen wird.

Ben Liyanage
quelle
1
Wir haben ein einziges Repo mit Unterverzeichnissen, die eine andere Behandlung am Zeilenende erfordern. Das Festlegen einer globalen Option funktioniert hierfür nicht. Nicht einmal im Single Repo. Wie wenden Sie dieselben Einstellungen in .gitattributes an?
RobG
Notepad++zeigt auch das Zeilenende der aktuell geöffneten Datei in der unteren rechten Ecke. Durch Klicken mit der rechten Maustaste auf dieses Feld können Sie die Zeilenenden ändern.
Winklerrr
1
Die core.autocrlf inputOption überschreibt die core.eolEinstellung, sodass die Einstellung beider redundant ist. (Siehe git-scm.com/docs/git-config )
Andrew Marshall
1
Vielen Dank, mit Ihrer Hilfe habe ich Flusen und Linux erobert. Und kann jetzt Dateien einchecken.
GC_
57

Kontext

Wenn du

  1. möchten alle Benutzer zwingen, LF-Zeilenenden für Textdateien und zu haben
  2. Sie können nicht sicherstellen, dass alle Benutzer ihre Git-Konfiguration ändern.

Sie können dies ab Git 2.10 tun. 2.10 oder höher ist erforderlich, da 2.10 das Verhalten von text = auto zusammen mit eol = lf korrigiert hat . Quelle .

Lösung

Legen Sie eine .gitattributesDatei mit folgenden Inhalten im Stammverzeichnis Ihres Git-Repositorys ab:

* text=auto eol=lf

Verpflichte es.

Optionale Optimierungen

Sie können auch ein .editorconfigStammverzeichnis im Repository Ihres Repositorys hinzufügen, um sicherzustellen, dass moderne Tools neue Dateien mit den gewünschten Zeilenenden erstellen.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
koppor
quelle
3
Dies war die beste Lösung für mich. Ich habe dies auch mit editorconfig.org kombiniert, damit ich beim Schreiben in Intellij LF-EOLs schreibe.
Jazzepi
Dies ist bei weitem die beste Lösung. Konfigurationsbefehle müssen nicht manuell ausgeführt werden!
Cameron Tacklind
26

core.autocrlf=inputist die richtige Einstellung für das, was Sie wollen, aber Sie müssen möglicherweise ein git update-index --refreshund / oder ein tungit reset --hard ausführen, damit die Änderung wirksam wird.

Mit der core.autocrlfEinstellung auf inputwendet git beim Auschecken keine Zeilenumbruchkonvertierung an (wenn Sie also LF im Repo haben, erhalten Sie LF), stellt jedoch sicher, dass Sie einige CRLFs in die Arbeit einführen, falls Sie dies vermasseln irgendwie kopieren, sie werden nicht in das Repo kommen.

Kusma
quelle
19
Die Befehle sollten git rm --cached -r sein. && git reset --hard
koppor
0

Die Lösung für dieses Problem finden Sie unter: https://help.github.com/de/github/using-git/configuring-git-to-handle-line-endings

Vereinfachte Beschreibung, wie Sie dieses Problem unter Windows lösen können:

Globale Einstellungen für Zeilenenden Mit dem Befehl git config core.autocrlf wird geändert, wie Git mit Zeilenenden umgeht. Es braucht ein einziges Argument.

Unter Windows übergeben Sie einfach true an die Konfiguration. Zum Beispiel: C:> git config --global core.autocrlf true

Viel Glück, ich hoffe ich habe geholfen.

c-santana
quelle