Beachten Sie die Zeilenenden von git diff
:
- IP_ADDR: 'http://1.2.3.4:143'
+ IP_ADDR: 'http://2.4.6.8:143'^M
Ich habe diese Datei bearbeitet, indem ich den Cursor auf die neue IP-Adresse gesetzt und dann 1
gedrückt ct:
und sie eingegeben habe. Es wurden keine ganzen Zeilen zur Datei hinzugefügt oder daraus entfernt. Mir fällt jedoch auf, dass die Datei in VIM als Typ angezeigt wird dos
.
Warum sollte VIM das Zeilenende ändern, wenn ich diesen Teil des Dokuments nicht explizit bearbeitet habe? Wenn man sieht, dass in der Originalzeile diff
kein vorhanden war , wie hätte VIM sonst entscheiden können, dass es sich um eine Datei handelt?^M
dos
Antwort1
Vim erkennt das ursprüngliche Dateiformat (unter denen, die in konfiguriert sind 'fileformats'
) und schreibt mit demselben. Die einzige Möglichkeit für Vim, zu wechseln (z. B. von Unix zum Windows-Stil), ist über ein explizites :setlocal fileformat=dos
. Es ist unwahrscheinlich, dass Sie das in Ihrer Konfiguration haben; :verbose setl ff?
ich könnte es Ihnen sagen.
Ich würde mir keine allzu großen Sorgen um den Git-Diff selbst machen (solange nichtalleZeilen erscheinen als geändert, dann haben Sie tatsächlich einen Wechsel der Zeilenenden), sondern dass das, was festgeschrieben wird, in Ordnung ist.
Beachten Sie, dass Git mit der Git-Einstellung autocrlf = true
Zeilenumbrüche beim Auschecken von Dateien in den Systemstandard und beim Commit in LF-Zeilenumbrüche konvertiert. Es könnte also alles in Ordnung sein, nur die Git-Diff-Ausgabe verwirrt Sie.
Antwort2
Dies ist ein Beweis dafür, dass wir alle in der Matrix leben. Wenn dies wirklich das 21. Jahrhundert wäre, würden wir nicht immer noch mit unterschiedlichen Zeilenenden kämpfen.
Vim macht das Richtige mit Zeilenenden ziemlich gut. Die Details werden unter erklärt :help 'ffs'
. Natürlich kann vim Ihre Gedanken nicht lesen: Wenn Ihre DateiinkonsistentZeilenenden, dann macht vim möglicherweise nicht das, was Sie wollen.
Ich schlage vor, die Datei in vim zu öffnen und dann
:e! ++ff=unix
Dadurch wird die Datei erneut von der Festplatte geladen, wodurch vim gezwungen wird, Zeilenenden im Unix-Stil zu verwenden. Dann sollten Sie genau sehen, welche Zeilen CRLF-Endungen haben, da sie mit Rohzeichen enden ^M
.
Obwohl ich Git liebe, kenne und vertraue ich ihm nicht so gut wie Vim. Ich glaube, dass manche Leute „einstellen und vergessen“-Konfigurationen für Git- crlf
Einstellungen empfehlen, die zu Verwirrung führen können. Ich vermeide lieber die Einstellung, die @Ingo Karkat in seiner Antwort erwähnt hat. Ich möchte, dass Git dieselbe Datei auscheckt, die eingecheckt wurde, und mich (und Vim) die Zeilenenden übernehmen lässt.
Antwort3
git diff
zeigt nur Wagenrückläufe ( ^M
) in hinzugefügten Zeilen an, nicht aber in entfernten oder unveränderten Zeilen. Dies kann man erkennen, wenn man das -R
Flag verwendet, das den Unterschied umgekehrt anzeigt.
$ git diff -R
:
- IP_ADDR: 'http://2.4.6.8:143'
+ IP_ADDR: 'http://1.2.3.4:143'^M
Vim fügt also nichts hinzu, insbesondere nicht für nur eine Zeile. Vim verwendet die Zeilenenden, die es beim Öffnen der Datei findet.
Antwort4
Vim bestimmt anhand des Werts der Option „fileformat“, ob es sich bei der aktuell geöffneten Datei um eine DOS-, UNIX- oder Mac-Datei handelt. Der Wert der Option „fileformat“ wird durch den Wert der Option „fileformats“ bestimmt.
Wenn vim eine Datei öffnet, bestimmt vim einen gültigen Wert für die Option „fileformat“ für den aktuellen Puffer basierend auf dem Wert der aktuellen Option „fileformats“. Im Folgenden finden Sie eine Beschreibung des vim-Handbuchs, wie vim den Wert der Option „fileformats“ des aktuellen Puffers anhand des Werts der Option „fileformats“ bestimmt:
'fileformats' 'ffs' string (default:
Vim+Vi MS-DOS, MS-Windows OS/2: "dos,unix",
Vim Unix: "unix,dos",
Vim Mac: "mac,unix,dos",
Vi Cygwin: "unix,dos",
Vi others: "")
global
{not in Vi}
This gives the end-of-line (<EOL>) formats that will be tried when
starting to edit a new buffer and when reading a file into an existing
buffer:
- When empty, the format defined with 'fileformat' will be used
always. It is not set automatically.
- When set to one name, that format will be used whenever a new buffer
is opened. 'fileformat' is set accordingly for that buffer. The
'fileformats' name will be used when a file is read into an existing
buffer, no matter what 'fileformat' for that buffer is set to.
- When more than one name is present, separated by commas, automatic
<EOL> detection will be done when reading a file. When starting to
edit a file, a check is done for the <EOL>:
1. If all lines end in <CR><NL>, and 'fileformats' includes "dos",
'fileformat' is set to "dos".
2. If a <NL> is found and 'fileformats' includes "unix", 'fileformat'
is set to "unix". Note that when a <NL> is found without a
preceding <CR>, "unix" is preferred over "dos".
3. If 'fileformat' has not yet been set, and if a <CR> is found, and
if 'fileformats' includes "mac", 'fileformat' is set to "mac".
This means that "mac" is only chosen when:
"unix" is not present or no <NL> is found in the file, and
"dos" is not present or no <CR><NL> is found in the file.
Except: if "unix" was chosen, but there is a <CR> before
the first <NL>, and there appear to be more <CR>s than <NL>s in
the first few lines, "mac" is used.
4. If 'fileformat' is still not set, the first name from
'fileformats' is used.
When reading a file into an existing buffer, the same is done, but
this happens like 'fileformat' has been set appropriately for that
file only, the option is not changed.
When 'binary' is set, the value of 'fileformats' is not used.
When Vim starts up with an empty buffer the first item is used. You
can overrule this by setting 'fileformat' in your .vimrc.
For systems with a Dos-like <EOL> (<CR><NL>), when reading files that
are ":source"ed and for vimrc files, automatic <EOL> detection may be
done:
- When 'fileformats' is empty, there is no automatic detection. Dos
format will be used.
- When 'fileformats' is set to one or more names, automatic detection
is done. This is based on the first <NL> in the file: If there is a
<CR> in front of it, Dos format is used, otherwise Unix format is
used.
Also see |file-formats|.
For backwards compatibility: When this option is set to an empty
string or one format (no comma is included), 'textauto' is reset,
otherwise 'textauto' is set.
NOTE: This option is set to the Vi default value when 'compatible' is
set and to the Vim default value when 'compatible' is reset.
Um auf Ihre Frage zurückzukommen: Ihre Datei wird in Vim als DOS-Datei erkannt. Wenn Sie die Datei speichern und Vim beenden, ersetzt Vim das Zeilenumbruchzeichen automatisch durch das Zeilenumbruchzeichen im DOS-Stil: .
In Ihrem Git-Arbeitsverzeichnisbaum ist diese Datei eine DOS-Datei, aber da diese Datei im Git-Indexbaum eine Unix-Datei ist, git diff
werden Sie durch die Verwendung sehen, dass sich die Datei geändert hat. Bei einer Datei im Unix-Format wird das Extra als Zeichen ^M angezeigt.