Что Visual Studio подразумевает под нормализацией несовместимых окончаний строк?

Visual Studio иногда сообщает мне:

Окончания строк в следующих файлах не совпадают. Хотите нормализовать окончания строк?

Затем он дает мне раскрывающийся список с различными стандартами или чем-то еще, например, Windows, Mac, Unix и парой стандартов Unicode.

Что это значит и что произойдет, если я нажму Yes?


person Ryan    schedule 16.02.2009    source источник
comment
Visual Studio показывает мне то же сообщение, но файл, на который оно ссылается, на самом деле является папкой! Что это обозначает?!   -  person Colonel Panic    schedule 05.10.2012
comment
Я сделал небольшую утилиту, чтобы сделать это для всего каталога или рекурсивно через набор каталогов для всех файлов с определенным расширением (например, * .c или * .h), хотя я использую Delphi, утилита работает с любым исходным кодом Windows файлы. Исходный код включен плюс двоичный (exe). Он сообщит, в каких строках есть лишние переводы строки (например, отсутствующие символы возврата каретки) или дополнительные символы возврата каретки (например, отсутствующие переводы строк). docs.google.com/file/d/0B07SrKpE1SWzArmb/   -  person Warren P    schedule 25.04.2013
comment
У них должна быть опция в раскрывающемся списке, которая гласит: «отдавать предпочтение наиболее распространенному типу окончания строки из остальной части файла / проекта».   -  person Ryan    schedule 23.01.2016


Ответы (12)


Обычно это означает, что у вас есть строки, заканчивающиеся чем-то другим, кроме пары «возврат каретки / перевод строки». Это часто случается, когда вы копируете и вставляете с веб-страницы в редактор кода.

Нормализация окончаний строк - это просто обеспечение согласованности всех символов окончания строки. Он не позволяет одной строке заканчиваться на \r\n, а другой - на \r или \n; первая - это пара конца строки Windows, а остальные обычно используются для файлов Mac или Linux.

Поскольку вы разрабатываете в Visual Studio, вы, очевидно, захотите выбрать «Windows» из раскрывающегося списка. :-)

person Ken White    schedule 16.02.2009
comment
как строка заканчивается без возврата каретки ...? - person Ryan; 16.02.2009
comment
Так почему же визуальная студия заботится о том, как кончаются линии, очевидно, что флип распознает все разные типы, он должен просто радоваться и заткнуться. - person Ryan; 16.02.2009
comment
Ах, но что, если вы просто используете VS, чтобы исправить то, что не для Windows? Быстрое исправление утилит Linux или чего-то, написанного на C / C ++, и вы не хотите добавлять CRLF? Подождите, а теперь вы хотите, чтобы MS прочитал ваши мысли и знал, что использовать? ‹G› Команда VS все равно ошибается, не так ли? Блин! - person Ken White; 21.02.2009
comment
Ой, Кен, ты прав, если мне случится редактировать некоторые файлы, которые я планирую скомпилировать в Linux, и я знаю, что компилятор задохнется и умрет, если у него не будет именно тех окончаний строк, которые ему нужны, тогда у меня будет был рад VS позвольте мне выбрать ... СПАСИБО! - person Ryan; 23.09.2010
comment
Проблема не в том, что VS не может справиться с окончаниями строк Unix - может. Предупреждение сообщает вам, что окончания строк несовместимы - то есть некоторые строки в файле являются CRLF, а некоторые - LF. VS справится с этим, но другие приложения в вашей цепочке инструментов могут не справиться, поэтому он предупреждает вас. Если вас это не волнует, отключите предупреждение: Параметры - ›Среда -› Документы - ›« Проверять согласованность окончаний строк при загрузке ». Это предупреждение может быть очень полезным, если вы работаете над продуктами на нескольких платформах. - person the_mandrill; 24.08.2015
comment
Я прочитал все вышеперечисленные комментарии, но какой из них выбрать ради кроссплатформенности и спокойствия? Кстати, я использую VS для поддержки своего кода скрипта приложений, но в будущем может быть что-то еще. - person Antonio Ooi; 11.10.2016
comment
@AntonioOoi: Боюсь, что кросс-платформенная линия не заканчивается, пока Windows находится в миксе. Windows / DOS всегда использует CR / LF, в то время как все остальные известные мне ОС используют только LF. Дело в том, что нормализация окончаний строк гарантирует, что они все одинаковы, независимо от того, какой из них вы используете, что значительно упрощает переключение, если возникнет необходимость. Если большая часть того, что вы делаете, не относится к Windows, используйте только LF в стиле * nix; если большая часть из них - Windows, используйте пару CR / LF. - person Ken White; 11.10.2016
comment
Если я продолжаю получать это сообщение, может ли это означать, что нужно изменить мои настройки git или настройки git другого пользователя? Я уверен, что мой git настроен на фиксацию стиля Unix и проверку стиля Windows. Почему я все еще получаю это сообщение каждый раз для некоторых файлов? - person Martijn; 25.01.2021
comment
@Martijn: Боюсь, я не могу ответить на этот вопрос, не имея возможности посмотреть ваши файлы и настройки git. Я подозреваю, что это как-то связано с вашей конфигурацией git - по крайней мере, я бы начал искать, чтобы попытаться понять это. - person Ken White; 26.01.2021

