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

ase*_*106 75 git eol

我正在使用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"输入",git会自动将CRLF转换为LF,但为什么会出现此错误出来吗?我该如何解决这个问题?

谢谢.

Von*_*onC 203

这是一个经典问题:

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
Run Code Online (Sandbox Code Playgroud)

  • 如果我已经将`core.autocrlf`设置为输入,为什么git无法将CRLF更改为LF? (7认同)
  • @William 我的意思是你说“我最近将 `git config core.eol` 更改为“`lf`”并将 `core.autocrlf` 更改为“`input`””:这不会更改已经存在的文件。这将对未来的“git pull”产生影响。当前文件仍然在 CRLF 中,如果有修改,则尽可能转换为 LF,如果不是,则触发您提到的错误消息。 (2认同)

alm*_*lmo 49

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

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

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
Run Code Online (Sandbox Code Playgroud)

  • 这个额外的编辑是否有任何负面影响? (5认同)
  • @rpeg这不是一个git问题.在没有窗户的世界里,这不是问题.在只有Mac/Linux编码器的并行宇宙中,这个选项甚至不会存在于git以及dos2unix等程序中. (3认同)
  • @jonjitsu肯定让我们假装82.56%的终端用户PC正在运行其他操作系统. (2认同)

小智 27

$ git config core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

  • 我不知道这是做什么但它有效.致命的警告消失了,我不再害怕了. (3认同)

Yol*_*ola 9

可以尝试dos2unix:

dos2unix [filename]
Run Code Online (Sandbox Code Playgroud)


Gre*_*n23 5

这发生在我的数千个文件上。所以我写了一个快速的 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
Run Code Online (Sandbox Code Playgroud)

基本上,它试图做git add .. 如果命令失败,它会从错误输出中获取不兼容文件的名称。然后它dos2unix在该文件上运行。它不断重复这个过程直到git add .工作。

如果你运行这个,你应该会dos2unix: converting file xxx to Unix format...反复看到。如果你不这样做,它就不起作用,所以只需按ctrl+ccommand+c来停止它。

  • 如果有人好奇我是如何设法堆积数千个未提交的文件的,那是因为 repo 有一堆代码生成的图像。我没有将提交推迟 3 年或任何事情。 (2认同)