git commit получить фатальную ошибку «fatal: CRLF будет заменен на LF в»


85

Я использую Ubuntu 13.10 x64, и я работаю над проектом, который некоторые разработчики используют Windows. Недавно я изменил конфигурацию git core.eolна «lf», core.autocrlf«input» и core.safecrlf«true». С тех пор, когда я пытаюсь зафиксировать файл в моем локальном репозитории, я получаю эту ошибку:
fatal: CRLF would be replaced by LF in ......
Насколько я понимаю, если я установлю core.eol«lf» и core.autocrlf«input», git автоматически преобразует CRLF в LF, но почему возникает эта ошибка из? Как я могу исправить эту проблему?

Спасибо.

Ответы:


221

Это классический вопрос:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(картинка из Luis Tubes «s блоге )

Обычное решение - конвертировать эти файлы самостоятельно с помощью dos2unix или Swiss File Knife .

Я всегда предпочитал держать core.autocrlfвfalse , что означает:

git config --global core.autocrlf false

Это сообщение об ошибке закрадывается даже в git diffвывод: git.661346.n2.nabble.com/…
VonC

8
Почему git не может изменить CRLF на LF для меня, если я уже настроен core.autocrlfна ввод?
aserww106

1
@William, потому что вы работаете в Linux и с файлами из Windows.
VonC

Спасибо, @VonC, я уже использую dos2unix для изменения всех файлов eol. Поэтому, когда разработчики Windows фиксируют код в своем репозитории, если я извлечу из их репозитория, git преобразует CRLF в LF, верно? Наш git-сервер находится на Ubuntu.
aserww106

1
@William Я имею в виду, что вы сказали: "Я недавно изменил git config core.eol" lfcore.autocrlf" input"": это не меняет файлы, которые уже есть. Это повлияет на будущее git pull. Текущие файлы все еще находятся в CRLF и, если они изменены, преобразуются в LF, если это возможно, и, если нет, вызывает сообщение об ошибке, которое вы упомянули.
VonC

56

У меня была та же проблема, и я безуспешно попробовал предложенное решение.

Мне пришлось выполнить вторую команду, чтобы она заработала:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false

5
есть ли какие-либо негативные последствия для этого дополнительного редактирования?
AlleyOOP

28
$ git config core.autocrlf false

3
Я не знаю, что это делает, но работает. Роковое предупреждение уходит, и я больше не боюсь.
wh1tney 09

Я сделал это и теперь git diffвижу весь мой файл (1000 строк) как конфликт. Инструменты различий видят только 3 изменения строки.
Dagrooms


5

Это случилось со мной с тысячами файлов. Поэтому я написал быстрый сценарий bash, чтобы dos2unixисправить это за меня. Кто-то другой на Linux или Mac может счесть это полезным.

#!/usr/bin/env bash

unwindows() {

  local errmsg
  local fpath

  # base case
  errmsg="$(git add . 2>&1)"
  if [[ $? -eq 0 ]]; then
    echo 'Successfully converted CRLF to LF in all files.'
    echo 'Successfully ran "git add .".'
    echo 'Done.'
    return 0
  fi

  fpath="${errmsg#*fatal: CRLF would be replaced by LF in }"
  fpath="${fpath%.*}"

  if [[ "${fpath}" == "${errmsg}" ]]; then
    err 'Regex failed. Could not auto-generate filename from stderr.'
    return 1
  fi

  if [[ ! -e "${fpath}" ]]; then
    err "Regex failed. '${fpath}' does not exist."
    return 1
  fi

  if ! dos2unix "${fpath}"; then
    err "Failed to run \"dos2unix '${fpath}'\"."
    return 1
  fi

  # recursive case
  unwindows
}

err() {
  local -r msg="$1"
  echo "${msg}" >&2
}

unwindows

В основном пытается это сделать git add .. Если команда не работает, она берет имя несовместимого файла из вывода ошибки. Затем он запускается dos2unixв этом файле. Он продолжает повторять этот процесс, пока не git add .сработает.

Если вы запустите это, вы должны постоянно видеть dos2unix: converting file xxx to Unix format.... Если вы этого не сделаете, он не работает, поэтому просто нажмите ctrl+ cили command+, cчтобы остановить его.


2
Если кому-то интересно, как мне удалось собрать тысячи незафиксированных файлов, это потому, что в репозитории есть куча изображений, сгенерированных кодом. Я не откладывал коммит на 3 года или что-то в этом роде.
GreenRaccoon23

1

Вам необходимо добавить все файлы, которые git statusотображаются как измененные:

git add file1
git add file2

А затем зафиксируйте свои изменения:

git commit

Это сохранит ваши локальные файлы как есть, но сохранит autocrlfих в удаленном репозитории.


1

Я столкнулся с той же проблемой и исправил редактирование, .gitattributesкак показано ниже.

$ vim .gitattributes

закомментируйте 2 строки в .gitattributes

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf

1

К вашему сведению, я не уверен, относится ли это к вам, но я получал эту ошибку, когда случайно пытался добавить все node_modulesк поэтапным изменениям. Так на самом деле решить мою проблему..gitignoringnode_modules


0

Я использую Mac с помощью терминала, и у меня возникла проблема с файлом .htaccess, который я пытался зафиксировать, получив фатальную ошибку:

fatal: CRLF would be replaced by LF in .htaccess

Я хотел решить проблему, такую ​​как запросы OP, а не просто отключить флаг git, поэтому я нашел эту статью, в которой есть команда Perl для устранения проблемы для каждого файла.

perl -pi -e 's/\r\n/\n/g' input.file

Итак, для моей ошибки .htaccess выше я выполнил следующее:

perl -pi -e 's/\r\n/\n/g' .htaccess 

Флаги -p, -i и -e (круговая диаграмма) можно комбинировать, чтобы вы могли редактировать файлы с помощью Perl из командной строки. В этом случае замена всех найденных \ r \ n на \ n.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.