EOL을 넣어야 하는 이유와 운영체제별 EOL(EndOfLine) 차이로 인한 Git 문제 해결

3530 단어 gitLFEOLCRLFCRLF

문제

  • 페어프로그래밍 후 가져온 코드에서 eslint의 Delete cr 경고가 확인되었다.

  • 깃허브에 커밋된 내용을 살피던 중 파일의 마지막 줄에 개행(EOL)이 되어 있지 않아 빨간색 경고 아이콘이 표시되어 있음을 확인하였다.

일단 EOL이 뭐야?

문제를 해결하기 전에 일단 EOL이 무엇인지 다시 확인해보자.
EOL(end-of-line)은 개행문자 또는 줄바꿈문자라고 불리며, 새줄문자(newline)라고 칭하기도 한다. 텍스트의 한 줄이 끝남을 표시하는 문자(문자열)이다.

파일마다 EOL을 넣어야 하는 이유

파일마다 EOL, 즉, 개행을 해야 하는 이유는 무엇일까?
이유는 POSIX 명세가 그러하기 때문이다.
많은 시스템과 프로그램이 이 표준을 따라 구현되어 있으며, 이를 위반 시 예기치 않은 동작이 일어날 수 있다고 한다. 또한, EOL이 있으면 파일을 구분하는 데에도 도움이 된다. 만약 파일의 끝에 개행이 되어 있지 않다면 깃허브에 커밋 시 경고 메시지를 볼 수도 있다

[해결방법] 파일마다 EOL을 자동으로 넣도록 설정

파일마다 직접 매번 개행을 꼼꼼히 해주거나...

.prettierrc (또는 .prettierrc.json) 파일(객체 내부)의 "endOfLine"프로퍼티를 "auto"로 설정한다.

'prettier/prettier': [
  'error',
  {
    'endOfLine': 'auto',
  }
]

OS마다 다른 EOL 방법

기종이나 운영 체제에 따라 EOL을 나타내는 코드가 다를 수도 있다.

  • 윈도우 : CRLF(\r\n)
  • 유닉스 : LF(\n)
  • 맥OS : LF(\n)
    - 버전 9까지는 CR, 이후부터는 LF

CR, LF, CRLF ?

이 용어들은 예전에 타자기에서 새 줄을 바꾸는 방식을 의미한다.
ASCII 시스템에서는 EOL로 LF(line feed, '\n')와 CR(carriage return,'\r')이 주로 사용된다.

  • LF는 프린터에서 종이가 한 줄씩 인쇄되며 나오는 것을 뜻한다. 커서는 그 자리에 그대로 둔 상황에서 종이만 한 줄 올려 줄을 바꾸는 동작이다.
  • CR은 프린터에서 실제 인쇄를 수행하는 장치가 한 줄의 끝에서 시작 위치로 돌아가는 것을 뜻한다. 현재 커서를 한 줄 올림 없이 가장 앞으로 옮기는 동작이다.
  • CRLF(\r\n)는 CR(\r)과 LF(\n)를 합친 조합이다. 타자기 이후 컴퓨터에서 줄바꿈을 할 때 CRLF를 사용하기도 했으나, 메모리 절약 등을 이유로 CR 혹은 LF를 사용하게 되었고, 위에서 살펴본 것처럼 운영체제별 사용하는 EOL이 다르다.

운영체제마다 다른 EOL로 인한 문제

  • 위에서 살펴본 것처럼 윈도우에서는 EOL을 전통적인 방식의 CRLF를 사용하는 반면, 유닉스나 맥에서는 LF를 사용한다는 차이가 있다는 점이다.
  • 이 때문에 EOL을 CRLF로만 인식하는 에디터(메모장)의 경우 유닉스 계열 운영체제에서 작성한 문서를 열면 모두 한 줄로 나오고 깨지게 된다.

[해결방법] git에서 CRLF 관련 문제 해결

페어프로그래밍 및 협업 시 운영체제가 서로 다르면 EOL이 다를 수 있다.
Git에는 이 문제를 해결하기 위한 설정이 있다.

autocrlf 설정 사용

윈도우로 개발하는 분과 협업하면 EOL이 다른 문제가 생긴다. 위에서 살펴본 것처럼 윈도우는 EOl로 CR과 LF를 다 사용하지만, 맥과 유닉스는 LF만 사용하기 때문이다.

Git은 Checkout(저장소에서 가져올 때)할 때 LF를 CRLF로 변환해주고, Commit(저장소로 보낼 때) 시 자동으로 CRLF를 LF로 변환해주는 autocrlf 기능이 있다.

  • Windows
    윈도우에서는 아래처럼 autocrlf를 true로 설정하여 위와 같은 효과를 기대한다.
    git config --global core.autocrlf true

  • Linux, Mac OS
    리눅스, 맥, 유닉스는 LF 만 사용하므로 autocrlf 값을 input 으로 설정하여 Commit할 때만 (혹시나 있을 수도 있는) CRLF를 LF로 변환하도록 설정한다.
    git config --global core.autocrlf input

git global config 구성 후에는 코드를 다시 pull해와야 한다.

참고
파일 끝에 개행을 추가해야 하는 이유
파일마다 EOL(End Of Line)을 왜 넣어야 할까
Formatting and Whitespace
git 에서 CRLF 개행 문자 차이로 인한 문제 해결하기
새줄문자

좋은 웹페이지 즐겨찾기