git 새 줄 문자 경고

git 에서 git add 를 할 때에 아래의 경고를 만났다.

1
2
warning: CRLF will be replaced by LF in index.html.
The file will have its original line endings in your working directory.

경고: CRLF 는 index.html 의 LF로 대체됩니다.
파일은 작업 디렉토리에 원래의 줄 끝을 갖습니다.

CRLF, CR, LF? 이게 뭐지?

찾아보니, 윈도우(Windows)는 CR(Carriage Retrun) 과 LF(Line Feed) 문자를 둘 다 사용하지만, Unix, Linux, MacOSLF 문자만을 사용한다고 한다.
함께 협업하는 인원들이 한 가지 운영체제를 사용한다면 별 문제가 없겠지만, 아닐경우 불편한 문제가 생기는것 같다.
실제로 소스코드의 변함이 없는데, 이 문제로 소스코드가 변경되었다고 판단하는 듯 하다.

더 찾다보니, 위키에서 새줄 문자 라는걸 찾았는데,
CRLF, CR, LF 만 있는게 아니었다(오 머리 아파).

위키 유니코드의 새줄 문자

구분 설명
LF 라인 피드(Line Feed), U+000A
FF 폼 피드(Form Feed), U+000C
CR 캐리지 리턴(Carriage Return), U+000D
CR+LF 연속된 CR과 LF
NEL 다음 줄(Next Line), U+0085
LS 줄 구분자(Line Separator), U+2028
PS 문단 구분자(Paragraph Separator), U+2029

경고문제는 어떻게 해결 하면 좋을까?

뭐 결국은, 어떻게 해야 할까이고..
각각 설정하는 방법도 여기저기서 찾았는데,
나는 각 저장소(repository)별로 속성을 지정해서 설정을 강제하는 방법을 사용하기로 했다.
(같이 협업하는 인원들에게 이건 이렇게 해주시고, 저건 저렇게 해주세요 보다는 훨씬 공수가 덜 들어간다고 생각했다.)

.gitattributes 설정

.gitattributes 파일을 생성하고 아래 내용을 기록한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Auto detect text files and perform LF normalization
# 텍스트 파일 자동 감지 및 LF 정규화 수행
* text=auto

*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text

*.csproj text merge=union
*.sln text merge=union eol=crlf

*.docx diff=astextplain
*.DOCX diff=astextplain

# absolute paths are ok, as are globs
# 절대경로는 괜찮다
/**/postinst* text eol-lf

# paths that don't start with / are treated relative to the .gitattributes folder
# .gitattributes 와 관련하여 /로 시작하지 않는 경로
relative/path/*.txt text eol-lf

참조