Некоторые строки заканчиваются на \n.

Некоторые другие строки заканчиваются на \r\n.

Visual Studio предлагает сделать так, чтобы все строки заканчивались одинаково.

person Alex Reitbort    schedule 16.02.2009

Если вы используете Visual Studio 2012:

Перейдите в меню ФайлДополнительные параметры сохранения → выберите Тип окончания строк как Windows (CR LF).

person pankaj    schedule 12.02.2011
comment
Этот параметр не отображается в моем меню «Файл» для моей Visual Studio 2010 Ultimate версии 10.0.40219.1 SP1Rel. - person DOK; 11.07.2012
comment
@DOK, в моем меню «Файл» в версии Visual Studio 2010 Premium это так! - person Peter; 20.07.2012
comment
Если вы не видите эту опцию, вы можете настроить меню файла, выбрав Инструменты- ›Настроить, перейдя на вкладку команд и добавив команду. - person Rob; 24.04.2013
comment
Есть ли общая настройка, которая влияет на все файлы вместе? Больно делать это для всех источников под решением. - person Klaus; 28.07.2016

Чтобы включить / выключить этот параметр, выполните следующие действия на панели меню:

ИнструментыПараметрыСредаДокументыПроверять согласованность окончаний строк при загрузке

person CodingYoshi    schedule 10.04.2017

Файл, который вы редактируете, был отредактирован другим редактором, в котором не используются одинаковые окончания строк, в результате чего получился файл со смешанными окончаниями строк.

Для окончания строк используются следующие символы ASCII:

CR, возврат каретки
LF, перевод строки

Windows = CRLF
Mac OS 9 или более ранняя версия = CR
Unix = LF

person monowerker    schedule 16.02.2009

Вам может помочь новая строка в Википедии. Вот отрывок:

Различные соглашения о новой строке часто приводят к неправильному отображению текстовых файлов, которые были переданы между системами разных типов. Например, файлы из систем Unix или Apple Macintosh могут отображаться в виде одной длинной строки в некоторых программах, работающих в Microsoft Windows. И наоборот, при просмотре файла, созданного с компьютера Windows в системе Unix, дополнительный CR может отображаться как ^ M, или в конце каждой строки, или как второй разрыв строки.

person Richard Ev    schedule 16.02.2009

Это означает, что, например, некоторые из ваших строк текста имеют <Carriage Return><Linefeed> (стандарт Windows), а некоторые заканчиваются просто <Linefeed> (стандарт Unix).

Если вы нажмете «да», концы строк в исходном файле будут преобразованы в один и тот же формат.

Это не повлияет на компилятор (поскольку конец строки считается просто пробелом), но может иметь некоторое значение для других инструментов (например, 'diff' в вашей системе управления версиями).

person ChrisW    schedule 16.02.2009

Это не просто Visual Studio ... Любые инструменты, которые читают файлы, компиляторы, компоновщики и т. Д., Должны уметь с этим справиться.

В целом (для разработки программного обеспечения) мы принимаем проблему окончания мультиплатформенной линейки, но позволяем программе контроля версий решать ее.

