Windows git“경고 : LF는 CRLF로 대체됩니다.”경고 꼬리가 뒤로입니까?


147

env :

  • 윈도우 7
  • msysgit

때 나는 git commit말한다 :

warning: LF will be replaced by CRLF. 

이 경고 꼬리가 거꾸로되어 있습니까?
Windows에서 파일을 편집하면 줄 끝은 CRLF다음 그림과 같이 입니다 .git은 repo에 커밋하기 위해 파일을
여기에 이미지 설명을 입력하십시오
변경합니다 LF.
올바른 경고는 다음과 같습니다.

warning: CRLF will be replaced by LF. 


2
@ devnull 경고가 꼬리 뒤로 있다는 것을 의미합니까?
Honghe.Wu

@ Honghe.Wu 아니요, Windows에 없습니다. 아래 답변
VonC

11
실제로 경고는 거꾸로 된 것 같습니다. 정말 변환하는 방법에 대한이 경고를 얻을 혼란 CRLF에 a가에 커밋 경고이기 때문에, 그리고 도움이 될 것입니다 공백의 망할 놈의 처리를 설명없이 양을 뒤로 .
Stijn de Witt

1
@StijndeWitt 난 당신이 그것을 찬성에 대한 답변으로 의견을보고 싶어요.
user1460043

답변:


185

경고 : LF는 CRLF로 대체됩니다.

사용중인 편집기에 따라 LF가있는 텍스트 파일은 CRLF로 저장할 필요가 없습니다. 최근 편집기는 eol 스타일을 유지할 수 있습니다 . 그러나 그 git config 설정은 그것들을 변경해야한다고 주장합니다 ...

간단히 ( 여기서 권장하는 대로 ) :

git config --global core.autocrlf false

이렇게하면 자동 변환을 피하고 .gitattributes파일core.eol지시문을 통해 계속 지정할 수 있습니다 .


windows git "LF는 CRLF로 대체 될 것입니다"
이 경고 꼬리는 뒤로입니까?

아니요 : Windows를 사용 중이며 git config도움말 페이지에 언급되어 있습니다.

CRLF저장소에 정규화 된 줄 끝이없는 경우에도 작업 디렉토리에 줄 끝 을 가지려면이 설정을 사용하십시오 .

" LF를 CRLF로 대체하는 git "에 설명 된대로 , 이는 (와 같은 커밋이 아닌) 체크 아웃시에만 발생합니다core.autocrlf=true .

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

XiaoPeng답변 에서 언급했듯이 경고는 다음과 같습니다.

경고 : (현재 core.autocrlf구성 으로 다른 폴더를 체크 아웃하거나 복제하는 경우) LF는 CRLF로 바뀝니다
. 파일은 현재 작업 디렉토리에 원래 줄 끝이 있습니다.

git-for-windows/git문제 1242 에서 언급했듯이 :

여전히이 메시지가 혼동된다고 생각합니다. 예를 들어 " file.json파일을 삭제하고 다시 체크 아웃 한 후 LF가 CRLF로 대체됩니다"와 같이 문제에 대한 자세한 설명을 포함하도록 메시지가 확장 될 수 있습니다 .

참고 : 사용하는 경우 힘내 2.19 (년 9 월 2018) core.autocrlf, 가짜 경고가 지금은 억제된다 "LF를 CRLF로 대체됩니다" .


quaylar가 올바르게 언급 했듯이 커밋에 대한 변환이있는 경우 LF에만 수행됩니다.

특정 경고 " LF will be replaced by CRLF"는 convert.c # check_safe_crlf ()에서 발생합니다 .

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

에 의해 convert.c#crlf_to_git()호출되고 convert.c#convert_to_git()자체에 의해 호출됩니다 convert.c#renormalize_buffer().

그리고 마지막 renormalize_buffer()은에 의해서만 호출됩니다 merge-recursive.c#blob_unchanged().

따라서 git commit커밋이 병합 프로세스의 일부인 경우에만 이 변환이 발생 한다고 생각 합니다.


참고 : Git 2.17 (Q2 2018)에서는 코드 정리에 약간의 설명이 추가됩니다.

Torsten Bögershausen ( )의 commit 8462ff4 (2018 년 1 월 13 일)를 참조하십시오 . (의해 병합 - Junio C 하마노 -9bc89b1 커밋 2,018 13 이월)tboegi
gitster

convert_to_git () : safe_crlf / checksafe는 int conv_flags가됩니다.

호출 할 때 convert_to_git()checksafe매개 변수는 EOL 변환 (경우 어떻게해야하는지 정의 CRLF --> LF --> CRLF)하지 왕복 깨끗하게 않습니다.
또한 줄 끝을 다시 정규화 CRLF --> LF하거나 ( ) 그대로 유지 해야하는지 여부도 정의했습니다 .

