Виконуючи це, git diff
він говорить "Немає нового рядка в кінці файлу" .
Гаразд, немає нового рядка в кінці файлу. Яка велика справа?
Яке значення повідомлення і що він намагається нам сказати?
Виконуючи це, git diff
він говорить "Немає нового рядка в кінці файлу" .
Гаразд, немає нового рядка в кінці файлу. Яка велика справа?
Яке значення повідомлення і що він намагається нам сказати?
Відповіді:
Це вказує на те, що у вас немає нового рядка (зазвичай він '\n'
називається CR або CRLF) в кінці файлу.
Тобто, просто кажучи, останній байт (або байти, якщо ви працюєте в Windows) у файлі - це не новий рядок.
Повідомлення відображається, тому що в іншому випадку немає способу визначити різницю між файлом, де в кінці є новий рядок, і тим, де немає. Diff доводиться виводити новий рядок, інакше результат буде важче прочитати чи обробити автоматично.
Зауважте, що це гарний стиль завжди ставити новий рядок як останній символ, якщо це дозволяє формат файлу. Крім того, наприклад, для файлів заголовків C і C ++ це вимагається мовним стандартом.
Це не просто поганий стиль, це може призвести до несподіваної поведінки під час використання інших інструментів у файлі.
Ось test.txt
:
first line
second line
Немає символу нової лінії в останньому рядку. Давайте подивимося, скільки рядків у файлі:
$ wc -l test.txt
1 test.txt
Можливо, це ви хочете, але в більшості випадків ви, напевно, очікували, що у файлі буде 2 рядки.
Крім того, якщо ви хочете комбінувати файли, він може не вести себе так, як ви очікували:
$ cat test.txt test.txt
first line
second linefirst line
second line
Нарешті, це зробило б ваші відмінності трохи шумнішими, якби ви додали новий рядок. Якщо ви додали третій рядок, він відображатиме редагування другого рядка, а також нове доповнення.
Єдина причина полягає в тому, що в Unix історично було встановлено, що всі текстові файли, прочитані людиною, закінчуються новим рядком. У той час це уникало додаткової обробки під час відображення або приєднання текстових файлів, а також уникало поводження з текстовими файлами по-різному до файлів, що містять інші види даних (наприклад, необроблені бінарні дані, які не читаються людиною).
Через цю конвенцію багато інструментів тієї епохи очікують закінчення нового рядка, включаючи редактори тексту, різні інструменти та інші засоби обробки тексту. Mac OS X був побудований на BSD Unix, а Linux був розроблений як сумісний з Unix, тому обидві операційні системи успадкували однакові конвенції, поведінку та інструменти.
Windows не була розроблена як сумісна з Unix, тому вона не має тієї ж умовності, і більшість програмного забезпечення для Windows буде чудово справлятися з відсутностім нового рядка.
Але, оскільки Git був розроблений спочатку для Linux, і багато програмного забезпечення з відкритим кодом побудовано на сумісних з Unix системах, таких як Linux, Mac OS X, FreeBSD тощо, більшість спільнот з відкритим кодом та їх інструменти (включаючи мови програмування) продовжуються слідувати цим умовам.
Існують технічні причини, які мали сенс у 1971 році, але в цю епоху це здебільшого конвенція та підтримка сумісності з існуючими інструментами.
Якщо ви додасте новий рядок тексту в кінці наявного файлу, який ще не маєnewline character
кінці, diff покаже старий останній рядок як змінений, навіть якщо концептуально це не було.
Це хоча б одна вагома причина додати newline character
кінці.
Файл містить:
A() {
// do something
}
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
Тепер ви редагуєте його
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..
Git diff покаже:
-}
\ No newline at end of file
+}
+// Useful comment.
Іншими словами, це показує більшу різницю, ніж це було концептуально. Це показує, що ви видалили рядок }
і додали рядок }\n
. Це насправді те, що трапилося, але це не те, що концептуально сталося, тому може бути заплутаним.
Причина, що ця конвенція застосована на практиці, полягає в тому, що в операційних системах, схожих на UNIX, символ нового рядка розглядається як термінатор лінії та / або межа повідомлення (це включає в себе трубопроводи між процесами, буферизацію рядків тощо).
Розглянемо, наприклад, що файл із символом нового рядка трактується як один, порожній рядок. І навпаки, файл довжиною нульових байтів - це фактично порожній файл із нульовими рядками. Це можна підтвердити відповідно доwc -l
команди.
Загалом така поведінка є розумною, оскільки не було б іншого способу розрізнити порожній текстовий файл від текстового файлу з одним порожнім рядком, якби \n
символ був просто роздільником рядків, а не строковим термінатором. Таким чином, дійсні текстові файли завжди повинні закінчуватися символом нового рядка. Винятком є лише те, що текстовий файл має бути порожнім (без рядків).
Є одне, чого я не бачу в попередніх відповідях. Попередження про відсутність кінця рядка може бути попередженням, коли частина файлу врізана. Це може бути симптомом відсутніх даних.
Основна проблема полягає в тому, що ви визначаєте рядок і чи є послідовність кінцевих символів частиною рядка чи ні. Редактори на основі UNIX (наприклад, VIM) або інструменти (наприклад, Git) використовують послідовність символів EOL як термінатор рядка, тому це частина рядка. Це схоже на використання крапки з комою (;) у C та Pascal. У C крапкою з комою закінчуються висловлювання, у Паскалі вони їх розділяють.
Це насправді викликає проблеми, оскільки закінчення рядків автоматично змінюються брудними файлами, не вносячи до них жодних змін. Дивіться цю публікацію для вирішення.
Вихідні файли часто об'єднуються інструментами (C, C ++: файли заголовків, Javascript: пакети). Якщо ви опустите символ нового рядка, ви можете ввести неприємні помилки (де останній рядок одного джерела з'єднаний з першим рядком наступного вихідного файлу). Будемо сподіватися, що всі інструменти, що містяться у фіксації вихідного коду, все-таки вставляють новий рядок між об'єднаними файлами, але це не завжди так.
Суть проблеми полягає в тому, що - у більшості мов нові рядки мають смислове значення, а кінцева частина файлу не є мовою, визначеною альтернативою символу нового рядка. Таким чином, вам слід припинити кожне висловлювання / вираз із символом нового рядка - включаючи останній.
//
коментар стилю посередині коду.
Ваш оригінальний файл, ймовірно, не мав символу нового рядка.
Однак деякі редактори, такі як gedit в Linux, мовчки додають новий рядок в кінці файлу. Ви не можете позбутися цього повідомлення під час використання такого роду редакторів.
Що я намагався подолати це питання - це відкрити файл редактором коду візуальної студії
Цей редактор чітко показує останній рядок, і ви можете видалити рядок за своїм бажанням.
З чим це варто, я зіткнувся з цим, коли створив проект IntelliJ на Mac, а потім перемістив проект на свою машину Windows. Мені довелося вручну відкривати кожен файл і змінювати налаштування кодування в нижньому правому куті вікна IntelliJ. Напевно, не трапляється з більшістю, якщо хтось, хто читав це запитання, але це могло врятувати мене пару годин роботи ...