Git에서 core.autocrlf = true를 사용해야하는 이유는 무엇입니까?


296

Windows와 OS X에서 모두 액세스 할 수있는 Git 저장소가 있으며 CRLF 줄 끝이있는 파일이 이미 포함되어 있음을 알고 있습니다. 내가 알 수있는 한, 이것을 처리하는 두 가지 방법이 있습니다.

  1. 설정 core.autocrlffalse사방,

  2. 의 지시에 따라 여기 에만 LF 라인 엔딩을 포함하는 저장소를 변환 (GitHub의의 도움말 페이지에 에코), 그 후에 설정 core.autocrlftrueWindows에서와 input이 일에 대한 문제는 OS X에서 그 나는 저장소에 이진 파일이있는 경우 그:

    1. gitattributes에서 이진으로 올바르게 표시되지 않습니다.
    2. CRLF와 LF를 모두 포함하는 경우

    그들은 손상 될 것입니다. 내 저장소에 이러한 파일이 포함되어있을 수 있습니다.

그렇다면 왜 Git의 줄 끝 변환을 끄지 않아야합니까? 웹에는 core.autocrlf전원을 끄고 문제를 일으키는 것에 대한 모호한 경고가 많이 있지만 특정 경고는 거의 없습니다. 내가 지금까지 찾은 유일한 것은 kdiff3가 CRLF 결말을 처리 할 수없고 (나에게 문제가되지 않음) 일부 텍스트 편집기에는 줄 끝 문제가 있습니다 (나에게도 문제가되지 않음).

이 저장소는 회사 내부에 있으므로 다른 autocrlf 설정 또는 줄 끝 요구 사항을 가진 사람들과 공유하는 것에 대해 걱정할 필요가 없습니다.

내가 알지 못하는 줄 끝을 그대로 두는 데 다른 문제가 있습니까?


1
겠습니까 stackoverflow.com/questions/2333424/... 도움을? 나는 autocrlf거짓으로 떠나는 구체적인 이유와 관련이 있습니다.
VonC

3
@VonC 감사합니다.하지만 회사의 모든 사용자가 <code> autocrlf </ code>를 false로 설정하고 현재 최선의 선택이라고 믿습니다. 그러나 내가 그렇게하지 말아야 할 이유가 있는지 알고 싶습니다 . 왜냐하면 autocrlf 설정 해야 하지만 실제로는 구체적이지 않은 사람이 많은 사람들 (예 : GitHub)이 있다는 것을 알 수 있기 때문 입니다.
Rich

3
@VonC 즉, autocrlf거짓 으로 설정할 이유를 찾고 있지 않습니다 . 나는 그것을 true로 설정하는 이유를 찾고 있습니다.
Rich

9
사용하지 않는 이유 autocrlf = input: 그것은 두 가지 극단 사이의 완벽한 해결책 인 것 같습니다 : CRLF 쓰레기에서 repo를 깨끗하게 유지하고 로컬 Windows 개발자는 로컬 파일이 자동으로 마술을 수행하지 않고도 로컬 파일을 사용하여 원하는 것을 사용할 수 있습니다. (그들은 너무, 여러 가지 이유로 로컬 LF을 할 수 있습니다 true내 의견으로는, 나쁘다.) 내가 사용하는 모든 단점을 볼 수 없습니다 autocrlf = input.
iconoclast

7
@iconclast, 내가 본 한 가지 이유는 Windows 배치 파일과 Unix 쉘 스크립트가 모두 포함 된 배포판을 빌드하는 것입니다. 각각의 경우에 올바른 줄 끝을 사용하고 싶고, Git이 명시 적으로 설정 한 후에도 주변을 뒤 흔드는 경우에는 더 어렵습니다.
user1809090

답변:


227

설정해야하는 유일한 이유는 다음 autocrlftrue같습니다.

  • Unix 기반 EOL Git 저장소를 Windows로 복제 할 때 자동 EOL 변환으로 인해 git status모든 파일이 표시 되지 않도록 modified하십시오 ( 예 : 문제 83 참조 )
  • 코딩 도구는 어떻게 든에 따라 기본 파일에서 EOL 스타일의 웰빙 선물 :

특정 치료를 볼 수 있습니다하지 않는 해야한다 네이티브 EOL 처리를, 당신이 떨어져 더 나은 떠나 autocrlffalse ( git config --global core.autocrlf false).

이 구성은 로컬 구성입니다 (config가 repo에서 repo로 푸시되지 않기 때문에)

해당 리포지토리를 복제하는 모든 사용자에 대해 동일한 구성을 원하면 파일 의 속성을 사용하여 " git과 함께 최고의 CRLF처리 전략은 무엇입니까 ? "를 확인 하십시오 .text.gitattributes

예:

*.vcproj    text eol=crlf
*.sh        text eol=lf

