.gitattributes 는 무엇인가? :: 마이구미
이 글은 .gitattributes 파일에 대해 다룬다.
참고 자료 - https://www.aleksandrhovhannisyan.com/blog/crlf-vs-lf-normalizing-line-endings-in-git/#a-simple-gitattributes-config
Github 의 오픈 소스들을 보다보면, 루트 단위에서 .gitattributes 파일을 흔히 볼 수 있다.
Git 설정 관련 파일로 추정할 수 있는데, 대부분 다음과 같은 코드로 작성되어있다.
* text=auto
위 코드를 이해하기 위해서는 줄바꿈(Line Ending) 을 이해해야한다.
줄바꿈은 Newline, EOL(End of Line), Line Break 등 같은 용어라고 볼 수 있다.
줄바꿈 방식은 크게 LF(Line Feed), CRLF(Carriage Return Line Feed) 로 분류할 수 있다.
제어 문자로 표현하면 LF 는 "\n", CRLF 는 "/r" 를 의미한다.
사용 사례 기준으로는 LF 는 리눅스에서 사용하고, CRLF 는 윈도우에서 사용하고 있는 줄바꿈 표현 방식이다.
LF, CRLF 의 조금 더 상세한 히스토리를 간략히 살펴보자.
CR(Carriage Return) 의 경우에 타자기(typewriters)에서 유래되었다.
영상에서는 새로운 줄바꿈과 왼쪽 시작점으로 이동하기 위해서 물리적인 버튼을 누르는 것을 볼 수 있다.
이 부품은 "캐리지" 로, 이러한 기능을 "캐리지 리턴"으로 불렀다.
그리고 20세기 타자기(teletypewriters)가 발명되었다.
줄바꿈을 왼쪽 시작점으로 이동하는 것과, 새로운 줄로 이동하는 것으로 구분하였다.
이러한 이동에 대해 LF, CR 를 수직, 수평으로 생각하면 시각화하기 더 쉽다.
그리고 이러한 유사성을 기반으로 초기 MS-DOS 에서 줄바꿈 방식을 CRLF 로 설정하였다.
그 이후 유닉스의 경우에는 일관성과 단순성을 위해 CRLF 가 아닌 LF 를 사용했다.
그리고 현재 대부분 LF 방식으로 동작하지만, 여전히 윈도우의 경우에는 CRLF 를 따르고 있다.
축약한 내용으로 자세한 내용은 참고 자료를 통해 확인하길 바란다.
우리가 주목해야할 점은 OS 에 따라, 줄바꿈 방식이 다르다는 것이다.
이것이 문제가 발생할 수 있는 사례 중 하나가 우리가 쉽게 접하는 Git 이다.
개발자가 사용하는 컴퓨터의 OS 는 크게 mac, window 2가지이다.
mac 의 경우에는 LF, window 의 경우에는 CRLF 로 서로 다른 상황이다.
이것은 정확한 문자 비교를 통해 diff 를 찾아내는 Git 입장에서는 난감하다.
즉, mac 에서 올린 코드와 window 에서 올린 코드가 시각적으로 동일한 코드라고 할지라도, Git 입장에서는 변경된 코드로 판단한다.
이러한 이슈를 위해 로컬 환경에서 설정할 수 있는 git config 에 관련 설정을 제공해주고 있다.
git config --global core.autocrlf [true | false | input]
true 로 설정하면 체크인 시점에 LF 로 변환하고, 체크아웃 시점에 작업 트리(Working Tree)로 파일들을 CRLF 로 변환한다는 의미가 된다.
input 의 경우에는 체크인 시점에 LF 로 변환한다.
false 는 디폴트 값으로써, 별다른 변환 없이 그대로 진행한다.
각자 다른 OS 환경을 위해서는 true 또는 input 을 사용하게 된다.
결과적으로 true 를 예시로 들어보면, 저장소에서는 LF 를 보장하면서 Window 환경에서의 호환성을 위해 CRLF 그대로 사용할 수 있게 도와주는 것이다.
하지만 알다시피 git config 명령어는 각자의 로컬 환경에 설정해야한다.
매번 Window 환경의 개발자 개개인에게 로컬에서 설정하라고 해야한다.
이러한 번거로움이 생기고, 만약 설정하지 않는다면 똑같은 문제가 발생할 것이다.
이것들을 단순하게 해결할 수 있는 것이 .gitattributes 파일이다.
이 파일은 Git 에게 파일 내부의 설정 값들을 말해주는 역할을 한다.
결과적으로 git config 명령어와 같은 로컬 환경에서 개개인이 설정할 필요가 없어진다.
* text=auto
위 설정값은 체크인 시점에는 텍스트 기반의 파일에는 줄바꿈을 LF 로 변환한다는 것을 의미한다. (이것은 git config autocrlf input 과 동일하다.)
참고로 텍스트 기반 파일(text=auto)에만 명시한 이유는 Image, font 등의 바이너리 파일에 줄바꿈 변환으로 인한 손상을 피하기 위함이다.
그리고 추가적으로 eol 까지 붙는 경우도 볼 수 있다.
* text=auto eol=lf
eol 의 경우에는 config.autocrlf=true 처럼 작업 트리까지 영향을 주는 것이다.
- eol=lf - 체크아웃 시점에 파일들을 LF 로 변환한다
- eol=crlf - 체크아웃 시점에 파일들을 CRLF 로 변환한다
서로 다른 줄바꿈 방식으로 인한 이슈는 Git 뿐만 아니라 다른 영역에서도 문제가 발생할 수 있다.
린팅(linting) 과 관련있는 eslint, prettier 를 사용하는 경우에도 Git 의 경우와 동일하다.
git 설정으로 작업 트리까지 영향을 줄 수도 있지만, 로컬 환경의 모든 시점을 Git 설정 하나로 관여할 수는 없다.
.editorconfig 를 활용하면 본인의 에디터 환경에서의 eol(End of Line) 를 설정할 수 있다.
[*]
end_of_line = lf
결과적으로 에디터의 eol=lf 의 설정은 작업 트리에서의 줄바꿈을 LF 로 설정한다는 것을 의미한다.
.gitattributes 와 .editorconfig 를 활용하여 줄바꿈으로 발생할 수 있는 이슈들을 해결할 수 있게 된다.
추가로 참고하면 좋은 자료
.editorconfig - https://mygumi.tistory.com/432