Git CRLF·LF 차이로 전체 파일이 변경될 때 안전하게 정리하기

내용을 수정하지 않았는데 Git이 파일 전체를 변경으로 표시할 때 줄바꿈 정책을 확인하고 .gitattributes로 재발을 막는 방법입니다.

GitWindows · macOS · Linux

짧은 요약

운영체제별 기본 줄바꿈이 섞이면 Git이 실제 내용은 같아도 모든 줄을 변경으로 볼 수 있습니다. 작업 내용을 먼저 보존한 뒤 .gitattributes로 저장소 정책을 정하고 한 번만 정규화하세요.

증상과 환경

파일을 열어 저장했을 뿐인데 수백 줄이 삭제·추가로 표시되거나 셸 스크립트에서 bad interpreter 오류가 발생합니다.

원인

Windows의 CRLF와 Unix 계열의 LF가 파일 또는 체크아웃 설정에서 변환되면서 저장소 상태가 달라졌습니다. core.autocrlf 값만 팀원마다 다르게 설정해도 반복될 수 있습니다.

재현 예시

git diff --ignore-space-at-eol
git config --show-origin --get core.autocrlf

첫 명령에서 차이가 사라진다면 줄바꿈 차이일 가능성이 큽니다.

단계별 해결법

1. 작업 내용 보존

커밋하지 않은 실제 수정이 있다면 별도 브랜치나 패치로 먼저 보존합니다.

git diff > before-line-ending-fix.patch

2. 저장소 정책 추가

.gitattributes 예시입니다.

* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.png binary
*.jpg binary

3. 인덱스 정규화

git add --renormalize .
git status
git diff --cached --stat

변경 범위가 예상과 일치할 때만 별도 커밋으로 저장합니다.

확인법

새로 체크아웃한 작업 디렉터리에서 git status가 깨끗한지, Linux에서 실행할 셸 스크립트가 LF인지 확인합니다.

주의사항

사용자 변경이 있는 상태에서 파일 전체를 일괄 변환하지 마세요. 줄바꿈 정규화 커밋과 기능 수정 커밋을 분리해야 리뷰와 복구가 쉽습니다.

관련 이슈

  • executable bit 변경
  • UTF-8 BOM으로 인한 스크립트 오류
  • 편집기별 end-of-line 설정 차이