git commit出现致命错误“致命:CRLF将被LF in取代”


84

我正在使用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,但是为什么会出现此错误出来吗 我该如何解决这个问题?

谢谢。

Answers:


220

这是一个经典问题:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(图片来自Luis Tubes博客文章

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

我一直喜欢以保持core.autocrlffalse,其意为:

git config --global core.autocrlf false

该错误消息甚至在git diff输出中蔓延
VonC

8
如果我已经设置core.autocrlf为输入,为什么git无法为我将CRLF更改为LF ?
aserww106

1
@William,因为您正在Linux上工作,并且处理来自Windows的文件。
VonC

谢谢@VonC,我已经使用dos2unix更改了所有文件eol,因此,当Windows开发人员将一些代码提交到其仓库中时,如果我从其存储库中提取,git会将CRLF转换为LF,对吗?我们的git服务器在Ubuntu上。
aserww106

1
@William我的意思是,你说:“我最近改变了git config core.eol对” lf“并core.autocrlf以” input“”:即不改变文件已经存在。那将对未来产生影响git pull。当前文件仍处于CRLF中,如果进行了修改,则在可能的情况下将其转换为LF,否则将触发您提到的错误消息。
VonC

55

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

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

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

5
这个额外的编辑有负面影响吗?
AlleyOOP

谢谢你,先生!在2020年帮助我:)
Joe Spinelli

28
$ git config core.autocrlf false

3
我不知道这是怎么做的,但是它可以工作。致命的警告消失了,我不再害怕。
wh1tney 2014年

我这样做了,现在git diff将我的整个文件(1000行)视为冲突。差异工具仅看到3行更改。
Dagrooms,2015年

10

可以尝试一下dos2unix:

dos2unix [filename]

4

这发生在我成千上万的文件上。所以我写了一个快速的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+ccommand+c即可停止它。


2
万一有人好奇我如何管理成千上万个未提交的文件,那是因为仓库中有一堆代码生成的图像。我没有将提交推迟3年之久。
GreenRaccoon23年

1

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

git add file1
git add file2

然后提交您的更改:

git commit

这将使您的本地文件保持原样,但会autocrlf保留在远程存储库中。


1

我遇到了同样的麻烦,.gitattributes并按如下所示进行了修复。

$ vim .gitattributes

在.gitattributes中注释掉2行

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

1

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


0

我在使用Terminal的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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.