윈도우 동료가 커밋하면 파일 전체가 바뀐 것으로 보이는 이유
문제 발생
윈도우를 쓰는 동료가 한 줄만 고쳤는데, PR에는 파일 전체가 바뀐 것으로 올라왔습니다.
$ git diff --stat
src/app.ts | 480 ++++++++++++++++++++++++-------------------------반대로 제 쪽에서 고친 파일은 동료 화면에서 똑같이 전부 바뀐 것으로 보였습니다.
원인 분석
줄바꿈 문자가 다릅니다. 윈도우는 CRLF(\r\n), macOS/리눅스는 LF(\n)를 씁니다. 파일 전체의 줄 끝이 바뀌면 Git에게는 모든 줄이 바뀐 것입니다.
여기서 흔히 쓰는 core.autocrlf는 각자 자기 컴퓨터에 거는 설정입니다. 저장소에 따라오지 않으므로, 새로 합류한 사람이 설정하지 않으면 그대로 재발합니다. 팀에서 한 명만 빠뜨려도 diff가 다시 오염됩니다.
저장소에 커밋되어 모두에게 동일하게 적용되는 것은 .gitattributes 입니다. 공식 문서가 이 파일의 text 속성으로 줄바꿈 정규화를 정의합니다.
text— 커밋할 때 줄바꿈을 LF로 정규화합니다.text=auto— Git이 텍스트라고 판단한 파일만 정규화합니다.eol=lf/eol=crlf— 작업 디렉터리에 체크아웃될 때의 줄 끝을 고정합니다.-text— 정규화하지 않습니다(바이너리 취급).
해결 방안
.gitattributes를 만들고 커밋합니다. 이게 핵심입니다 — 설정이 저장소를 따라다닙니다.
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
*.pdf binarybinary는 매크로로, 공식 문서 기준 -diff -merge -text와 같습니다. 바이너리를 텍스트로 오인해 망가뜨리는 일을 막습니다.
- 이미 커밋된 파일을 한 번 정규화합니다.
.gitattributes만 추가하면 앞으로 커밋되는 것만 적용됩니다. 저장소에 이미 들어간 CRLF는 그대로 남습니다.
git add --renormalize .
git commit -m "저장소 전체 줄바꿈 정규화"- 이 정규화 커밋은 따로 올립니다. 기능 변경과 섞으면 리뷰가 불가능해집니다. 커밋 해시를
.git-blame-ignore-revs에 넣어 두면git blame도 이 커밋을 건너뜁니다.
git config blame.ignoreRevsFile .git-blame-ignore-revs- 개인 설정은 오히려 꺼둡니다.
.gitattributes가 있으면 그쪽이 우선이지만, 설정이 두 군데 있으면 원인을 찾기 어려워집니다.
git config --global core.autocrlf false- 확인은 체크인 결과로 합니다. 무엇이 어떻게 처리되는지 직접 볼 수 있습니다.
git check-attr text eol -- src/app.ts
git ls-files --eol src/app.ts # i/ = 저장소, w/ = 작업 디렉터리i/lf w/crlf처럼 나오면 저장소에는 LF, 윈도우 작업 디렉터리에는 CRLF로 정상 동작하는 상태입니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.