Git 提交获得致命的错误”致命的: CRLF 将被替换为 LF in

我正在使用 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,但为什么会出现这个错误呢?我怎样才能解决这个问题?

谢谢你。

93907 次浏览

This is a classic issue:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(picture from Luis Tubes's blog post)

The usual fix is to convert those files yourself, with dos2unix or Swiss File Knife.

I have always preferred to keep ABC0 to false, which means:

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

I had the same problem and tried the suggested solution with no success.

I had to execute a second command to make it work:

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

One may just try dos2unix:

dos2unix [filename]

This happened to me on thousands of files. So I wrote a quick bash script to make dos2unix fix it for me. Someone else on Linux or Mac might find it useful.

#!/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

Basically, it tries to do git add .. If the command fails, it grabs the name of the incompatible file from the error output. Then it runs dos2unix on that file. It keeps repeating this process until git add . works.

If you run this, you should see dos2unix: converting file xxx to Unix format... repeatedly. If you don't, it's not working, so just press ctrl+c or command+c to stop it.

You need to add all files that git status displays as modified:

git add file1
git add file2

And then commit your changes :

git commit

This will keep your local files as is, but will autocrlf them on the remote repository.

I faced same trouble and fixed with editing .gitattributes as below.

$ vim .gitattributes

comment out 2 lines in .gitattributes

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

FYI not sure if this applies to you but I was getting this error when accidentally trying to add all node_modules to the staged changes. So actually .gitignoring the node_modules solved my problem.

I'm on a Mac using Terminal and had this problem with an .htaccess file I was trying to commit, getting the fatal error:

fatal: CRLF would be replaced by LF in .htaccess

I wanted to fix the problem, like the OP requests, not just turn off a git flag, so I found this article that gives a perl command to fix the problem on a per file basis.

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

So for my .htaccess error above, I ran the following:

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

The flags -p, -i and -e (pie) can be combined to allow you to edit files using Perl from the command line. In this case replacing all \r\n found with \n.