Windows git ": LF будет заменен CRLF", является ли это предупреждающим хвостом назад?

окр:

  • Windows 7
  • msysgit

Когда g я git commit, он говорит:

warning: LF will be replaced by CRLF. 

Является ли это предупреждение хвостом назад?
Я редактирую файл в Windows, конец строки CRLF, как этот рисунок:
enter image description here
И git изменяет его на LF для совершения репо.
Поэтому я думаю, что правильное предупреждение:

warning: CRLF will be replaced by LF. 

Ответ 1

предупреждение: LF будет заменен на CRLF.

В зависимости от того, какой редактор вы используете, текстовый файл с LF не обязательно будет сохранен с CRLF: последние редакторы могут сохранить стиль eol. Но эта настройка git config настаивает на изменении этих...

Просто убедитесь, что (как я рекомендую здесь):

git config --global core.autocrlf false

Таким образом, вы избегаете любых автоматических преобразований и можете указать их с .gitattributes файла core.eol директив core.eol.


Windows Git "LF будет заменен на CRLF"
Это предупреждение хвост назад?

Нет: вы находитесь в Windows, и на странице справки git config не упоминается

Используйте этот параметр, если вы хотите, чтобы в вашем рабочем каталоге были окончания строк CRLF даже если в репозитории нет нормализованных окончаний строк.

Как описано в " git, заменяющем LF на CRLF ", это должно происходить только при извлечении (а не при фиксации), с core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Как упоминалось в ответе XiaoPeng, это предупреждение аналогично:

предупреждение: (Если вы проверите его или клонируете в другую папку с текущей конфигурацией core.autocrlf ,) LF будет заменен на CRLF
Файл будет иметь исходные окончания строк в вашем (текущем) рабочем каталоге.

Как упомянуто в git-for-windows/git выпуск 1242:

Я все еще чувствую, что это сообщение сбивает с толку, сообщение может быть расширено, чтобы включить лучшее объяснение проблемы, например: "LF будет заменен на CRLF в file.json после удаления файла и проверки его снова".

Примечание: Git 2.19 (сентябрь 2018), когда используется core.autocrlf, core.autocrlf "LF будет заменено CRLF" теперь подавляется.


Как справедливо комментирует Куэйлар, если преобразование происходит при коммите, то только в LF.

Это конкретное предупреждение " LF will be replaced by CRLF " приходит из convert.С# check_safe_crlf():

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Он вызывается convert.c#crlf_to_git(), сам вызывается convert.c#crlf_to_git(), сам convert.c#convert_to_git() convert.c#renormalize_buffer().

И этот последний renormalize_buffer() вызывается только с помощью merge-recursive.c#blob_unchanged().

Поэтому я подозреваю, что это преобразование происходит в git commit только если указанный коммит является частью процесса слияния.


Примечание: в Git 2.17 (Q2 2018) очистка кода добавляет некоторые пояснения.

См. Коммит 8462ff4 (13 января 2018 г.) Торстена Бёгерсхаузена (tboegi).
(Объединено Джунио К Хамано - gitster - в коммите 9bc89b1, 13 февраля 2018 г.)

convert_to_git(): safe_crlf/checkafe становится int conv_flags

При вызове convert_to_git() параметр checksafe определил, что должно произойти, если преобразование EOL (CRLF --> LF --> CRLF) не выполняет чисто циклическую обработку.
Кроме того, он также определил, следует ли перенормировать окончания строк (CRLF --> LF) или оставить их как есть.

checkafe был перечислением safe_crlf со следующими значениями:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Обратите внимание, что регрессия, введенная в 8462ff4 (" convert_to_git(): safe_crlf/checksafe становится int conv_flags ", 2018-01-13, Git 2.17.0) еще в цикле Git 2.17, заставила autocrlf переписывать, чтобы autocrlf предупреждение, несмотря на установку safecrlf=false,

См. Коммит 6cb0912 (04 июня 2018 г.) Энтони Соттиля (asottile).
(Объединено Junio C Hamano - gitster - в коммите 8063ff9, 28 июня 2018 г.)

Ответ 2

ДА предупреждение назад.

И на самом деле это не должно даже быть предупреждением в первую очередь. Потому что все это предупреждение говорит (но, к сожалению, наоборот), что символы CRLF в вашем файле с окончанием строки Windows будут заменены LF на commit. Это означает, что он нормализуется к тем же окончаниям строк, которые используются * nix и MacOS.

Ничего странного не происходит, это именно то поведение, которое вы обычно хотели бы.

Это предупреждение в этой текущей форме является одной из двух вещей:

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

;)

Ответ 3

--Update 9-го July---

Удалено "Это правильно и точно", как прокомментировал @mgiuca

======

Это не говорит о ваших файлах в настоящее время с CRLF. Вместо этого речь идет о файлах с LF.

Следует читать:

предупреждение: (Если вы проверите его или клонируете в другую папку с текущей конфигурацией core.autocrlf ,) LF будет заменен на CRLF

Файл будет иметь исходные окончания строк в вашем (текущем) рабочем каталоге.

Эта картина должна объяснить, что это значит. enter image description here

Ответ 4

Все это предполагает core.autocrlf=true

Исходная ошибка:

предупреждение: LF будет заменен CRLF
Файл будет иметь исходные окончания строки в вашем рабочем каталоге.

ЧТО НЕОБХОДИМО прочитать сообщение:

предупреждение: LF будет заменен CRLF в вашем рабочем каталоге
Файл будет иметь исходные концы LF в репозитории git

Объяснение здесь:

Побочный эффект этого удобного преобразования, и это то, о чем предупреждает вас, заключается в том, что если текстовый файл, который вы создали, первоначально имел LF-окончания вместо CRLF, он будет храниться с LF, как обычно, но после этого он будет иметь окончания CRLF. Для обычных текстовых файлов это нормально. Предупреждение является "для вашей информации" в этом случае, но в случае, если git неправильно оценивает двоичный файл как текстовый файл, это важное предупреждение, потому что git будет искажать ваш двоичный файл.

В основном, локальный файл, который ранее был LF, теперь имеет локальный CRLF

Ответ 5

git config --global core.autocrlf false хорошо работает для глобальных настроек.

Но если вы используете Visual Studio, может также потребоваться изменить .gitattributes для некоторых типов проектов (например, приложение библиотеки классов С#):

  • удалить строку * text=auto

Ответ 6

После того, как я установил core.autocrlf=true, я получал "LF будет заменен CRLF" (обратите внимание, что "CRLF будет заменен LF" ), когда я был git add ing (или, возможно, он был на git commit? ) отредактировал файлы в окнах в репозитории (который использует LF), который был извлечен, прежде чем я установил core.autocrlf=true.

Я сделал новый checkout с core.autocrlf=true, и теперь я не получаю эти сообщения.

Ответ 7

Сделайте только простую вещь: 1. Откройте git -hub (Shell) и перейдите к файлу каталога, принадлежащему (cd/a/b/c/...) 2. Выполнить dos2unix (иногда dos2unix.exe) 3. Попробуйте выполнить сейчас. Если вы снова получите ту же ошибку. Выполните все вышеописанные шаги, кроме как вместо dos2unix, выполните unix2dox (unix2dos.exe когда-нибудь)