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


156

env:

  • Windows 7
  • msysgit

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

warning: LF will be replaced by CRLF. 

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

warning: CRLF will be replaced by LF. 


2
@devnull Я имею в виду предупреждение хвостом назад, не так ли?
Honghe.Wu

@ Honghe.Wu Нет, его нет в Windows. Я отредактировал свой ответ ниже
VonC

13
Отличный вопрос, потому что на самом деле предупреждение кажется обратным. Это действительно сбивает с толку - получить это предупреждение о преобразовании в CRLF при фиксации, и никакие объяснения обработки пробелов в Git не помогут, потому что предупреждение направлено в обратном направлении .
Stijn de Witt

@ user1460043 Не стесняйтесь голосовать за комментарий :) Но я не думаю, что подтверждение факта достойно ответа. Это просто ошибка в Git для Windows. Кто-то просто должен сообщить об этом (а еще лучше, исправить)
Stijn de Witt

Ответы:


193

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

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

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

git config --global core.autocrlf false

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


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

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

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

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

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

Как уже упоминалось в Сяопина «s ответ , что предупреждение является такой же , как:

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

Как упоминалось в git-for-windows/gitвыпуске 1242 :

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

Примечание: Git 2,19 (сентябрь 2018), при использовании core.autocrlf, фиктивная «LF будет заменен CRLF» предупреждение теперь подавляется .


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

Это конкретное предупреждение " LF will be replaced by CRLF" исходит от convert.c # 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#convert_to_git(), сам вызывается convert.c#renormalize_buffer().

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

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


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

См. Коммит 8462ff4 (13 января 2018 г.) Торстена Бёгерсхаузена ( tboegi) .
(Объединено Junio ​​C Hamano - 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

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

См. Commit 6cb0912 (4 июня 2018 г.) Энтони Соттиля ( asottile) .
(Объединено Junio ​​C Hamano - gitster- в фиксации 8063ff9 , 28 июня 2018 г.)


1
Да, большинство редакторов могут сохранять стиль EOL, но в большинстве редакторов это не влияет на создание нового файла в том же проекте. Убедитесь, что вы не проверяете проект LF, подумайте «psh, мой редактор может обрабатывать окончания строк LF, мне не нужен autocrlf», а затем забудьте вручную установить новые файлы на окончания строк LF.

16
@VonC Должен признаться, я не понимаю. В Git-Book говорится, что Git может справиться с этим путем автоматического преобразования окончаний строк CRLF в LF при фиксации, и наоборот, когда он извлекает код в вашу файловую систему. Это означает, что при фиксации будет преобразование в LF, а не в CRLF . Это означает, что указанное предупреждение неверно. Наличие всегдаcore.autocrlf=true будет уступать LF в репо и CRLF в рабочем дереве imho (даже под Windows). Источник: ссылка
quaylar

13
«Этот хвост предупреждения направлен назад? Это должно происходить только при оформлении заказа». Я вижу это точное предупреждение при фиксации . Так что да , это отсталость. Это обратное побудило меня искать это. Рад, что другие тоже это заметили! Людей, которые на самом деле читают эти предупреждения, очень сбивает с толку, когда они видят, что они будут преобразованы в CRLF в сообщении фиксации.
Stijn de Witt

7
«Поэтому я подозреваю, что это преобразование происходит при фиксации git, только если упомянутая фиксация является частью процесса слияния». Неа. Я вижу это в обычных коммитах.
Stijn de Witt

3
Что меня беспокоит в сообщении, так это то, что оно вообще всплывает. почему мне нужно ПРЕДУПРЕЖДЕНИЕ, что git собирается сделать именно то, что я настроил. Мне не нужно предупреждение: «Эй, мы все еще конвертируем окончания строк, как вы нас просили». Когда система работает по задумке, она не должна выдавать ненужных предупреждений, или люди пропускают важные предупреждения в море не относящихся к делу сообщений.
Брент Ларсен

30

ДА, предупреждение перевернуто.

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

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

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

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

;)


1
Странно то, что если вы принудительно конвертируете локальные файлы в Windows в LF, вы даже не можете git add файлы, сообщение жалуется и аннулирует вашу фиксацию.
phpguru

24

--Обновление 9 июля ---

Удалено сообщение «Это правильно и точно», прокомментированное @mgiuca.

======

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

Он должен читать:

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

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

Эта картинка должна объяснить, что это значит. введите описание изображения здесь


Для меня хорошо работает: 1) core.autocrlf = false 2) в Intellij установите разделитель строк (\ n). Я использую Intellij Idea как на Mac, так и на Windows.
Сяо Пэн - ZenUML.com

Это может произойти, если файл был создан в Windows, но имеет окончание строки unix / mac (lf) и ваше свойство git config autocrlf имеет значение true. По сути, git не собирается изменять созданный вами файл, но он проверит его / клонирует с окончанием строки Windows (из-за вашей настройки autocrlf)
Патрик

1
Насколько правильным и точным является предупреждение, если вы должны квалифицировать его с помощью «Если вы извлечете его / или клонируете в другую папку с вашей текущей конфигурацией core.autocrlf». Это не то, о чем говорится в исходном сообщении. Он говорит, что он БУДЕТ (не может быть) заменен на CRLF, подразумевая, что он будет храниться в режиме CRLF в самом репо, а не в какой-то гипотетической будущей проверке.
mgiuca

13

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

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

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

Что ДОЛЖНО читать ошибка:

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

Пояснение здесь :

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

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


7

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

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

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

1

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

Я совершил новую покупку с помощью core.autocrlf=trueи теперь не получаю эти сообщения.


-1

Если вы используете Visual Studio 2017, 2019, вы можете:

  1. откройте основной .gitignore (обновите или удалите другие файлы .gitignore в других проектах в решении)
  2. вставьте приведенный ниже код:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
Этот «код» выглядит так, как будто он должен быть в конфигурационном файле, например .gitconfigor .git/config, not .gitignore, который указывает файлы, которые git игнорирует.
davidA

Я добавил это в .git / config, но по-прежнему появляется "предупреждение: CRLF будет заменен на LF"
Сергей

-1

Сделайте простую вещь:

  1. Откройте git-hub (Shell) и перейдите в каталог, к которому принадлежит файл (cd / a / b / c / ...)
  2. Запустите dos2unix (иногда - dos2unix.exe)
  3. Попробуйте зафиксировать сейчас. Если вы снова получите ту же ошибку. Выполните все вышеперечисленные шаги, за исключением того, что вместо dos2unix выполните unix2dox (иногда unix2dos.exe)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.