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. 
Honghe.Wu
источник
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 г.)

VonC
источник
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

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

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

Сяо Пэн - ZenUML.com
источник
Для меня хорошо работает: 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)
Антрикш Джайн
источник