guide

왜 무시될까? git check-ignore로 디버깅하기

git check-ignore -v, git status --ignored, git ls-files로 어떤 규칙이 파일을 무시하는지 찾고, 규칙이 동작하지 않는 흔한 원인 7가지를 점검하는 방법입니다.

규칙이 많아지면 "이 파일은 왜 안 보이지?" 또는 "왜 계속 보이지?"라는 질문이 생긴다. git에는 이 질문에 답해 주는 명령이 있다.

git check-ignore -v

git check-ignore -v logs/app.log src/build/keep.txt

출력은 출처:줄번호:패턴<탭>경로 형식이다.

.gitignore:3:*.log	logs/app.log

일치하지 않은 경로까지 보려면 --non-matching(-n)을 함께 쓴다.

추적 중인 파일은 --no-index

이미 추적 중인 파일에는 무시 규칙이 적용되지 않으므로 check-ignore도 기본적으로 아무것도 출력하지 않는다. 규칙이 그 파일에 일치하는지만 알고 싶다면 --no-index를 붙인다.

$ git check-ignore -v app.log            # 추적 중이라 출력 없음
$ git check-ignore -v --no-index app.log
.gitignore:3:*.log	app.log

무시된 파일 목록 보기

# 상태와 함께 무시된 항목 표시 (!! 표시)
git status --ignored --short

# 무시된 파일을 파일 단위로 전부 나열
git ls-files --others --ignored --exclude-standard

# 무시 규칙에 걸리는데 추적 중인 파일
git ls-files -ci --exclude-standard

git status --ignored는 디렉터리 전체가 무시되면 !! logs/처럼 디렉터리 하나로 보여 준다. 파일 단위로 보고 싶다면 ls-files를 쓴다.

규칙이 동작하지 않는 흔한 원인

  1. 이미 추적 중이다. 가장 흔하다. git ls-files <경로>에 출력이 있으면 추적 중이다. git rm --cached로 추적을 끊는다.
  2. 상위 디렉터리가 제외됐다. dir/를 무시한 상태에서 !dir/file은 효과가 없다. dir/*로 바꾼다.
  3. 순서가 뒤집혔다. 부정 규칙 뒤에 더 넓은 규칙이 다시 나오면 그 규칙이 이긴다. check-ignore -v의 줄번호를 보면 바로 알 수 있다.
  4. 후행 공백. *.log 끝의 공백은 제거되지만, 반대로 패턴 의 공백이나 전각 공백 같은 보이지 않는 문자는 패턴의 일부로 남는다.
  5. 슬래시 방향. gitignore는 Windows에서도 /만 경로 구분자로 쓴다. build\output은 역슬래시가 이스케이프로 해석되어 의도대로 동작하지 않는다.
  6. 앵커링 착각. config/local.json은 중간 슬래시 때문에 루트의 config에만 일치한다. 모든 깊이에 적용하려면 **/config/local.json을 쓴다.
  7. 대소문자. core.ignorecasefalse인 환경(보통 Linux)에서는 *.JPG*.jpg가 다르다. macOS·Windows에서 만든 저장소는 대개 true라 로컬에서는 되고 CI에서는 안 되는 차이가 생길 수 있다.

브라우저에서 미리 확인하기

저장소에 적용하기 전에 규칙을 바꿔 보며 결과를 비교하고 싶다면 이 사이트의 패턴 테스트 탭이 편하다. 규칙과 경로 목록을 붙여 넣으면 경로마다 결과와 결정한 규칙(줄 번호), 상위 디렉터리 때문에 무시된 경우를 표시한다. 경로 목록은 git ls-filesfind . -type f 출력을 그대로 쓰면 된다. 다만 하위 디렉터리의 .gitignore나 전역 설정까지 합친 최종 판정은 저장소에서 git check-ignore -v로 확인한다.

참고

← 이전이미 커밋된 파일을 .gitignore로 무시하기