Попытка зафиксировать файлы Git, но получение:: fatal: LF будет заменено на CRLF в <некоторый файл в репо>

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

fatal: LF would be replaced by CRLF in <some file in the repo>

Теперь, прежде чем я получу обычный LF vs CRLF ответы, я знаю и понимаю, о чем спор. Во-вторых, я также установил свои глобальные настройки на:

core.autocrlf true

В-третьих, у меня есть .gitattributes файл

Поэтому я хочу убедиться, что файлы должны иметь CRLF,

Я не понимаю, что это говорит FATAL и блокирует меня от продолжения. Предупреждение? Конечно! Знаю ли я, что я пытаюсь сделать? Я делаю!

Я просто хочу, чтобы он молча конвертировал и STFU.

Кроме того, если он вынужден заблокировать меня, есть ли способ обновить все файлы в репо, чтобы CRLF Значит, это предупреждение может потеряться?

Эти репозитории являются частными, поэтому они никогда не будут разрабатываться вне Windows + Visual Studio.

Может кто-нибудь, пожалуйста, помогите без клеветы этой темы в autocrlf TRUE против autocrlf FALSE религиозная война.

6 ответов

Решение

Вы можете установить core.safecrlf "предупреждать", если вы хотите только предупреждение, а не фатальную ошибку.

От " git config "страница управления:

core.safecrlf

Если true, делает git проверку, является ли преобразование CRLF обратимым, когда активно преобразование конца строки. Git проверит, изменяет ли команда файл в рабочем дереве прямо или косвенно.
Например, фиксация файла с последующей проверкой того же файла должна привести к получению исходного файла в рабочем дереве. Если это не относится к текущим настройкам core.autocrlf, git отклонит файл.
Переменная может быть установлена ​​в "warn", и в этом случае git будет только предупреждать о необратимом преобразовании, но продолжит работу.

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

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

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

Я предпочитаю определять точные файлы или типы файлов, с которыми я хочу заставить eol .gitattributes только файлы (с core.eol настройки, которые у вас есть), и оставить autocrlf ложно.

В случае текстовых полей со смешанным eol, этот пост в блоге предлагает, например:

Если на вашем компьютере установлен Notepad++, просто выполните следующие действия.

  1. Откройте файл с фатальной проблемой.
  2. Нажмите Edit -> EOL Conversion затем выберите "Формат Windows" или любой другой, который у вас возникла проблема.

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

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

git config --global core.safecrlf false

Это отключит crlf фатальное предупреждение.

git config core.autocrlf false
git config core.safecrlf false

Так как ваш репо является частным, вы можете установить git-config как это:

git config --global core.autocrlf false

Это решит вашу проблему. Если у вас возникнут дополнительные вопросы, вы можете прочитать "Pro ​​git":

Если вы программист Windows, выполняющий проект только для Windows, вы можете отключить эту функцию, записав возврат каретки в хранилище, установив для параметра конфигурации значение false: $ git config --global core.autocrlf false

Но когда вы сотрудничаете, вам лучше сделать это ниже:

  1. добавлять .gitattributes Github help-Работа с окончаниями строк будет полезна.
  2. git config --global core.safecrlf true
    • окна:git config --global core.autocrlf true
    • Mac или Linux:git config --global core.autocrlf input

Вы можете прочитать конфигурацию Git docs-git для получения дополнительной информации.

git config --global core.autocrlf false будет проверять файлы с CRLF, который не используется для.

Я заметил на Windows, что с core.autocrlf true Git не любит файлы с LF и core.autocrlf input не любит CRLF.

Итак: передайте CRLF файлы с core.autocrlf true и LF файлы с core.autocrlf input (или конвертировать их в CRLF).

Обычно файлы с LF автоматически генерируются генераторами кода (например, https://start.spring.io/ или http://yeoman.io/).

С файлом.gitattributes используйте

*.h text=auto
*.cpp text=auto
*.txt text=auto

как описано в https://git-scm.com/docs/gitattributes.

Другие вопросы по тегам