607 Stimmen

Wie zwinge ich Git dazu, unter Windows LF statt CR+LF zu verwenden?

Ich möchte Git dazu zwingen, Dateien unter Windows auszuchecken, indem ich nur LF no CR+LF . Ich habe die beiden Konfigurationsoptionen geprüft, aber ich konnte nicht die richtige Kombination von Einstellungen finden.

Ich möchte, dass es alle Dateien in LF und behalten die LF zu den Dateien.

Bemerkung: Ich habe autocrlf = input aber das repariert die Dateien nur, wenn Sie sie übertragen. Ich möchte erzwingen, dass er sie mit LF .

Wahrscheinlich habe ich mich nicht klar ausgedrückt: Das Repository verwendet bereits LF aber die mit msysgit ausgecheckten Dateien verwenden CR+LF und ich möchte msysgit dazu zwingen, sie mit LF : Erzwingen von Unix-Zeilenenden .

>git config --list | grep crlf
core.autocrlf=input

736voto

Chronial Punkte 59424

Der richtige Weg, um LF-Endungen in Windows zu erhalten, besteht darin, zuerst die core.autocrlf a false :

git config --global core.autocrlf false

Sie müssen dies tun, wenn Sie msysgit verwenden, denn es setzt es auf true in seinen Systemeinstellungen.

Jetzt wird Git keine Normalisierung der Zeilenenden vornehmen. Wenn Sie möchten, dass Dateien, die Sie einchecken, normalisiert werden, tun Sie dies: Setzen Sie text=auto in Ihrem .gitattributes für alle Dateien:

* text=auto

Und setzen core.eol a lf :

git config --global core.eol lf

Jetzt können Sie auch einzelne Repos nach crlf wechseln (im Arbeitsverzeichnis!), indem Sie

git config core.eol crlf

Nachdem Sie die Konfiguration vorgenommen haben, möchten Sie vielleicht, dass git alle Dateien im Verzeichnis Repo . Gehen Sie dazu in das Stammverzeichnis Ihres Repos und führen Sie diese Befehle aus:

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

Wenn Sie nun möchten, dass Git auch die Dateien in Ihrem Arbeitsverzeichnis führen Sie diese Befehle aus:

git ls-files -z | xargs -0 rm
git checkout .

436voto

Ben Liyanage Punkte 4063

Ich komme ziemlich oft auf diese Antwort zurück, obwohl keine von ihnen für mich ganz richtig ist. Allerdings ist die richtige Antwort für mich eine Mischung aus den anderen.

Meiner Meinung nach funktioniert das folgendermaßen:

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

Für Repos, die ausgecheckt wurden, nachdem diese globalen Einstellungen gesetzt wurden, wird alles als das ausgecheckt, was es im Repos ist - hoffentlich LF ( \n ). Jede CRLF wird umgewandelt in nur LF beim Einchecken.

Bei einem bestehenden Projektarchiv, das Sie bereits ausgecheckt haben - das die richtigen Zeilenenden im Projektarchiv, aber nicht in Ihrer Arbeitskopie hat - können Sie die folgenden Befehle ausführen, um dies zu korrigieren:

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

Dies löscht ( rm ) rekursiv ( r ) ohne Eingabeaufforderung ( -f ), alle Dateien außer denen, die Sie bearbeitet haben ( --cached ), aus dem aktuellen Verzeichnis ( . ). Die Website reset setzt dann alle diese Dateien in einen Zustand zurück, in dem sie ihre wahren Zeilenenden haben (die mit denen im Repo übereinstimmen).

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

187voto

VonC Punkte 1117238

Der Auftraggeber fügte seine Frage hinzu:

die mit msysgit ausgecheckten Dateien verwenden CR+LF und ich möchte msysgit dazu zwingen, sie mit LF

Ein erster einfacher Schritt wäre noch in einer .gitattributes Datei:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(als in den Kommentaren vermerkt von Enkelkind Bezug nehmend auf .gitattributes End-of-Line-Konvertierung ), um zu vermeiden, dass CRLF Konvertierung für Dateien mit korrekter eol .

Und Ich habe immer empfohlen git config --global core.autocrlf false um jede Umwandlung zu deaktivieren (was für alle versionierte Dateien)

Voir Beste Praktiken für plattformübergreifende Git-Konfiguration?

Seit Git 2.16 (Q1 2018), können Sie git add --renormalize . diese anzuwenden .gitattributes Einstellungen sofort.


Ein zweiter, noch wirkungsvollerer Schritt ist eine gitattribute filter treiber und eine Verwischungsstufe hinzufügen

filter driver

Jedes Mal, wenn Sie Ihren Arbeitsbaum aktualisieren möchten, kann ein Skript nur für die Dateien, die Sie in der Option .gitattributes erzwingen die LF eol und jede andere Formatierungsoption, die Sie erzwingen wollen.
Wenn die " clear "Skript nichts tut, haben Sie (nach der Übergabe) Ihre Dateien umgewandelt und genau das Format angewendet, das Sie benötigen.

137voto

koppor Punkte 16743

Kontext

Wenn Sie

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

können Sie das ab Git 2.10 tun. 2.10 oder höher ist erforderlich, weil 2.10 korrigiert das Verhalten von text=auto in Verbindung mit eol=lf . Quelle .

Lösung

Setzen Sie eine .gitattributes Datei im Stammverzeichnis Ihres Git-Repositorys mit folgendem Inhalt:

* text=auto eol=lf

Setzen Sie es um.

Optionale Optimierungen

Sie können auch eine .editorconfig im Wurzelverzeichnis Ihres Repositorys, um sicherzustellen, dass die modernen Werkzeuge 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

34voto

kusma Punkte 6278

core.autocrlf=input ist die richtige Einstellung für das, was Sie wollen, aber Sie müssen möglicherweise eine git update-index --refresh und/oder eine git reset --hard damit die Änderung wirksam wird.

Mit core.autocrlf eingestellt auf input Git wendet beim Auschecken keine Zeilenumwandlung an (wenn Sie also LF im Projektarchiv haben, erhalten Sie LF), aber es stellt sicher, dass, falls Sie es vermasseln und einige CRLFs in die Arbeitskopie einfügen, diese nicht in das Projektarchiv gelangen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X