git commit得到致命错误“致命:CRLF将被LF取代”

时间:2013-11-23 22:22:40

标签: git eol

我正在使用Ubuntu 13.10 x64,我正在开发一个开发人员正在使用Windows的项目,我最近将git config core.eol更改为“lf”,将core.autocrlf更改为“input”和core.safecrlf到“真”。从那时起,当我尝试将文件提交到我的本地存储库时,我收到此错误:
fatal: CRLF would be replaced by LF in ......
根据我的理解,如果我将core.eol设置为“lf”并将core.autocrlf设置为“input”,git会自动将CRLF转换为LF,但为什么会出现此错误?我该如何解决这个问题?

谢谢。

9 个答案:

答案 0 :(得分:193)

这是一个经典问题:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(图片来自Luis Tubesblog post

通常的解决方法是使用dos2unixSwiss File Knife自行转换这些文件。

我一直更喜欢keep core.autocrlf to false,这意味着:

git config --global core.autocrlf false

答案 1 :(得分:45)

我遇到了同样的问题并尝试了建议的解决方案但没有成功。

我必须执行第二个命令才能使其正常工作:

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

答案 2 :(得分:27)

$ git config core.autocrlf false

答案 3 :(得分:8)

可以尝试使用dos2unix:

dos2unix [filename]

答案 4 :(得分:4)

这发生在数千个文件上。所以我写了一个快速的bash脚本,让#!/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 为我修复它。 Linux或Mac上的其他人可能会发现它很有用。

git add .

基本上,它会尝试dos2unix。如果命令失败,它将从错误输出中获取不兼容文件的名称。然后它在该文件上运行git add .。它会一直重复此过程,直到dos2unix: converting file xxx to Unix format...有效。

如果您运行此操作,则应反复看到{{1}}。如果你不这样做,那就不行了,所以只需按 ctrl + c 命令 + c 即可停止它

答案 5 :(得分:0)

您需要添加git status显示为已修改的所有文件:

git add file1
git add file2

然后提交您的更改:

git commit

这会保留您的本地文件,但会在远程存储库中autocrlf

答案 6 :(得分:0)

我也遇到了同样的麻烦,并通过如下编辑.gitattributes进行了修复。

$ vim .gitattributes

在.gitattributes中注释两行

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

答案 7 :(得分:0)

仅供参考,我不确定这是否适用于您,但是当我不小心尝试将所有node_modules添加到分阶段更改时遇到了此错误。因此,.gitignoring node_modules实际上解决了我的问题。

答案 8 :(得分:0)

我在使用Terminal的Mac上,尝试提交的.htaccess文件出现此问题,出现致命错误:

fatal: CRLF would be replaced by LF in .htaccess

我想解决问题,例如OP请求,而不仅仅是关闭git标志,所以我发现this article给出了一个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。