TIL

CRLF/LF 이슈

차가운에스프레소 2023. 6. 9. 18:43

개요

- 사야매 프로젝트를 하면서, git 협업 중 CRLF 이슈가 발생했다.

- lint 설정을 이용해서 CRLF -> LF로 변경해서 이슈는 해결했지만, LF로 변경하면 변경이 발생한 파일은 모두 커밋이 되는 불상사가 발생한다.

- 이에, CRLF/LF 이슈는 git 협업을 본격적으로 시작하기 전에 세팅해두어야 할 이슈인 듯 하여 이렇게 블로그로 정리하게 됐다.

 

문제원인: OS가 채택하는 기본 개행문자의 차이

- Window는 기본적으로 CRLF로 라인을 끝내고, Mac, Linux는 LF로 끝낸다고 합니다.

- 그래서 개발 협업에서 lint와 prettier를 쓰는 경우, 이 개행문자 차이가 에러로 인식될 수 있는 것입니다.

 

문제 해결 방법: git config & IDE setting

1) git config를 이용한 방법

(1) git config core.eol

- git 저장소에서 사용할 개행문자 자체를 특정하는 것이다.

- eol은 세가지 값을 가진다.

native(default값): OS의 기본 개행문자를 따른다.
crlf: crlf를 따른다.
lf: lf를 따른다.

- 예컨대, window 환경에서 core.eol을 lf로 설정했다면, commit으로 로컬 git 저장소에 저장할 때 lf로 저장되는 것이다.

 

(2) git config core.autocrlf

- 원격 레포지토리로 파일을 전송하거나 전달받을 때 개행문자를 변환하는 옵션이다.

- autocrlf는 세 가지 값을 가진다.

false(default 값): 원격 레포지토리에 있는 파일의 개행문자를 그대로 받는다.
true: window에서 주로 설정하는 값으로, push 시 LF로, pull 시 CRLF로 변경한다.
input: Linx에서 주로 설정하는 값으로, push, pull 모두 LF로 설정한다.

(번외) git config의 수준

- git config에는 저장소 > 전역 > 시스템 수준이 있고, 이 순서대로 우선순위가 적용된다고 한다.

- 예컨대 저장소 config가 전역 config보다 우선한다고 한다.

저장소는 레포지토리 단위로 설정되는 것이라 보면 되겠다.

전역은 사용자 단위인 것으로 보인다.

시스템은 git이 설치된 컴퓨터 단위인 것으로 보인다.

 

2) IDE setting

- 추측컨대, 만약 git config에서 1) core.eol이 naitve, 2) core.autocrlf가 false로 설정된 경우, IDE 설정 값이 영향을 미칠 것이다.

- IDE setting에서 두 가지 값을 설정함으로써 개행 문자를 세팅할 수 있다.

files.eol: IDE에서 파일을 저장할 때 세팅이다. /n(LF), /r/n(CRLF) 값이 있다.
endOfLine: prettier에서 파일 저장 시, 개행문자를 어떻게 자동완성할 지를 결정하는 key이다. 총 4가지 값이 있다.
if(default): override 키를 부수적으로 가지고, override에 들어가는 값들에 한해 정해진 개행문자로 설정한다. orveride가 없으면 일반적으로 모든 파일에 동일한 개행문자를 적용한다.
auto: 현재 파일의 개행문자를 기준으로 적용한다. 그래서 파일마다 개행문자가 달라질 수도 있다.
crlf: crlf로 통일한다.
lf: lf로 통일한다.