git commit致命错误“致命:CRLF将被replace为LF中的”
我使用的是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,但为什么会出现这个错误? 我该如何解决这个问题?
谢谢。
这是一个经典的问题:
(图片来自Luis Tubes的博客文章 )
通常的解决办法是用dos2unix或瑞士文件刀自己转换这些文件。
我一直倾向于保持core.autocrlf
为false
,这意味着:
git config --global core.autocrlf false
我有同样的问题,并尝试build议的解决scheme没有成功。
我不得不执行第二个命令来使其工作:
$ git config --global core.autocrlf false $ git config --global core.safecrlf false
$ git config core.autocrlf false
你可以试试dos2unix:
dos2unix [filename]
这发生在成千上万的文件上。 所以我写了一个快速的bash脚本,使dos2unix
为我修复。 Linux或Mac上的其他人可能会觉得它有用。
#!/bin/bash _unwind-ows() { local output; local path; output=$((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; path="$(echo "${output}" | sed -re 's/^fatal: CRLF would be replaced by LF in (.*)\.$/\1/g')"; if [ "${path}" = "${output}" ]; then echo "Regex failed. Could not auto-generate filename from stderr."; return 1; fi; if [ ! -e "${path}" ]; then echo "Regex failed. '${path}' does not exist."; return 1; fi; dos2unix "${path}"; if [ $? -ne 0 ]; then echo "Failed to run \`dos2unix '${path}'\`."; return 1; fi; _unwind-ows; return $?; }; _unwind-ows;
基本上,它试图做git add .
。 如果该命令失败,则从错误输出中获取不兼容文件的名称。 然后在该文件上运行dos2unix
。 它不断重复这个过程,直到git add .
作品。
如果你运行这个,你应该看到dos2unix: converting file xxx to Unix format...
重复。 如果你不这样做,它不工作,所以只需按Ctrl + C或命令 + C停止它。
另外, _unwind-ows
。 我自杀了。
您需要添加git status
显示为已修改的所有文件:
git add file1 git add file2
然后提交您的更改:
git commit
这将保持您的本地文件,但会autocrlf
他们在远程存储库。