Wenn Sie eine git diff
heißt es "Kein Zeilenumbruch am Ende der Datei" .
Welche Bedeutung hat die Botschaft und was will sie uns sagen?
Wenn Sie eine git diff
heißt es "Kein Zeilenumbruch am Ende der Datei" .
Welche Bedeutung hat die Botschaft und was will sie uns sagen?
Es zeigt an, dass Sie keinen Zeilenumbruch haben (normalerweise '\n'
(auch CR oder CRLF genannt) am Ende der Datei.
Das heißt, einfach ausgedrückt, das letzte Byte (oder die letzten Bytes, wenn Sie mit Windows arbeiten) in der Datei ist kein Zeilenumbruch.
Die Meldung wird angezeigt, weil es sonst keine Möglichkeit gibt, zwischen einer Datei mit und ohne Zeilenumbruch am Ende zu unterscheiden. Diff muss sowieso einen Zeilenumbruch ausgeben, sonst wäre das Ergebnis schwerer zu lesen oder automatisch zu verarbeiten.
Beachten Sie, dass es ein guter Stil ist, den Zeilenumbruch immer als letztes Zeichen zu setzen, wenn das Dateiformat dies zulässt. Außerdem ist dies beispielsweise für C- und C++-Headerdateien vom Sprachstandard vorgeschrieben.
Das ist nicht nur unschön, sondern kann auch zu unerwartetem Verhalten bei der Verwendung anderer Werkzeuge in der Datei führen.
Hier ist test.txt
:
first line
second line
In der letzten Zeile fehlt ein Zeilenumbruch. Schauen wir uns an, wie viele Zeilen die Datei enthält:
$ wc -l test.txt
1 test.txt
Vielleicht ist es das, was Sie wollen, aber in den meisten Fällen würden Sie wahrscheinlich erwarten, dass die Datei 2 Zeilen enthält.
Auch wenn Sie Dateien kombinieren möchten, verhält sich das Programm möglicherweise nicht so, wie Sie es erwarten:
$ cat test.txt test.txt
first line
second linefirst line
second line
Schließlich würde es Ihre Diffs etwas lauter machen, wenn Sie eine neue Leitung hinzufügen würden. Wenn Sie eine dritte Zeile hinzufügen, würde die Bearbeitung der zweiten Zeile sowie der neue Eintrag angezeigt.
Der einzige Grund dafür ist, dass unter Unix traditionell alle für Menschen lesbaren Textdateien mit einem Zeilenumbruch enden. Dadurch wurde damals eine zusätzliche Verarbeitung beim Anzeigen oder Verbinden von Textdateien vermieden und Textdateien wurden nicht anders behandelt als Dateien, die andere Arten von Daten enthalten (z. B. binäre Rohdaten, die nicht für Menschen lesbar sind).
Aufgrund dieser Konvention erwarten viele Tools aus dieser Zeit den abschließenden Zeilenumbruch, darunter Texteditoren, Diffing-Tools und andere Textverarbeitungsprogramme. Mac OS X wurde auf BSD Unix aufgebaut, und Linux wurde entwickelt, um Unix-kompatibel zu sein, so dass beide Betriebssysteme die gleichen Konventionen, Verhaltensweisen und Werkzeuge geerbt haben.
Windows wurde nicht entwickelt, um Unix-kompatibel zu sein, daher gibt es nicht dieselbe Konvention, und die meisten Windows-Programme kommen mit einem Zeilenumbruch am Ende gut zurecht.
Da Git jedoch zuerst für Linux entwickelt wurde und ein Großteil der Open-Source-Software auf Unix-kompatiblen Systemen wie Linux, Mac OS X, FreeBSD usw. entwickelt wird, folgen die meisten Open-Source-Gemeinschaften und ihre Werkzeuge (einschließlich Programmiersprachen) weiterhin diesen Konventionen.
Es gibt technische Gründe, die 1971 sinnvoll waren, aber heute geht es vor allem um Konventionen und die Kompatibilität mit bestehenden Werkzeugen.
Wenn Sie Folgendes hinzufügen eine neue Textzeile am Ende der bestehenden Datei, die nicht bereits über eine newline character
am Ende, zeigt der Diff die alte letzte Zeile als geändert an, auch wenn sie konzeptionell nicht geändert wurde.
Dies ist zumindest ein guter Grund für die Hinzufügung einer newline character
am Ende.
Eine Datei enthält:
A() {
// do something
}
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
Sie bearbeiten es nun zu
A() {
// do something
}
// Useful comment
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d0a 2f2f 2055 something.}.// U
00000020: 7365 6675 6c20 636f 6d6d 656e 742e 0a seful comment..
Das git diff zeigt:
-}
\ No newline at end of file
+}
+// Useful comment.
Mit anderen Worten, der Unterschied ist größer, als er eigentlich ist. Es zeigt, dass Sie die Zeile }
und fügte die Zeile }\n
. Das ist in der Tat passiert, aber nicht das, was konzeptionell Es kann also verwirrend sein.
Der Grund, warum diese Konvention in die Praxis umgesetzt wurde, ist, dass auf UNIX-ähnlichen Betriebssystemen ein Zeilenumbruchzeichen als Zeilenende und/oder Nachrichtenbegrenzung behandelt wird (dies beinhaltet Piping zwischen Prozessen, Zeilenpufferung usw.).
Eine Datei mit nur einem Zeilenumbruch wird beispielsweise als einzelne, leere Zeile behandelt. Umgekehrt ist eine Datei mit einer Länge von null Bytes eigentlich eine leere Datei mit null Zeilen. Dies lässt sich anhand der wc -l
Befehl.
Insgesamt ist dieses Verhalten vernünftig, da es keine andere Möglichkeit gibt, zwischen einer leeren Textdatei und einer Textdatei mit einer einzelnen leeren Zeile zu unterscheiden, wenn die \n
Zeichen war lediglich ein Zeilentrenner und kein Zeilenendzeichen. Daher sollten gültige Textdateien immer mit einem Zeilenumbruch enden. Die einzige Ausnahme ist, wenn die Textdatei leer sein soll (keine Zeilen).
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.