提交 Git 时出现致命错误 "fatal: CRLF would be replaced by LF in"。

96
我正在使用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,但为什么会出现此错误?如何解决这个问题?
谢谢。
9个回答

236

这个错误信息甚至出现在 git diff 的输出中:http://git.661346.n2.nabble.com/git-diff-returns-fatal-error-with-core-safecrlf-is-set-to-true-td7590136.html - VonC
11
如果我已经将 core.autocrlf 设置为 input,为什么 Git 不能将 CRLF 转换为 LF? - aserww106
1
@William 因为你正在使用 Linux,并且处理来自 Windows 的文件。 - VonC
2
@William 我的意思是你说:“我最近将git config core.eol更改为lfcore.autocrlf更改为input”,这不会改变已经存在的文件。 这会影响未来的git pull。 当前的文件仍然是CRLF格式,如果修改了,则尽可能转换为LF格式,如果无法转换,则会触发您提到的错误消息。 - VonC
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/41781/discussion-between-william-and-vonc - aserww106
显示剩余9条评论

67

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

我不得不执行第二个命令才能使它起作用:

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

7
这个额外的编辑会有任何负面影响吗? - AlleyOOP

30
$ git config core.autocrlf false

4
我不知道这是干什么的,但它有效。 致命警告消失了,我不再害怕。 - wh1tney
我做了这个操作,现在 git diff 将我的整个文件(1000行)视为冲突。但是实际上只有3行发生了变化。 - Dagrooms

16

你可以尝试使用dos2unix:

dos2unix [filename]

6

我有很多文件都出现了这种问题,因此我写了一个快速的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:将文件xxx转换为Unix格式...”。如果没有,请按“Ctrl”+“C”或“Command”+“C”停止它。

2
如果有人好奇我是如何积累成千上万个未提交的文件的,那是因为仓库里有一堆代码生成的图像。我并没有拖延提交三年或其他什么的。 - GreenRaccoon23

2

请注意,不确定这是否适用于您,但当我无意中尝试将所有node_modules添加到暂存更改时,出现了此错误。因此,实际上,将node_modules添加到.gitignore中解决了我的问题。


1

我曾遇到相同的问题,并通过编辑 .gitattributes 文件来解决。

$ vim .gitattributes

在 .gitattributes 文件中注释掉两行。
-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf

1

我正在使用终端在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(pie)可以组合使用,允许您使用Perl从命令行编辑文件。在这种情况下,将所有找到的\r\n替换为\n。


1

你需要添加所有在git status中显示为修改的文件:

git add file1
git add file2

然后提交您的更改:

git commit

这将保留您的本地文件,但会在远程存储库上自动转换行尾符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接