person Peter Y    schedule 22.09.2010
comment
Я согласен. Лучше позволить вашей системе SCM сделать это. Если вы используете svn, см. Также stackoverflow.com/questions/15687/ - person kgriffs; 05.10.2010
comment
Полностью согласен. Что произойдет, если я работаю над проектом и использую Windows, а мой товарищ по команде использует Mac. Мы будем постоянно менять CR на CRLF и обратно. Лучше позволить SCM абстрагироваться от этого. Большинство ответов предполагают, что люди работают самостоятельно или все, кто работает над кодом, используют Windows. - person bytedev; 06.10.2016

Когда вы копируете и вставляете что-то из Интернета, вы можете получить несогласованные окончания строк.
Чтобы исправить это, вы можете использовать расширение Visual Studio "Line Endings Unifier", которое может автоматически согласовывать окончание строки при сохранении файла.

введите описание изображения здесь

person Jay Shah    schedule 12.10.2018
comment
К вашему сведению, это устаревший плагин для VS 2019. - person Shawn; 25.08.2020

Существует надстройка для Visual Studio 2008, которая преобразует формат конца строки при сохранении файла. Вы можете скачать его здесь: http://grebulon.com/software/stripem.php

person Community    schedule 17.08.2009
comment
Это может помочь, когда вы получаете сообщение об ошибке несогласованного окончания строки из svn. - person kgriffs; 05.10.2010

Окончание строки, также называемое новой строкой, концом строки (EOL) или разрывом строки, является управляющим символом или последовательностью управляющие символы в спецификации кодировки символов (например, ASCII или EBCDIC), которая используется для обозначения конца строки текста и начала новой. Некоторые текстовые редакторы устанавливают / реализуют этот специальный символ при нажатии клавиши ввода.

Символы возврата каретки, перевода строки представляют собой символы ASCII для конца строки (EOL). Они закончат текущую строку строки и начнут новую.

Однако на уровне операционной системы к ним относятся иначе:

  • Символ возврата каретки (CR) (ASCII 13 \ 0x0D, \ r): перемещает курсор в начало строки без перехода к следующей строке. Этот символ используется как символ новой строки в операционных системах Commodore и Early Macintosh (Mac OS 9 и ранее).

  • Символ перевода строки (LF) (ASCII 10 \ 0x0A, \ n): перемещает курсор вниз на следующую строку без возврата в начало строки. Этот символ используется в качестве символа новой строки в системах на базе Unix (Linux, macOS X, Android и т. Д.).

  • Символ перевода строки возврата каретки (CRLF) (0x0D0A, \ r \ n): на самом деле это два символа ASCII, представляющие собой комбинацию символов CR и LF. Он перемещает курсор как вниз, так и на следующую строку, и в ее начало. Этот символ используется в качестве символа новой строки в большинстве других операционных систем, отличных от Unix, включая Microsoft Windows и Symbian OS.

Нормализация несовместимых окончаний строк в Visual Studio означает выбор одного типа символов, который будет использоваться для всех ваших файлов. Возможно:

  • Символ перевода строки возврата каретки (CRLF)
  • Символ перевода строки (LF)
  • Символ возврата каретки (CR)

Однако вы можете установить это лучше, используя .gitattributes файл в корневом каталоге, чтобы избежать конфликтов при перемещении файлов из одной операционной системы в другую.

Просто создайте новый файл с именем .gitattributes в корневом каталоге вашего приложения:

touch .gitattributes

И добавьте в него следующее:

# Enforce Unix newlines
* text=auto eol=lf

Это принудительно устанавливает символ окончания строки перевода строки в Unix.

Примечание: если это уже существующий проект, просто запустите эту команду, чтобы обновить файлы для приложения, используя новую определенную строку, заканчивающуюся, как указано в .gitattributes.

git rm --cached -r .
git reset --hard

Это все.

Надеюсь, это поможет

person Promise Preston    schedule 24.07.2020

У меня была эта проблема в VS 2019, и я решил ее, установив конфигурацию LineBreak для Windows, прежде чем она была настроена для Unix.

Tools > Options > Format on Save > Settings > LineBreak: Windows

person Marcio Antônio    schedule 21.05.2021