guide

.gitignore 패턴 문법 총정리

주석·이스케이프·후행 공백, 부정 !, 끝 슬래시, 앵커링, *·?·[] 와일드카드, ** 규칙까지 gitignore 패턴 문법을 예시 표와 함께 정리합니다.

.gitignore의 각 줄은 하나의 패턴이다. 문법은 셸의 glob과 비슷해 보이지만 슬래시의 위치**의 위치에 따라 뜻이 크게 달라진다. 아래 내용은 git 공식 문서 gitignore(5)를 기준으로 하고, 예시는 git 2.50에서 직접 확인했다.

빈 줄, 주석, 이스케이프

후행 공백은 눈에 보이지 않아 흔한 실수의 원인이 된다. 규칙이 먹지 않는다면 에디터에서 공백 표시를 켜 보자. 공백 문자만 제거되고 탭은 제거되지 않는다는 점도 기억해 둔다.

끝의 슬래시: 디렉터리에만 일치

패턴이 /로 끝나면 디렉터리에만 일치한다. build/build라는 디렉터리와 그 안의 모든 것을 무시하지만, build라는 이름의 파일은 무시하지 않는다. 반대로 build처럼 슬래시 없이 쓰면 같은 이름의 파일과 디렉터리 모두에 일치한다.

슬래시가 있으면 위치가 고정된다

끝의 슬래시를 뺀 나머지 부분에 /처음이나 중간에 있으면, 그 패턴은 .gitignore 파일이 있는 디렉터리를 기준으로 한 경로에만 일치한다. 이것을 흔히 앵커링(anchoring)이라고 부른다. /가 없으면 .gitignore가 있는 곳 아래의 모든 깊이에서 이름이 일치하는 항목을 찾는다.

패턴일치일치하지 않음
debug.logdebug.log, logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/logs/debug.log
doc/frotz/doc/frotz/ 디렉터리a/doc/frotz/
frotz/frotz/, a/frotz/ 디렉터리frotz 파일

세 번째 줄이 특히 헷갈린다. logs/debug.log는 중간에 슬래시가 있으므로 루트 기준으로 고정되고, 앞에 /를 붙인 것과 같은 뜻이 된다. 모든 깊이의 logs/debug.log를 잡으려면 **/logs/debug.log를 쓴다.

와일드카드: *, ?, [ ]

두 개의 별표 **

**슬래시와 붙어 있을 때만 특별한 뜻을 가진다.

형태
**/foo모든 깊이의 foofoo, a/foo, a/b/foo
**/logs/debug.log모든 깊이의 logs/debug.loglogs/debug.log, app/logs/debug.log
abc/**abc 안의 모든 것abc/x, abc/x/y (단 abc 자체는 아님)
a/**/b사이에 디렉터리가 0개 이상a/b, a/x/b, a/x/y/b

그 밖의 위치, 예를 들어 foo****bar**는 일반 *처럼 동작해 슬래시를 넘지 못한다. docs/**/*.pdfdocs/manual.pdfdocs/a/b/manual.pdf에 모두 일치한다. /**/가 0개의 디렉터리에도 일치하기 때문이다.

작은 예제 하나로 정리

# 빌드 결과 (루트의 build 디렉터리만)
/build/

# 모든 깊이의 로그 파일, 단 중요한 로그는 남김
*.log
!important.log

# docs 아래 모든 PDF
docs/**/*.pdf

# 이름이 #으로 시작하는 파일
\#scratch.md
경로결과결정한 규칙
build/app.js무시됨/build/
src/build/app.js추적없음
logs/server.log무시됨*.log
logs/important.log추적!important.log
docs/api/v1.pdf무시됨docs/**/*.pdf
#scratch.md무시됨\#scratch.md

이 표는 생성기의 패턴 테스트 탭에 규칙과 경로를 붙여 넣으면 그대로 재현할 수 있다.

참고

← 이전무엇을 무시하고 무엇을 커밋할까