참고 : git 2.8 (2016 년 3 월)부터 병합 마커는 더 이상 CRLF 파일에 혼합 줄 끝 (LF)을 도입 하지 않습니다 .
자세한 내용은 " <<<<<<< HEAD"병합 라인의에서 힘내 사용 CRLF합니다 " "


5
@VonC 감사합니다! 그렇게하면 사용하기에 안전하다는 확신을 갖게됩니다 autocrlf=false. 관심이 없다면 autocrlf가 false로 설정되어 있어도 왜 git이 여전히 eol 변환을 수행하는지 알고 있습니까?
Rich

14
@ VonC : 나는이 대답이 옳다고 생각하지 않습니다. Windows에서 core.autocrlf = true를 사용하면 예상대로 작동합니다. 리포지토리의 모든 파일 (이 시나리오에서는 LF 줄 끝이 있어야 함)은 체크 아웃시 Windows PC로 CRLF 줄 끝으로 변환됩니다. 모든 파일은 Windows PC에서 커밋시 LF 줄 끝으로 다시 변환됩니다. 문제가 발생하는 방법은 처음에 잘못된 core.autocrlf 설정 (완전히 너무 쉬운)이있는 Windows PC를 체크 아웃하는 것입니다.
Michael Maddox

3
@Michael이 경우 core.autocrlf=false내 시나리오에서 사용하지 않는 유일한 이유 는 줄 끝으로 혼란 스러울 수있는 도구 / 편집기가있는 것입니까?
Rich

49
나는 확실히 사용할 것이다 false. 나는 결코 배경에서 일어나는 자동적이거나 마술적인 일에 대한 열렬한 팬이 아니었다. 그냥 사용 \n하고 UTF-8사방에 당신은 잘 될 것입니다. 일부 너트 헤드가 규칙과 규칙이 있음을 이해하지 못 UTF-8하거나 또는 사용을 잊어 버린 \n경우 누군가 수동으로 변환하고 얼굴을 때립니다.
Tower

5
@ Pauld'Aoust 나는 모든 파일에 무차별 적으로 적용되는 이 전역 설정을 사용하는 대신 파일의 core.eol속성을 통해 CRLF가 필요한 파일 유형을 지정하는 것을 선호 합니다. .gitattributescore.autocrlf
VonC

40

저는 .NET 개발자이며 몇 년 동안 Git과 Visual Studio를 사용해 왔습니다. 내 추천은 줄 끝을 참으로 설정하는 것입니다. 리포지토리 수명 동안 최대한 빨리 수행하십시오.

즉, Git이 줄 끝을 바꾸는 것을 싫어합니다. 소스 컨트롤은 내가하는 작업 만 저장하고 검색해야하며 수정해서는 안됩니다. 이제까지. 그러나 그렇습니다.

모든 개발자가 true로 설정되지 않은 경우 어떻게됩니까? 한 명의 개발자가 결국 true로 설정됩니다. 그러면 모든 파일의 줄 끝이 리포지토리의 LF로 변경됩니다. 그리고 사용자가 잘못된 것으로 설정하면 Visual Studio가 경고하고 변경하도록 요청합니다. 두 가지 일이 매우 빨리 발생합니다. 하나, 더 많은 경고를받을수록 팀이 커질수록 더 커집니다. 두 번째로 더 나쁜 것은 모든 수정 된 파일의 모든 줄이 변경되었음을 보여줍니다 (모든 줄의 줄 끝은 실제 사람에 의해 변경되기 때문입니다). 결국에는 더 이상 리포지토리의 변경 사항을 더 이상 확실하게 추적 할 수 없습니다. 모든 사람을 거짓으로 유지하는 것보다 모든 사람을 진실하게 유지하는 것이 훨씬 쉽고 깨끗합니다. 신뢰할 수있는 소스 컨트롤이하지 말아야 할 일을하고 있다는 사실에 따라 사는 것이 끔찍합니다. 이제까지.


우리 회사는 규모가 작기 때문에 어디에서나 거짓을 사용하도록 쉽게 지시 할 수있을 정도로 규모가 작으며 대기업이 정책을 통해이를 수행 할 수 있다고 생각했을 것입니다. 어쨌든. 감사!
Rich