checksafe는 safe_crlf다음 값을 가진 열거 형입니다.

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Git 2.17주기 에서 8462ff4에 도입 된 회귀 ( " convert_to_git(): safe_crlf/checksafeint conv_flags", 2018-01-13, Git 2.17.0 ")가 설정에도 불구하고autocrlf 다시 쓰기로 인해 경고 메시지가 표시 됩니다.safecrlf=false

Anthony Sottile ( )의 commit 6cb0912 (2018 년 6 월 4 일)를 참조하십시오 . ( Junio ​​C Hamano의해 병합 -- 커밋 8063ff9 , 2018 년 6 월 28 일)asottile
gitster


1
예, 대부분의 편집자는 EOL 스타일을 유지할 수 있지만 대부분의 편집자는 동일한 프로젝트에서 새 파일을 만들 때 아무런 영향을 미치지 않습니다. LF 프로젝트를 체크 아웃하지 말고 "psh, 편집자가 LF 줄 끝을 처리 할 수 ​​있고 autocrlf가 필요하지 않습니다"라고 생각한 다음 새 파일을 LF 줄 끝으로 수동 설정하는 것을 잊어 버리십시오.

15
@VonC 나는 그것을 얻지 못한다고 고백해야합니다. Git-Book은 Git이 커밋 할 때 CRLF 줄 끝을 LF로 자동 변환하고 파일 시스템에서 코드를 체크 아웃 할 때 자동으로 변환하여이를 처리 할 수 있다고 말합니다 . 이것은 커밋시 LF 로 변환 되고 결코 CRLF 로 변환 되지 않음을 의미 합니다. 언급 된 경고가 잘못되었음을 의미합니다. 갖는 core.autocrlf=true것이다 항상 의 repo에서 LF에 양보하고, (심지어 비 Windows에서) 작업 트리 이럴에서 CRLF. 출처 : link
quaylar

12
"이 경고 꼬리가 거꾸로되어 있습니까? 그것은 체크 아웃시에만 발생합니다." commit 이 정확한 경고를보고 있습니다. 그래서 그렇습니다 . 뒤로 검색하여이를 검색했습니다. 다른 사람들도 그것을 알아서 기쁘다! 커밋 메시지에서 CRLF로 변환 될 것이라고 경고하기 위해 실제로 이러한 경고를 읽는 사람들에게는 매우 혼란 스럽습니다.
Stijn de Witt

7
"따라서이 커밋이 병합 프로세스의 일부인 경우에만 git commit에서이 변환이 발생한다고 생각합니다." 아니. 정기적 인 커밋에서 이것을보고 있습니다.
Stijn de Witt

3
메시지에 대해 나를 괴롭히는 부분은 전혀 나타나지 않는다는 것입니다. 왜 git이 내가 구성한 것과 정확히 일치한다는 경고를 받아야하는 이유는 무엇입니까? 나는 "이봐, 우리는 당신이 우리에게 요청한 것처럼 여전히 당신을 위해 줄 끝을 변환하고 있습니다"라는 경고가 필요하지 않습니다. 시스템이 의도적으로 작동하는 경우 불필요한 경고가 발생하지 않아야합니다. 그렇지 않으면 사람들이 관련없는 메시지가 표시되는 중요한 경고를 놓치게됩니다.
브렌트 라슨

27

, 경고가 거꾸로 있습니다.

사실 처음에는 경고조차되지 않아야합니다. 이 모든 경고가 말하지만 (불행히도 거꾸로) Windows 줄 끝이있는 파일의 CRLF 문자는 커밋시 LF로 바뀝니다. 이는 * nix 및 MacOS에서 사용하는 것과 동일한 라인 엔딩으로 정규화됨을 의미합니다.

이상한 일이 일어나지 않습니다. 이것은 일반적으로 원하는 행동입니다.

현재 형태의 경고는 다음 두 가지 중 하나입니다.

  1. 과도하게 경고 메시지와 결합 된 불행한 버그 또는
  2. 당신이 정말로 이것을 통해 생각 하게 만드는 매우 영리한 음모 ...

;)


1
이상한 점은 Windows의 로컬 파일을 LF로 강제 변환하면 파일을 추가 할 수 없으며 메시지가 커밋을 불평하고 무효화한다는 것입니다.
phpguru

24

--7 월 9 일 업데이트 ---

@mgiuca의 설명에 따라 "정확하고 정확합니다"제거

======

아니요 . 현재 파일에 대해 이야기하고 있지 않습니다 CRLF. 대신 파일에 대해 이야기하고 있습니다 LF.

