繁体   English   中英

git commit 得到致命错误“致命:CRLF 将被 LF 替换”

[英]git commit get fatal error “fatal: CRLF would be replaced by LF in”

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

谢谢。

这是一个经典问题:

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

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

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

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

可以试试 dos2unix:

dos2unix [filename]

这发生在我的数千个文件上。 所以我写了一个快速的 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来停止它。

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

git add file1
git add file2

然后提交您的更改:

git commit

这将使您的本地文件保持原样,但会将它们自动autocrlf到远程存储库中。

我遇到了同样的问题,并通过编辑.gitattributes ,如下所示。

$ vim .gitattributes

注释掉 .gitattributes 中的 2 行

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM