SourceTree를 통해 외부Git 저장소 관리시 CRLF 문제해결하기

Posted by Everyharu
2016.06.09 11:45 IT/Git

필자가 작성하는 내용은 다음과 같은 내용을 기준으로 작성합니다.


1. Gitlab이나 Github와 같은 Git외부 Repository를 사용합니다.

2. 개발은 윈도우상에서 이루어집니다.

3. 개발용 PC에서는 따로 Git을 설치하지 않고 SourceTree의 내장 Git을 사용합니다.

4. 하지만 개발된 내용을 실행할 서버는 클라우드환경(리눅스) 입니다.

5. IDE툴에서 직접 서버로 전송하는게 아니라 서버에서 Git의 내용을 체크아웃해와서 구동하는 방식이다.

필자의 상황은 위와 같았지만 굳이 이런 상황이 아니더라도 혹시모르기 때문에 아래의 내용을 적용시켜 주는것이 좋다.


위와같은 상황에서 우리는 개발된 내용을 실행할 Linux와 Windows 사이에서의 Line ending 방식 차이에 따른 문제를 간혹 경험하게된다. 이를 사전에 방지하기 위해 항상 새로 개발환경을 세팅할 때는 우리의 Git에서 해주어야 할 일이 있다.


소스트리에서 내장용 Git을 사용할 경우 터미널이라는 메뉴가 있다.


이를 실행하면 다음과 같은 화면을 볼 수 있다.


CRLF 설정을 하기 전에...

다음으로 넘어가기 전에 혹시 커밋할 Global 변수에 대한 세팅을 하지 않았다면 미리 해주기 바란다.

git config --global user.name "커밋시 사용할 사용자 닉네임"

git config --global user.email "커밋시 사용할 사용자의 이메일주소"


CRLF는...?

흔히 CRLF라고 말하는것은 line ending을 처리하는 방식을 말한다. 다른말로는 CR(Carriage-Return) 과 LF(Line Feed)이라고 표현하기도 한다.
프로그래밍을 하는 상황에 따라 다르겠지만 어떤사람들은 \r\n 이라는 구문을 본적이 있는지 모르겠다.
또 \r\n을 잘 모르더라도 IDE에서 정규식을 통해 검색할 때 줄바꿈에 대한 표기를 \n으로 하는것을 본적이 있을것이다.

또 어떤 문서를 다운받았는데 메모장으로 열면 줄바꿈이 전혀되지 않은 문서라 보기가 불편하고 이상한 검은사각형 문자가 있는 경우를 볼 수 있다.
이는 \n을 사용하는 방식에서 작성되어 \r\n을 줄바꿈으로 인식하는 메모장에서는 줄바꿈이 제대로 인식되지 않은것이다. 이 문제는 Notepad++ 나 Editplus 와 같은 다른 메모장 프로그램들을 사용하면 제대로 줄바꿈이 표기된다.



아무튼 CR - \r, LF - \n 으로 표기되는 방법으로서 Windows 상에서는 메모장에서 하나의 엔터를 치면 이 줄바꿈에 대한 내용이 \r\n 으로 들어간다고 생각하면 된다.
하지만 Linux 에서 vi 를 통해 줄바꿈을 위해 엔터를 쳤을때 들어가는 내용은 \n 으로 들어간다. 두 OS의 줄바꿈에 대한 처리방식이 다르다는 것이다.
이러한 문제로 인해 간혹 이클립스같은 윈도우IDE에서 작업을 하고 서버로 SFTP전송하는 작업방식을 사용할 때 사람들은 서버에서 vi로 작성한 파일을 열었을 때 ^r 과 같은 괴상한 문제들이 줄의 맨 뒤에 있는것을 볼 수 있다. 실행시에 문제가 없을수도 있지만 팀 내에 vi로 작업하는 사람도 있을경우 이는 굉장히 문제가 된다. 이러한 IDE 툴들에서도 각기 문서에 대한 CRLF를 설정하는 Properties들이 있기 때문에 개발환경을 세팅할때는 반드시 잊지말고 찾아보기 바란다.


GIT에서의 CRLF 설정하기

1. 내장된 Git 자체에서 어떤 line ending 을 사용할지 세팅
 앞서 말했듯이 OS별로 line ending이 다르다고 하였다. 그리고 각 IDE에서도 이것을 세팅할 수 있듯이 GIT 내부에서도 저장소를 관리할 수 있는 CRLF 방식을 조정할 수 있다. 별다른 문제가 없게 하기에는 역시 \r\n 보다는 \n으로 통일하는것이 좋다.

Git의 global 세팅중에 core.eol 이라는 변수가 이러한 역할을 한다.

native, crlf, lf 세가지 옵션이 있는데 native같은 경우에는 해당 운영체제에서 사용하는 기본 line ending을 사용한다는 뜻이다. 우리는 LF를 사용할 것이므로 다음과 같이 설정한다.

설정 예시
git config --global core.eol lf


2. 커밋시에 crlf의 처리방식
 앞에서 core.eol 을 처리하긴 했으나 이것만으로는 뭔가 부족하다. 커밋하려고 할때 내가 작업하지 않은 파일에 있는 \r\n 과 git에 저장되어 있는 \n 이 compare 되면서 변경된 파일이라고 인식해버린다. 때문에 한가지 설정이 더 필요하다. core.autocrlf 가 이 역할을 한다.

설정가능한 항목은 false(Default), true, input 이 있다.
false : 디폴트, 작성된 파일을 전혀 손대지 않고 커밋한다. 윈도우에서 다른 설정을 건들지 않고 이렇게 저장했을 경우 리눅스 작업자가 열어보면 난리난다.
true : 텍스트파일을 커밋하기 전에 CRLF를 LF로 자동적으로 변환하여 준다. 다만 체크아웃받을때는 반대로 LF를 CRLF로 변환하여 리턴해준다. 즉 윈도우에서만 사용해야한다. 아래의 명령어 예시에서는 input을 추천했지만 만약 본인이 사용하는 IDE에서 줄바꿈이 제대로 보이지 않는다면 이 옵션을 사용하기를 권한다.
input : LF를 line ending으로 사용한다. 커밋과 체크아웃 둘다 LF로만 사용하기 때문에 파일을 통일시킬 수 있다.

설정 예시
git config --global core.autocrlf input

기본설정은 false 로 CRLF와 LF 구분하지 않고 그대로 저장해버린다. 때문에 가만히 뒀을 경우 잘못하면 vi 작업자들에게 큰 민폐를 끼치게 될 수 있으니 반드시 설정하자.

이 댓글을 비밀 댓글로