1
정책 (파일 시행) 으로이 작업을 수행하는 문제는 Windows 시스템에서 로컬, 전역 및 숨겨진 구성 파일 (ProgramData / Git / Confg)을 가질 수 있다는 것입니다. 리포지토리를 확인하여 로컬을 적용 할 수 있지만 전역 및 숨겨진 파일이 우선합니다. 또한 로컬 및 글로벌 (또는 숨겨진)을 다르게 설정할 수 있습니다. 일치하지 않는 경우 SAME 시스템에서 서로 충돌하여 라인 종료 오류가 발생하지 않습니다. 이것은 추적하기 힘든 고통입니다. :(
JGTaylor 2016 년

7
정확히 내가 생각하는 것. 소스 파일의 역할이 마음에 들지 않으면 코드 파일을 망칠 수 있습니다. 줄 끝은 단순히 편집 도구의 문제 일뿐입니다.
Tuncay Göncüoğlu

6
프로젝트가 Windows 전용 인 경우 아무런 문제가 없습니다. 그러나 귀하 또는 귀하의 동료가 * nix 플랫폼에서 작업하는 경우 "강력한 추천"으로 인해 문제가 발생할 수 있습니다. shebang로 끝나는 bash, perl 또는 python 스크립트를 실행 \r\n하면 볼 수 있습니다.
phuclv

6
설명 한 상황은 GIT의 문제가 아닙니다. 일반적으로 설정이 사라지고 FALSE로 설정하십시오. Instad, 팀 작업에 문제가 있습니다. "결국 한 개발자 세트 true" 는 무엇을 의미 합니까? 처음에 그렇게 하시겠습니까? git repo에 액세스하도록 설정하면 다른 언어로 특정 영역을 오염시키는 것을 허용하지 않는 것처럼 (따라서 작업하는 사람이 읽을 수 있음) 선택한 분기를 따라 분기 / 병합 /베이스 / 등을 유지하는 것처럼 정책은 명확한 규칙을 가져야합니다. 올바른 crlf를 설정하십시오.
quetzalcoatl

12

업데이트 2 :

Xcode 9는 파일의 현재 줄 끝을 무시하고 대신 줄을 파일에 삽입 할 때 기본 줄 끝 설정을 사용하여 줄 끝이 혼합 된 파일을 만드는 "기능"이있는 것 같습니다.

나는이 버그가 Xcode 7에 존재하지 않았다고 확신한다. Xcode 8에 대해서는 잘 모르겠습니다. 좋은 소식은 Xcode 10에서 수정 된 것으로 보입니다.

그것이 존재하는 시간 동안,이 버그는 내가 질문에서 언급 한 코드베이스에 약간의 양대를 유발했으며 (오늘날 사용합니다 autocrlf=false) 많은 "EOL"커밋 메시지와 결국 git pre-commithook을 작성 하여 확인했습니다. 혼합 라인 엔딩 도입 / 방지.

업데이트 :

참고 : VonC에서 언급 한 것처럼 Git 2.8부터 병합 마커 는 Windows 스타일 파일에 Unix 스타일 줄 끝을 도입 하지 않습니다 .

원본 :

이 설정에서 알아 차린 작은 딸꾹질은 병합 충돌이있을 때 차이 파일을 표시하기 위해 줄 git가 추가 하여 파일의 나머지 부분이 있더라도 Windows 줄 끝 이 없다는 것을 의미합니다. 줄 끝이 혼합 된 파일이있는 경우, 예 :

// Some code<CR><LF>
<<<<<<< Updated upstream<LF>
// Change A<CR><LF>
=======<LF>
// Change B<CR><LF>
>>>>>>> Stashed changes<LF>
// More code<CR><LF>

이것은 우리에게 아무런 문제를 일으키지 않습니다 (두 가지 유형의 줄 끝을 처리 할 수있는 도구가 혼합 줄 끝을 처리 할 수 ​​있다고 생각합니다-분명히 우리가 사용하는 모든 것).

다른 것은 * 우리가 발견 한이입니다 사용할 때 git diff윈도우 라인 엔딩, 따라서 디스플레이 그들의 캐리지 리턴을 추가 한 라인을 가진 파일의 변경 사항을 볼 수 있습니다 :

    // Not changed

+   // New line added in^M
+^M
    // Not changed
    // Not changed

* "문제"라는 용어는 실제로 가치가 없습니다.


2
NB Visual Studio에서 이러한 파일을 발견하면 줄 끝을 정규화 할 수 있습니다. Windows 줄 끝을 선택하거나 줄 끝 을 정규화 하지 않기로 선택 하면 올바르게 작동합니다 (VS가 여전히 올바르게 표시하므로 충돌이 해결되면 문제가되는 줄이 삭제됩니다).
Rich

2
불행히도 회사 버전 관리 나치 (Nazis)는 이에 동의하지 않습니다 (병합 충돌 마커의 LF)는 문제가되지 않습니다.
Ilia G

1
병합 충돌 마커의 LF는 문제가되지 않아야합니다. 어쨌든 그 라인을 리포지토리에 맡겨서는 안됩니다.
rob

1
참고 : git 2.8 (2016 년 3 월)부터 병합 마커에는 실제로 CRLF 줄 끝이 있습니다. 참조 stackoverflow.com/a/35474954/6309
VonC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.