.gitignore 패턴 문법 총정리
주석·이스케이프·후행 공백, 부정 !, 끝 슬래시, 앵커링, *·?·[] 와일드카드, ** 규칙까지 gitignore 패턴 문법을 예시 표와 함께 정리합니다.
.gitignore의 각 줄은 하나의 패턴이다. 문법은 셸의 glob과 비슷해 보이지만 슬래시의 위치와 **의 위치에 따라 뜻이 크게 달라진다. 아래 내용은 git 공식 문서 gitignore(5)를 기준으로 하고, 예시는 git 2.50에서 직접 확인했다.
빈 줄, 주석, 이스케이프
- 빈 줄은 아무것에도 일치하지 않는다. 가독성을 위한 구분선으로 쓴다.
#으로 시작하는 줄은 주석이다. 이름이#으로 시작하는 파일을 무시하려면\#처럼 역슬래시를 붙인다.- 줄 끝의 공백은 무시된다. 공백으로 끝나는 파일 이름이 필요하면
foo\처럼 역슬래시로 공백을 보호한다. 줄 앞의 공백은 패턴의 일부로 남는다. !로 시작하는 줄은 부정 패턴이다. 이름이!로 시작하는 파일은\!important.txt처럼 쓴다.
후행 공백은 눈에 보이지 않아 흔한 실수의 원인이 된다. 규칙이 먹지 않는다면 에디터에서 공백 표시를 켜 보자. 공백 문자만 제거되고 탭은 제거되지 않는다는 점도 기억해 둔다.
끝의 슬래시: 디렉터리에만 일치
패턴이 /로 끝나면 디렉터리에만 일치한다. build/는 build라는 디렉터리와 그 안의 모든 것을 무시하지만, build라는 이름의 파일은 무시하지 않는다. 반대로 build처럼 슬래시 없이 쓰면 같은 이름의 파일과 디렉터리 모두에 일치한다.
슬래시가 있으면 위치가 고정된다
끝의 슬래시를 뺀 나머지 부분에 /가 처음이나 중간에 있으면, 그 패턴은 .gitignore 파일이 있는 디렉터리를 기준으로 한 경로에만 일치한다. 이것을 흔히 앵커링(anchoring)이라고 부른다. /가 없으면 .gitignore가 있는 곳 아래의 모든 깊이에서 이름이 일치하는 항목을 찾는다.
| 패턴 | 일치 | 일치하지 않음 |
|---|---|---|
debug.log | debug.log, logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/logs/debug.log |
doc/frotz/ | doc/frotz/ 디렉터리 | a/doc/frotz/ |
frotz/ | frotz/, a/frotz/ 디렉터리 | frotz 파일 |
세 번째 줄이 특히 헷갈린다. logs/debug.log는 중간에 슬래시가 있으므로 루트 기준으로 고정되고, 앞에 /를 붙인 것과 같은 뜻이 된다. 모든 깊이의 logs/debug.log를 잡으려면 **/logs/debug.log를 쓴다.
와일드카드: *, ?, [ ]
*는/를 제외한 모든 문자열(빈 문자열 포함)에 일치한다.*.log는app.log,a/b/app.log모두에 일치하지만,logs/*.log는logs/app.log에만 일치하고logs/2026/app.log에는 일치하지 않는다.?는/를 제외한 문자 하나에 일치한다.file?.txt는file1.txt에 일치하고file10.txt에는 일치하지 않는다.[a-z]는 범위 안의 문자 하나,[!a-z]또는[^a-z]는 범위 밖의 문자 하나에 일치한다.*.py[cod]는.pyc,.pyo,.pyd를 한 번에 잡는다. 브래킷도/에는 일치하지 않는다.[[:digit:]]같은 POSIX 문자 클래스도 쓸 수 있다.
두 개의 별표 **
**는 슬래시와 붙어 있을 때만 특별한 뜻을 가진다.
| 형태 | 뜻 | 예 |
|---|---|---|
**/foo | 모든 깊이의 foo | foo, a/foo, a/b/foo |
**/logs/debug.log | 모든 깊이의 logs/debug.log | logs/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/**/*.pdf는 docs/manual.pdf와 docs/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 |
이 표는 생성기의 패턴 테스트 탭에 규칙과 경로를 붙여 넣으면 그대로 재현할 수 있다.
참고
- gitignore 공식 문서 (git-scm.com)
- GitHub Docs: Ignoring files
- 확인 기준일: 2026-09-23 (git 2.50.1로 예시 검증)