Git commit получить фатальную ошибку "фатальный: CRLF будет заменен LF в"
Я использую Ubuntu 13.10 x64, и я работаю над проектом, который некоторые разработчики используют Windows, я недавно изменил git config 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, но почему эта ошибка появляется? Как я могу исправить эту проблему?
Спасибо.
Ответы
Ответ 1
Это классическая проблема:
![http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png]()
(фото из Луис Тубес сообщение в блоге)
Обычное исправление заключается в том, чтобы преобразовать эти файлы самостоятельно, dos2unix или Swiss File Knife.
Я всегда предпочитал сохранить core.autocrlf
до false
, что означает:
git config --global core.autocrlf false
Ответ 2
У меня была такая же проблема, и я попробовал предлагаемое решение без успеха.
Мне пришлось выполнить вторую команду, чтобы заставить ее работать:
$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
Ответ 3
$ git config core.autocrlf false
Ответ 4
Можно просто попробовать dos2unix:
dos2unix [filename]
Ответ 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, чтобы остановить его.
Ответ 6
Вам нужно добавить все файлы, которые git status
отображает как измененные:
git add file1
git add file2
И затем зафиксируйте свои изменения:
git commit
Это сохранит ваши локальные файлы как есть, но будет autocrlf
их в удаленном репозитории.
Ответ 7
Я столкнулся с той же проблемой и исправил редактирование .gitattributes
как .gitattributes
ниже.
$ vim .gitattributes
закомментируйте 2 строки в .gitattributes
-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf
Ответ 8
К вашему сведению, я не уверен, относится ли это к вам, но я получал эту ошибку, когда случайно пытался добавить все node_modules
к поэтапным изменениям. Так что на самом деле .gitignoring
node_modules
решил мою проблему.