2013-11-23 97 views
61

我使用的是Ubuntu 13.10 x64,我正在开发一些项目,一些开发人员正在使用Windows,我最近将git config core.eol更改为“如果“和core.autocrlf为”输入“而core.safecrlf为”真“。从那时起,当我尝试提交文件到我的本地库,我得到这个错误:
fatal: CRLF would be replaced by LF in ......
据我了解,如果我设置core.eol为“LF”和core.autocrlf为“输入”,git会自动转换CRLF到LF,但为什么会出现这个错误?我该如何解决这个问题?git commit致命错误“致命:CRLF将被替换为LF”

谢谢。

+1

这些问题让我讨厌这个世界。 – rpeg

回答

159

这是一个经典的问题:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(图片来自Luis Tubesblog post

通常的处理办法是将这些文件转换自己与dos2unixSwiss File Knife

我一直喜欢到keep core.autocrlf to false,这意味着:

git config --global core.autocrlf false 
+0

这个错误信息甚至会在'git diff'输出中出现:http://git.661346.n2.nabble.com/git-diff-returns-fatal-error-with-core-safecrlf-is-set-to- true-td7590136.html – VonC

+6

为什么如果我已经设置'core.autocrlf'输入,git不能将CRLF更改为LF? – aserww106

+1

@William因为您正在使用Linux,并且使用来自Windows的文件。 – VonC

25
$ git config core.autocrlf false 
+3

我不知道这是做什么,但它的工作原理。致命的警告消失了,我不再害怕。 – wh1tney

+0

我做到了这一点,现在'git diff'将我的整个文件(1000行)视为冲突。 diff工具只能看到3行更改。 – Dagrooms

33

我有同样的问题,并试图与没有成功的建议解决方案。

我不得不执行第二个命令,使其工作:

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

有没有负面影响这个额外的编辑? – AlleyOOP

+0

唯一解决了我的问题。我讨厌混帐。 – rpeg

+2

@rpeg这不是一个混帐问题。在没有窗户的世界里,这不会是一个问题。在只有Mac/Linux编码器的平行宇宙中,这个选项甚至不会像dos2unix一样在git中存在。 – jonjitsu

8

人们可能只是尝试DOS2UNIX的:

dos2unix [filename] 
3

这发生在我身上的数以千计的文件。所以我写了一个快速的bash脚本让dos2unix为我解决。 Linux或Mac上的其他人可能会发现它很有用。

#!/usr/bin/env bash 

_unwindows() { 

    local errmsg; 
    local filepath; 

    # 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; 

    filepath="${errmsg#*fatal: CRLF would be replaced by LF in }"; 
    filepath="${filepath%.*}"; 
    if [ "${filepath}" = "${errmsg}" ]; then 
     echo "Regex failed. Could not auto-generate filename from stderr."; 
     return 1; 
    fi; 

    if [ ! -e "${filepath}" ]; then 
     echo "Regex failed. '${filepath}' does not exist."; 
     return 1; 
    fi; 

    dos2unix "${filepath}"; 
    if [ $? -ne 0 ]; then 
     echo "Failed to run \`dos2unix '${filepath}'\`."; 
     return 1; 
    fi; 

    # recursive case 
    _unwindows; 
}; 

_unwindows; 

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

如果你运行这个,你应该看到dos2unix: converting file xxx to Unix format...重复。如果你不这样做,它不工作,所以只需按CTRL +ç命令+Ç停止。

+2

如果有人很好奇我如何设法处理数千个未提交的文件,这是因为回购有一堆代码生成的图像。我没有推迟3年或任何事情的承诺。 – GreenRaccoon23

-1

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

git add file1 
git add file2 

,然后提交您的更改:

git commit 

这将让你的本地文件原样,但会在autocrlf他们远程存储库。