읽어야합니다.

경고 : ( 현재 core.autocrlf 구성으로 다른 폴더를 체크 아웃하거나 복제하면 LF가 CRLF로 바뀝니다.

파일은 ( 현재 ) 작업 디렉토리 에 원래 줄 끝이 있습니다 .

이 그림은 그 의미를 설명해야합니다. 여기에 이미지 설명을 입력하십시오


1
좋은 그림. +1. 더 많은 가시성을 위해 내 대답을 참조했습니다.
VonC

나를 위해 잘 작동하는 것은 1) core.autocrlf = false 2) Intellij set Line separator (\ n)입니다. Mac과 Windows에서 Intellij Idea를 사용합니다.
Xiao Peng-ZenUML.com

파일이 Windows에서 생성되었지만 unix / mac 줄 끝 (lf)이 있고 git config 속성 autocrlf가 true 인 경우에 발생할 수 있습니다. 기본적으로 git은 생성 한 파일을 변경하지 않지만 자동 줄 바꿈 설정으로 인해 Windows 줄 끝으로 파일을 확인 / 복제합니다.
Patrick

1
"현재 core.autocrlf 구성을 사용하여 다른 폴더로 체크 아웃하거나 복제하는 경우"로 자격을 갖추어야하는 경우 경고가 정확하고 정확한가? 그것은 원래의 메시지가 말하는 것이 아닙니다. 그것은 CRLF로 대체 될 것이라고 말하면서, 미래의 일부 체크 아웃이 아니라 repo 자체에서 CRLF 모드로 저장된다는 것을 암시합니다.
mgiuca

12

이 모든 것은 가정 core.autocrlf=true

원래 오류 :

경고 : LF는 CRLF로 대체됩니다
. 파일은 작업 디렉토리에 원래 줄 끝이 있습니다.

오류가 읽어야 할 것 :

경고 : LF는 작업 디렉토리에서 CRLF로 대체됩니다
파일은 git 저장소에 원래 LF 줄 끝 이 있습니다.

여기에 설명 :

이 편리한 변환의 부작용, 그리고 이것이 당신이보고있는 경고에 대한 것입니다, 당신이 만든 텍스트 파일이 원래 CRLF 대신에 LF 엔딩을 가지고 있다면, 평소와 같이 LF와 함께 저장되지만, 체크 될 때 나중에 CRLF 엔딩이 생깁니다. 일반 텍스트 파일의 경우 일반적으로 좋습니다. 이 경우 경고는 "정보 용"이지만 git이 이진 파일을 텍스트 파일로 잘못 평가하는 경우 git이 이진 파일을 손상시킬 수 있으므로 중요한 경고입니다.

기본적으로 이전에 LF였던 로컬 파일은 이제 로컬에서 CRLF를 갖습니다.


7

git config --global core.autocrlf false 전역 설정에 적합합니다.

그러나 Visual Studio를 사용하는 경우 .gitattributes일부 유형의 프로젝트 ( 예 : c # class library application )에 대해서도 수정해야 할 수도 있습니다 .

  • 라인을 제거 * text=auto

1

내가 설정 한 후 저장소의 창에서 편집 된 파일을 사용 중이거나 사용 core.autocrlf=true중일 때 "LF는 CRLF로 대체됩니다"( "CRLF는 LF로 대체되지 않음" )가 표시됩니다 LF) 설정 하기 전에 체크 아웃했습니다 .git addgit commitcore.autocrlf=true

에 새로운 체크 아웃을했는데 core.autocrlf=true이제는 해당 메시지가 표시되지 않습니다.


0

Visual Studio 2017, 2019를 사용하는 경우 다음을 수행 할 수 있습니다.

  1. 기본 .gitignore를 엽니 다 (솔루션의 다른 프로젝트에서 다른 .gitignore 파일을 업데이트하거나 제거하십시오)
  2. 아래 코드를 붙여 넣으십시오.
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
그것과 같은 그 "코드"외모와 같은 설정 파일에 있어야 .gitconfig하거나 .git/config하지, .gitignore자식에 의해 무시되는 지정 파일.
davidA

이것을 .git / config에 추가했지만 여전히 "경고 : CRLF가 LF로 대체됩니다"라는 메시지가 나타납니다
Sergei

0

간단한 일만하십시오 :

  1. git-hub (Shell)을 열고 (cd / a / b / c / ...)에 속한 디렉토리 파일로 이동하십시오.
  2. dos2unix (가끔 dos2unix.exe) 실행
  3. 지금 커밋하십시오. 같은 오류가 다시 발생하면. dos2unix 대신에 위의 모든 단계를 수행하고 unix2dox (unix2dos.exe를 수행하십시오)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.