git commit get fatal error "fatal : CRLF will be replace by LF in"


84

저는 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"input"으로 설정하면 git이 자동으로 CRLF를 LF로 변환하지만이 오류가 발생하는 이유 밖? 이 문제를 어떻게 해결할 수 있습니까?

감사합니다.

답변:


220

이것은 고전적인 문제입니다.

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
( Luis Tubes블로그 게시물 사진 )

일반적인 수정은 dos2unix 또는 Swiss File Knife를 사용 하여 해당 파일을 직접 변환하는 것 입니다.

나는 항상 선호 한 유지 core.autocrlffalse 어떤 수단 :

git config --global core.autocrlf false

그 오류 메시지는 git diff출력 에도 나타납니다 : git.661346.n2.nabble.com/…
VonC

8
내가 이미 core.autocrlf입력하도록 설정 한 경우 왜 git이 CRLF를 LF로 변경할 수 없습니까?
aserww106 2013

1
@William은 Linux에서 작업하고 Windows에서 가져온 파일을 사용하기 때문입니다.
VonC 2013

감사합니다, @VonC, 저는 이미 dos2unix를 사용하여 모든 파일 eol을 변경하므로 Windows 개발자가 저장소에서 일부 코드를 저장소에 커밋 할 때 저장소에서 가져 오면 git이 CRLF를 LF로 변환합니다. 우리의 git 서버는 Ubuntu에 있습니다.
aserww106 2013

1
@William 나는 당신이 말한 의미하는 것이 "나는 최근에 변경된 git config core.eol에" lf"과 core.autocrlf"을 input""이미 파일을 변경하지 않습니다. 그것은 미래에 영향을 미칠 것 git pull입니다. 현재 파일은 여전히 ​​CRLF에 있으며 수정 된 경우 가능한 경우 LF로 변환되고 그렇지 않은 경우 언급 한 오류 메시지가 트리거됩니다.
VonC 2013

55

나는 같은 문제가 있었고 제안 된 해결책을 성공하지 못했습니다.

작동하도록 두 번째 명령을 실행해야했습니다.

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

5
이 추가 편집에 부정적인 영향이 있습니까?
AlleyOOP

감사합니다! 2020 년 저를 돕기 :)
Joe Spinelli

28
$ git config core.autocrlf false

3
나는 이것이 무엇을하는지 모르지만 작동합니다. 치명적인 경고가 사라지고 더 이상 두렵지 않습니다.
wh1tney

이 작업을 수행하고 이제 git diff전체 파일 (1000 줄)이 충돌로 간주됩니다. diff 도구에는 3 줄만 변경됩니다.
Dagrooms

10

dos2unix를 시도해 볼 수 있습니다.

dos2unix [filename]

4

이것은 수천 개의 파일에서 나에게 일어났습니다. 그래서 나는 dos2unix그것을 고치기 위해 빠른 bash 스크립트를 작성 했습니다. 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+ c또는 command+ c를 눌러 중지하십시오.


2
내가 커밋되지 않은 수천 개의 파일을 어떻게 쌓아 올렸는지 궁금한 사람이 있다면 리포지토리에 코드 생성 이미지가 많기 때문입니다. 나는 커밋을 3 년이나 그 어떤 것도 연기하지 않았습니다.
GreenRaccoon23 2016

1

git status수정 된 것으로 표시되는 모든 파일을 추가해야합니다 .

git add file1
git add file2

그런 다음 변경 사항을 커밋하십시오.

git commit

이렇게하면 로컬 파일이 그대로 유지되지만 autocrlf원격 저장소에 저장됩니다.


1

나는 같은 문제에 직면 .gitattributes하고 아래와 같이 편집하여 수정 했습니다.

$ vim .gitattributes

.gitattributes에서 2 줄 주석 처리

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

1

이것이 귀하에게 적용되는지 확실하지 않지만 실수로 모든 node_modules단계를 단계적 변경에 추가하려고 할 때이 오류가 발생했습니다 . 그래서 실제로 .gitignoringnode_modules내 문제를 해결했다.


0

터미널을 사용하는 Mac에 있으며 커밋하려고했던 .htaccess 파일 에이 문제가 발생하여 치명적인 오류가 발생했습니다.

fatal: CRLF would be replaced by LF in .htaccess

git 플래그를 끄는 것이 아니라 OP 요청과 같은 문제를 해결하고 싶었 기 때문에 파일별로 문제를 해결하는 perl 명령을 제공하는 이 기사 를 찾았습니다 .

perl -pi -e 's/\r\n/\n/g' input.file

따라서 위의 .htaccess 오류에 대해 다음을 실행했습니다.

perl -pi -e 's/\r\n/\n/g' .htaccess 

플래그 -p, -i 및 -e (pie)를 결합하여 명령 행에서 Perl을 사용하여 파일을 편집 할 수 있습니다. 이 경우 발견 된 모든 \ r \ n을 \ n으로 바꿉니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.