Ich versuche, git dazu zu bringen, keinerlei Zeilenenden für irgendeine Operation zu ändern. Leider scheint es egal zu sein, was passiert. Ich habe es auf den folgenden Testfall reduziert, der so viele verschiedene Mechanismen zum Deaktivieren dieses Verhaltens enthält, wie ich finden konnte.
- Beginnen Sie mit zwei Maschinen (Windows-Computer = A, Linux-Computer = B)
- Auf beiden Maschinen:
git config --global core.autocrlf false
- Auf beiden Maschinen:
git config --global core.eol crlf
(nur für den Fall)
- Erstellen Sie ein neues Repository für A. Aus einem leeren Ordner:
git init --shared
(dann das erstellte.git
Verzeichnis einblenden )- Erstellen Sie eine neue Datei
.gitignore
im Repository - Erstellen Sie eine neue Datei
.gitattributes
im Repository mit der einzelnen Zeile:* -text
git add .
, dann umgit commit -m "initial commit"
zu umgehen, zB dies .git branch master_recv
- Fernbedienungen hinzufügen
- Erstellen Sie eine neue Datei
document.txt
im Repository, die CRLF enthält - Commit:
git add -A
danngit commit -m "<something>"
- Beachten Sie, dass A
document.txt
noch CRLF enthält (und wenn Sie es löschen und mit zurücksetzen, wird--hard
die Version mit CRLF zurückgegeben)
- SCP das gesamte Verzeichnis auf Computer B.
- Fügen Sie eine neue Datei
new file
mit CRLF hinzu - Commit:
git add -A
danngit commit -m "<something>"
- Beachten Sie, dass sowohl B
document.txt
als auch Bnew file
weiterhin CRLF enthalten
- Ziehe B's Master zu A:
git pull <remote> master:master_recv
- A's
document.txt
hat sich in LF geändert. Die hinzugefügte Dateinew file
enthält auch LF.
Das Problem tritt nicht auf, wenn B ein Windows-Computer ist.
core.autocrlf
immer falsch? Klingt es so, als hätten Sie bereits\n
Zeilenenden in Ihrem Repository? Es gibt keine Einstellung, die\n
in Ihrem Repository\r\n
in Ihrem Arbeitsverzeichnis geändert werden kann .Antworten:
In Ihrem Projekt sollte sich eine
.gitattributes
Datei befinden. Meistens sollte es wie folgt aussehen (oder dieser Screenshot ):Wechseln Sie
* text=auto
zu* text=false
, um die automatische Behandlung zu deaktivieren (siehe Screenshot ).So was:
Wenn Ihr Projekt keine .gitattributes-Datei hat, werden die Zeilenenden durch Ihre Git-Konfigurationen festgelegt. Gehen Sie folgendermaßen vor, um Ihre Git-Konfigurationen zu ändern:
Gehen Sie zur Konfigurationsdatei in diesem Verzeichnis:
1) C: \ ProgramData \ Git \ config
2) Öffnen Sie die Konfigurationsdatei in Notepad ++ (oder einem beliebigen Texteditor).
3) Ändern Sie "autocrlf =" in false.
quelle
* text=false
wird der Text nicht deaktiviert: Der Text wird auf den Zeichenfolgenwert false gesetzt. Dies hat den gleichen Effekt, als würde Text nicht spezifiziert (nicht speziell nicht gesetzt). Die Verwendung* -text
gibt ihm die spezielle Einstellung "Nicht gesetzt". Wenn Sie das Textattribut in einem Pfad deaktivieren, wird git angewiesen, beim Ein- oder Auschecken keine Zeilenende-Konvertierung zu versuchen.* text=false
hat dies keine Wirkung. Bitte korrigieren Sie die Antwort!Eine einfache Lösung ist:
git config --global core.autocrlf false
git add --renormalize .
Wenn Konvertierungen automatisch durchgeführt werden, bedeutet dies, dass im Repo eine
.gitattributes
core.eol
Direktive vorhanden ist.Überprüfen Sie mit Git 2.8+ (März 2016) , ob es noch eine EOL-Transformation gibt mit:
quelle
autocrlf
HEUTE NICHT VERWENDEN ! nicht gesetztautocrlf
ist gleichbedeutend mitfalse
. Sie blieben hinter den trendigen Bewegungen in Git1.8.5.2
.Ich habe es herausgefunden. Es scheint, dass das SCP-Programm die Zeilenenden konvertiert hat. Ich bemerkte dies, als ich versuchte, absichtlich eine Datei mit LF-Endungen zu erstellen und dann feststellte, dass sie beim Herunterladen als CRLF angezeigt wurde.
Da dies die Lösung für mich war, akzeptiere ich diese Antwort, aber die Menschen der Zukunft sollten sich für eine allgemeinere Lösung auch auf die anderen Antworten beziehen.
quelle
Aus dem Thema "Effekte" der gitattributes (5) Handbuchseite
core.autocrlf
in neuem (1.7.2+) Git nicht verwendet,core.eol
und korrekte Einstellung | Deaktivierung des Textattributs wird als zuverlässiger angesehenquelle
.gitattributes
Datei hatte ich allerdings explizit alles als Text deaktiviert, oder? Außerdem sehe ich es nicht mit der Option, dass es keine Konvertierung durchführt (obwohl diescrlf
möglicherweise keine Auswirkungen hat).text
um die Konvertierung aufzuheben und zu verhindern, sollten Sie .gitattributes auf* -text
und nicht auf setzen* text=false
.false
ist kein gültiger Wert fürtext
attribute - git erkennt ihn nicht und greift stattdessen auf die Standardeinstellung für autocrlf zurück. Nachdemtext
Sie den Wert geändert haben, müssen Sie alle Dateien von Ihrem lokalen Repo sichern, ein Commit durchführen, dann die Dateien mit dem richtigen Zeilenende nach Bedarf wiederherstellen und sie wieder festschreiben. Dann wird Ihr Zeilenende nie wieder von git geändert.