Ausführen von git auf einem Windows XP-Computer mit bash. Ich habe mein Projekt aus SVN exportiert und dann ein nacktes Repository geklont.
Ich habe dann den Export in das Bare-Repositorys-Verzeichnis eingefügt und Folgendes ausgeführt:
git add -A
Ich habe dann eine Liste mit Nachrichten erhalten, die besagen:
LF wird durch CRLF ersetzt
Was sind die Konsequenzen dieser Konvertierung? Dies ist eine .NET-Lösung in Visual Studio.
Antworten:
Diese Meldungen sind auf einen falschen Standardwert von
core.autocrlf
unter Windows zurückzuführen.Das Konzept von
autocrlf
besteht darin, Zeilenendkonvertierungen transparent zu handhaben. Und das tut es!Schlechte Nachrichten : Der Wert muss manuell konfiguriert werden.
Gute Nachricht : Es sollte nur EINMAL pro Git-Installation durchgeführt werden (pro Projekteinstellung ist auch möglich).
Wie
autocrlf
funktioniert :Hier
crlf
= Win-Style-End-of-Line-Marker,lf
= Unix-Style (und Mac OSX).(Pre-Osx ist
cr
für keine der drei oben genannten Optionen betroffen)Wann wird diese Warnung angezeigt (unter Windows)
-
autocrlf
=true
wenn Sie einen Unix-Stillf
in einer Ihrer Dateien haben (= RARELY),-
autocrlf
=input
wenn Sie einen Win-Stilcrlf
in einer Ihrer Dateien haben (= fast IMMER),-
autocrlf
=false
- NIE!Was bedeutet diese Warnung?
Die Warnung " LF wird durch CRLF ersetzt " besagt, dass Sie (mit
autocrlf
=true
) Ihren LF im Unix-Stil nach dem Commit-Checkout-Zyklus verlieren (er wird durch CRLF im Windows-Stil ersetzt). Git erwartet nicht, dass Sie LF im Unix-Stil unter Windows verwenden.Die Warnung " CRLF wird durch LF ersetzt " besagt, dass Sie (mit
autocrlf
=input
) Ihre CRLF im Windows-Stil nach einem Commit-Checkout-Zyklus verlieren (sie wird durch LF im Unix-Stil ersetzt). Nichtinput
unter Fenstern verwenden.Ein weiterer Weg, um zu zeigen, wie es
autocrlf
funktioniertDabei ist x entweder CRLF (Windows-Stil) oder LF (Unix-Stil) und Pfeile stehen für
Wie repariert man
Der Standardwert für
core.autocrlf
wird während der Git-Installation ausgewählt und in der systemweiten gitconfig (%ProgramFiles(x86)%\git\etc\gitconfig
) gespeichert . Auch gibt es (Kaskadierung in der folgenden Reihenfolge):- "globale" (pro Benutzer) gitconfig befindet sich unter
~/.gitconfig
, noch eine andere- "globale" (pro Benutzer) gitconfig bei
$XDG_CONFIG_HOME/git/config
oder$HOME/.config/git/config
und- "lokale" (pro repo) gitconfig bei
.git/config
im Arbeitsverzeichnis.Schreiben Sie also
git config core.autocrlf
in das Arbeitsverzeichnis, um den aktuell verwendeten Wert und zu überprüfen-
autocrlf=false
zur systemweiten gitconfig hinzufügen # pro system lösung-
git config --global core.autocrlf false
# pro benutzer lösung-
git config --local core.autocrlf false
# pro projekt lösungWarnungen
-
git config
Einstellungen können durchgitattributes
Einstellungen überschrieben werden .- Die
crlf -> lf
Konvertierung erfolgt nur beim Hinzufügen neuer Dateien.crlf
Dateien, die bereits im Repo vorhanden sind, sind nicht betroffen.Moral (für Windows):
- Verwenden Sie
core.autocrlf
=,true
wenn Sie dieses Projekt auch unter Unix verwenden möchten (und Ihren Editor / Ihre IDE nicht für die Verwendung von Unix-Zeilenenden konfigurieren möchten).- Verwenden Sie
core.autocrlf
=,false
wenn Sie dieses Projekt nur unter Windows verwenden möchten ( oder Sie haben Ihren Editor / Ihre IDE so konfiguriert, dass Unix-Zeilenenden verwendet werden.- Verwenden Sie niemals
core.autocrlf
=, esinput
sei denn, Sie haben einen guten Grund dazu ( z. B. wenn Sie Unix-Dienstprogramme unter Windows verwenden oder wenn Sie auf Makefiles-Probleme stoßen).PS Was ist bei der Installation von git für Windows zu wählen?
Wenn Sie keines Ihrer Projekte unter Unix verwenden möchten, stimmen Sie der ersten Standardoption nicht zu. Wählen Sie die dritte aus ( Checkout wie sie ist, Commit wie sie ist ). Sie werden diese Nachricht nicht sehen. Je.
PPS Meine persönliche Präferenz ist die Konfiguration des Editors / der IDE für die Verwendung von Endungen im Unix-Stil und die Einstellung
core.autocrlf
auffalse
.quelle
core.autocrlf
die Eingabe festlegen . Nach dem, was ich aus Ihrer Antwort entnommen habe, stellt das Setzen auf Eingabe sicher, dass das Repository und das Arbeitsverzeichnis immer Zeilenenden im Unix-Stil haben. Warum sollten Sie das unter Windows niemals wollen?Git hat drei Modi für den Umgang mit Zeilenenden:
Sie können den zu verwendenden Modus einstellen, indem Sie einen zusätzlichen Parameter von
true
oderfalse
zur obigen Befehlszeile hinzufügen .Wenn
core.autocrlf
true festgelegt ist, bedeutet dies, dass jedes Mal, wenn Sie dem Git-Repo eine Datei hinzufügen, die Git für eine Textdatei hält, alle CRLF-Zeilenenden nur auf LF gesetzt werden, bevor sie im Commit gespeichert werden. Wann immer Siegit checkout
etwas tun, werden bei allen Textdateien automatisch die LF-Zeilenenden in CRLF-Endungen konvertiert. Dies ermöglicht die Entwicklung eines Projekts über Plattformen hinweg, die unterschiedliche Zeilenendstile verwenden, ohne dass Commits sehr laut sind, da jeder Editor den Zeilenendstil ändert, da der Zeilenendstil immer konsistent LF ist.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.
Wenn
core.autocrlf
false festgelegt ist, wird niemals eine Konvertierung am Zeilenende durchgeführt, sodass Textdateien unverändert eingecheckt werden. Dies funktioniert normalerweise in Ordnung, solange alle Entwickler entweder unter Linux oder alle unter Windows arbeiten. Aber meiner Erfahrung nach bekomme ich immer noch Textdateien mit gemischten Zeilenenden, die Probleme verursachen.Meine persönliche Präferenz ist es, die Einstellung als Windows-Entwickler aktiviert zu lassen.
Aktualisierte Informationen, die den Wert "input" enthalten, finden Sie unter http://kernel.org/pub/software/scm/git/docs/git-config.html .
quelle
core.eol
Einstellungen zu ergänzen , möglicherweise in Übereinstimmung mit der.gitattributes
Konfiguration. Ich habe versucht, die Unterschiede und Überschneidungen durch Experimente herauszufinden, und es ist sehr verwirrend.Wenn Sie den Code bereits ausgecheckt haben, sind die Dateien bereits indiziert. Nachdem Sie Ihre Git-Einstellungen geändert haben, führen Sie beispielsweise Folgendes aus:
Sie sollten die Indizes mit aktualisieren
und schreibe den Git-Index mit neu
https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings
Hinweis: Dadurch werden Ihre lokalen Änderungen entfernt. Bevor Sie dies tun, sollten Sie sie verstauen.
quelle
git rm --cached -r .
? Warumgit reset --hard
ist nicht genug?git rm --cached -r .
Wenn Sie diesgit reset --hard
nach dem Ändern dercore.autocrlf
Einstellung tun , werden die Zeilenenden nicht erneut konvertiert. Sie müssen den Git-Index bereinigen.quelle
autcrlf
umfalse
das Problem nur jedem Benutzer Ihres Projekts zuzuweisen .git config --global core.autocrlf false
stattdessen.Sowohl unix2dos als auch dos2unix sind in Windows mit Gitbash verfügbar. Mit dem folgenden Befehl können Sie die Konvertierung von UNIX (LF) -> DOS (CRLF) durchführen. Daher erhalten Sie keine Warnung.
oder
Führen Sie diesen Befehl jedoch nicht für eine vorhandene CRLF-Datei aus, da sonst jede zweite Zeile leere Zeilenumbrüche angezeigt werden.
dos2unix -D filename
funktioniert nicht mit jedem Betriebssystem. Bitte überprüfen Sie diesen Link auf Kompatibilität.Wenn Sie den Befehl aus irgendeinem Grund erzwingen müssen, verwenden Sie
--force
. Wenn es ungültig heißt, verwenden Sie-f
.quelle
dos2unix -D
Windows-Zeilenenden in Linux-Zeilenenden konvertiert werden. Ist das nicht dasselbe wie DOS (CRLF) -> UNIX (LF) Konvertierung? Gibt jedoch andos2unix -h
, dass-D
eine UNIX (LF) -> DOS (CRLF) -Konvertierung durchgeführt wird. dos2unix Weitere Informationen: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unixIch denke, die Antwort von @ Basiloungas ist knapp, aber veraltet (zumindest auf dem Mac).
Öffnen Sie die Datei ~ / .gitconfig und setzen Sie sie
safecrlf
auf falseDas * wird es anscheinend dazu bringen, das Ende der Zeile char zu ignorieren (hat sowieso für mich funktioniert).
quelle
safecrlf
(mit einem 'f') seinDer Artikel eines GitHub über Zeilenenden wird häufig erwähnt, wenn über dieses Thema gesprochen wird.
Meine persönlichen Erfahrungen mit der Verwendung der oft empfohlenen
core.autocrlf
Konfigurationseinstellung waren sehr gemischt.Ich verwende Windows mit Cygwin und beschäftige mich zu unterschiedlichen Zeiten mit Windows- und UNIX-Projekten. Sogar meine Windows-Projekte verwenden manchmal
bash
Shell-Skripte, für die UNIX-Zeilenenden (LF) erforderlich sind.core.autocrlf
Wenn ich unter Verwendung der von GitHub empfohlenen Einstellung für Windows ein UNIX-Projekt auschecke (das unter Cygwin einwandfrei funktioniert - oder wenn ich zu einem Projekt beitrage, das ich auf meinem Linux-Server verwende), werden die Textdateien mit Windows (CRLF) ausgecheckt ) Zeilenenden, die Probleme verursachen.Grundsätzlich
core.autocrlf
funktioniert es in einer gemischten Umgebung wie der in einigen Fällen nicht gut , die globale Einstellung auf eine der Optionen festzulegen. Diese Option kann in einer lokalen (Repository-) Git-Konfiguration festgelegt werden, aber selbst das wäre nicht gut genug für ein Projekt, das sowohl Windows- als auch UNIX-bezogene Inhalte enthält (z. B. habe ich ein Windows-Projekt mit einigenbash
Dienstprogramm-Skripten).Die beste Wahl, die ich gefunden habe, ist das Erstellen von .gitattributes- Dateien pro Repository . Der GitHub-Artikel erwähnt es.
Beispiel aus diesem Artikel:
In einem Repository meines Projekts:
Es sind etwas mehr Dinge einzurichten, aber tun Sie es einmal pro Projekt, und jeder Mitwirkende unter jedem Betriebssystem sollte keine Probleme mit Zeilenenden haben, wenn er mit diesem Projekt arbeitet.
quelle
text=false eol=false
etwas ähnlich funktioniertebinary
. Klingt das richtig? Es könnte nützlich sein anzugeben "Ich weiß, dass dies Textdateien sind, aber ich möchte nicht, dass sie normalisiert werden"In vim öffnen Sie die Datei (zB:
:e YOURFILE
ENTER), dannquelle
vim
würde das gesamte Zeilenende intakt bleiben.Ich hatte auch dieses Problem.
SVN führt keine Konvertierung von Zeilenenden durch, daher werden Dateien mit intakten CRLF-Zeilenenden festgeschrieben. Wenn Sie dann git-svn verwenden, um das Projekt in git zu platzieren, bleiben die CRLF-Endungen im git-Repository erhalten, in dem sich git nicht befindet. Standardmäßig werden nur Unix / Linux-Zeilenenden (LF) verwendet eingecheckt.
Wenn Sie dann die Dateien unter Windows auschecken, bleiben die Dateien bei der Autocrlf-Konvertierung intakt (da sie bereits die richtigen Endungen für die aktuelle Plattform haben). Der Prozess, der entscheidet, ob es einen Unterschied zu den eingecheckten Dateien gibt, führt jedoch die umgekehrte Konvertierung durch Vor dem Vergleich wird der LF in der ausgecheckten Datei mit einem unerwarteten CRLF im Repository verglichen.
Soweit ich sehen kann, haben Sie folgende Möglichkeiten:
Fußnote: Wenn Sie Option 2 wählen, ist meine Erfahrung, dass einige der Zusatzwerkzeuge (Rebase, Patch usw.) nicht mit CRLF-Dateien umgehen und Sie früher oder später mit Dateien mit einer Mischung aus CRLF und LF (inkonsistente Zeile) enden Endungen). Ich kenne keine Möglichkeit, das Beste aus beiden herauszuholen.
quelle
rebase
hat kein Problem mit CRLF. Das einzige mir bekannte Problem ist, dass das Standard-Git-Merge-Tool seine Konfliktmarkierungen ("<<<<<<", ">>>>>>" usw.) nur mit LF einfügt, sodass eine Datei mit Konfliktmarkierungen verwendet wird gemischte Zeilenenden haben. Sobald Sie jedoch die Markierungen entfernt haben, ist alles in Ordnung.Entfernen Sie das Folgende aus der Datei ~ / .gitattributes
* text=auto
verhindert, dass Git überhaupt die Zeilenenden überprüft.
quelle
false
, hilft es nicht viel, wenn autocrlf auf false gesetzt wird. Wenn dies nicht entfernt wird, hilft mir dies nicht (aber dies allein reicht nicht aus).text=
Einstellung.gitattributes
überhaupt ausdrücklich erwähnt wird (die, falls vorhanden, ein Blocker sein wird). Die anderen Antworten sind also unvollständig. Ich war verrückt, um herauszufinden, warum meine Dateien weiterhin als "geändert" angezeigt wurden, egal wie oft ich meine Einstellungen geändertautocrlf
undsafecrlf
den Git-Cache ausgecheckt und gelöscht und den Hard-Reset durchgeführt habe.Es sollte lauten:
Dieses Bild sollte erklären, was es bedeutet.
quelle
http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/
Wenn Sie dies bei einem separaten Commit oder Git tun, werden möglicherweise immer noch ganze Dateien als geändert angezeigt, wenn Sie eine einzelne Änderung vornehmen (abhängig davon, ob Sie die Option autocrlf geändert haben).
Dieser funktioniert wirklich. Git respektiert die Zeilenenden in Projekten mit gemischten Zeilenenden und warnt Sie nicht davor.
quelle
*.sh -crlf
ganze Zeit ...Ich weiß nicht viel über Git unter Windows, aber ...
Mir scheint, dass git das Rückgabeformat so konvertiert, dass es dem der laufenden Plattform (Windows) entspricht. CRLF ist das Standardrückgabeformat in Windows, während LF das Standardrückgabeformat für die meisten anderen Betriebssysteme ist.
Möglicherweise wird das Rückgabeformat ordnungsgemäß angepasst, wenn der Code auf ein anderes System verschoben wird. Ich denke auch, dass Git klug genug ist, um Binärdateien intakt zu halten, anstatt zu versuchen, LFs in CRLFs in beispielsweise JPEGs zu konvertieren.
Zusammenfassend müssen Sie sich wahrscheinlich nicht zu sehr über diese Konvertierung ärgern. Wenn Sie jedoch Ihr Projekt als Tarball archivieren, würden andere Programmierer wahrscheinlich eher LF-Leitungsterminatoren als CRLF schätzen. Abhängig davon, wie sehr Sie sich interessieren (und davon, dass Sie Notepad nicht verwenden), möchten Sie möglicherweise git so einstellen, dass LF-Rückgaben verwendet werden, wenn Sie können :)
Anhang: CR ist ASCII-Code 13, LF ist ASCII-Code 10. Somit ist CRLF zwei Bytes, während LF eins ist.
quelle
Stellen Sie sicher, dass Sie das neueste Git installiert haben.
Ich habe wie oben beschrieben
git config core.autocrlf false
, als ich git (Version 2.7.1) verwendet habe, aber es hat nicht funktioniert.Dann funktioniert es jetzt beim Upgrade von git (von 2.7.1 auf 2.20.1).
quelle
quelle
git config --global core.autocrlf false
, Git daran zu hindern, die ZeilenendenUnix
bei einem Commit auf zu setzen. Follow - up mitgit config core.autocrlf
ihm zu überprüfen , in der Tat auf false gesetzt ist.Die Frage von OP bezieht sich auf Windows und ich konnte keine anderen verwenden, ohne in das Verzeichnis zu gehen oder eine Datei in Notepad ++ auszuführen, da der Administrator nicht funktionierte. Also musste ich diesen Weg gehen:
quelle
In vielen Texteditoren können Sie zu wechseln
LF
, siehe Atom-Anweisungen unten. Einfach und explizit.Klicken Sie
CRLF
unten rechts auf:Wählen
LF
Sie oben in der Dropdown-Liste Folgendes aus:quelle
In einer GNU / Linux-Shell-Eingabeaufforderung können Sie mit den Befehlen dos2unix & unix2dos Ihre von MS Windows stammenden Dateien einfach konvertieren / formatieren
quelle
CRLF kann Probleme verursachen, wenn Sie Ihren "Code" in zwei verschiedenen Betriebssystemen (Linux und Windows) verwenden. Mein Python-Skript wurde im Linux-Docker-Container geschrieben und dann mit Windows Git-Bash gepusht. Es gab mir die Warnung, dass LF durch CRLF ersetzt wird. Ich habe nicht viel darüber nachgedacht, aber als ich das Skript später startete, hieß es
/usr/bin/env: 'python\r': No such file or directory
. Nun, das ist eine\r
Verzweigung für Sie. Windows verwendet "CR" - Wagenrücklauf - über '\ n' als neues Zeilenzeichen -\n\r
. Das müssen Sie vielleicht berücksichtigen.quelle
Die meisten Tools in Windows akzeptieren nur LF in Textdateien. Beispielsweise können Sie das Verhalten von Visual Studio in einer Datei mit dem Namen ".editorconfig" mit folgendem Beispielinhalt (Teil) steuern:
Nur das ursprüngliche Windows-Notepad funktioniert nicht mit LF, aber es gibt einige einfachere einfache Editor-Tools!
Daher sollten Sie LF auch in Textdateien in Windows verwenden. Dies ist meine Nachricht, dringend empfohlen! Es gibt keinen Grund, CRLF in Windows zu verwenden!
(Dieselbe Diskussion verwendet \ in include-Pfade in C / ++, es ist Bullshit, verwenden Sie #include <pathTo / myheader.h> mit Schrägstrich!, Es ist der C / ++ - Standard und alle Microsoft-Compiler unterstützen ihn).
Daher ist die richtige Einstellung für Git
Meine Botschaft: Vergessen Sie alte Denkprogramme wie dos2unix und unix2dos. Stellen Sie in Ihrem Team klar, dass LF unter Windows ordnungsgemäß verwendet werden kann.
quelle