숏컷 코드
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.ps1 text eol=crlf
*.png -text
*.jpg -text
*.pdf -text정책 적용 후 정규화
git add --renormalize .
git status
git commit -m "Normalize line endings"변환 구조
gitattributes는 파일 내용 처리 규칙을 저장소에 고정한다
.gitignore가 "무엇을 추적하지 않을지"를 정한다면, .gitattributes는 "추적하는 파일을 Git이 어떻게 다룰지"를 정합니다. line ending, diff 방식, merge driver, export 설정처럼 파일 경로별 속성을 저장소에 기록할 수 있습니다. 그중 가장 자주 쓰는 용도는 OS별 LF/CRLF 차이를 정규화하는 것입니다.
* text=auto는 Git이 텍스트 파일을 자동 판정하고, 인덱스에는 LF로 정규화하도록 합니다. 작업트리에 checkout될 때는 eol 속성, Git config, 플랫폼에 따라 LF 또는 CRLF로 나올 수 있습니다. 파일별로 반드시 고정해야 하는 경우 *.sh text eol=lf, *.bat text eol=crlf처럼 명시합니다.
text, eol, -text는 서로 다른 판단을 한다
text는 해당 파일을 텍스트로 보고 line ending 변환 대상에 넣습니다. text=auto는 Git이 텍스트와 바이너리를 판정하게 합니다. eol=lf나 eol=crlf는 작업트리에 어떤 줄 끝으로 checkout할지 지정합니다. -text는 Git이 line ending 변환을 시도하지 않게 하므로 이미지, PDF, 압축 파일처럼 바이너리 파일에 적합합니다.
* text=auto
*.md text eol=lf
*.sh text eol=lf
*.sln text eol=crlf
*.png -texteol은 text 또는 text=auto가 설정된 파일에서 의미가 있습니다. eol만 적어도 Git은 필요한 text 속성을 함께 설정한 것처럼 다루지만, 팀에서 읽기 쉽게 하려면 text eol=lf처럼 같이 적는 편이 명확합니다.
운영 기준
| 상황 | 적합한 설정 |
|---|---|
| 크로스 플랫폼 프로젝트 기본값 | * text=auto |
| shell script가 CRLF로 깨지는 문제 방지 | *.sh text eol=lf |
| Windows batch 파일 유지 | *.bat text eol=crlf |
| 이미지, 폰트, PDF 변환 방지 | -text |
| 기존 파일까지 정책 반영 | git add --renormalize . |
| 무엇이 바뀌는지 확인 | git status, git diff --cached --stat |
이미 추적 중인 파일에 .gitattributes를 추가해도 과거 인덱스 상태가 즉시 모두 바뀌지는 않습니다. 저장소 전체에 정책을 적용하려면 깨끗한 작업트리에서 .gitattributes를 커밋한 뒤, git add --renormalize .로 정규화 변경을 별도 커밋으로 만드는 편이 검토하기 쉽습니다.
주의할 점
line ending 정규화는 실제 내용 변경처럼 큰 diff를 만들 수 있습니다. 기능 변경과 같은 커밋에 섞으면 리뷰가 어려워지므로,
.gitattributes 도입과 정규화 diff는 별도 커밋으로 분리하는 편이 안전합니다.
실패 예시
- 기능 수정과 line ending 정규화를 한 커밋에 섞어 리뷰가 불가능해짐
- 바이너리 파일에 text=auto가 잘못 적용되어 파일이 깨짐
- Windows 전용 스크립트와 Unix shell script를 같은 eol 정책으로 묶음참고 링크
1 sources