问题
I'm using Ubuntu 13.10 x64, and I am working on a project that some developers are using Windows , I recently changed the git config core.eol
to "lf" and core.autocrlf
to "input" and core.safecrlf
to "true". Since then, when I try to commit file into my local repository, I get this error:fatal: CRLF would be replaced by LF in ......
From what I understand, if I set core.eol
to "lf" and core.autocrlf
to "input", git will automatically convert CRLF to LF, but why this error come out? How can I fix this problem?
Thank you.
回答1:
This is a classic issue:
(picture from Luis Tubes's blog post)
The usual fix is to convert those files yourself, with dos2unix or Swiss File Knife.
I have always preferred to keep core.autocrlf to false, which means:
git config --global core.autocrlf false
回答2:
I had the same problem and tried the suggested solution with no success.
I had to execute a second command to make it work:
$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
回答3:
$ git config core.autocrlf false
回答4:
One may just try dos2unix:
dos2unix [filename]
回答5:
This happened to me on thousands of files. So I wrote a quick bash script to make dos2unix
fix it for me. Someone else on Linux or Mac might find it useful.
#!/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
Basically, it tries to do git add .
. If the command fails, it grabs the name of the incompatible file from the error output. Then it runs dos2unix
on that file. It keeps repeating this process until git add .
works.
If you run this, you should see dos2unix: converting file xxx to Unix format...
repeatedly. If you don't, it's not working, so just press ctrl+c or command+c to stop it.
回答6:
FYI not sure if this applies to you but I was getting this error when accidentally trying to add all node_modules
to the staged changes. So actually .gitignoring
the node_modules
solved my problem.
回答7:
You need to add all files that git status
displays as modified:
git add file1
git add file2
And then commit your changes :
git commit
This will keep your local files as is, but will autocrlf
them on the remote repository.
回答8:
I faced same trouble and fixed with editing .gitattributes
as below.
$ vim .gitattributes
comment out 2 lines in .gitattributes
-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf
来源:https://stackoverflow.com/questions/20168639/git-commit-get-fatal-error-fatal-crlf-would-be-replaced-by-lf-in