git 提交出现致命错误“致命:CRLF 将被 LF 替换”

问题描述 投票:0回答:9

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

谢谢你。

git eol
9个回答
236
投票

这是一个经典问题:

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

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

我一直更喜欢保留

core.autocrlf
false
,这意味着:

git config --global core.autocrlf false

67
投票

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

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

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

30
投票
$ git config core.autocrlf false

16
投票

可以尝试一下

dos2unix
手册页):

dos2unix [filename]

这会将文件中的所有 CRLF 换行符转换为 LF 换行符。


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: converting file xxx to Unix format...
。如果不这样做,它就不起作用,所以只需按 ctrl+ccommand+c 即可停止它。


2
投票

仅供参考,不确定这是否适用于您,但当我意外尝试将所有

node_modules
添加到分阶段更改时,我收到了此错误。所以实际上
.gitignoring
node_modules
解决了我的问题。


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
投票

我在 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(pie),以允许您从命令行使用 Perl 编辑文件。在这种情况下替换所有 发现与 .

© www.soinside.com 2019 - 2024. All rights reserved.