숏컷 코드
node_modules/
dist/
*.log
.env
!.env.example문법
어떤 ignore 패턴을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 특정 파일 무시 | 파일명 그대로 |
| 특정 확장자 무시 | *.log 같은 와일드카드 |
| 특정 디렉터리 무시 | build/ |
| 하위 전체 디렉터리 패턴 | **/node_modules/ 같은 패턴 |
| 예외적으로 다시 추적 | !important.log |
.gitignore는 인덱스에 추가되지 않도록 미래의 추적을 막는 선언이다
Git이 파일을 "추적"한다는 것은 해당 파일이 인덱스(스테이징 영역)에 등록된 상태를 의미합니다. .gitignore에 패턴을 추가하면 git add . 같은 명령이 해당 파일을 인덱스에 올리지 않도록 Git이 미리 걸러 냅니다. 중요한 점은 이미 인덱스에 등록된 파일에는 효과가 없다는 것입니다. .gitignore를 추가하기 전에 커밋된 파일은 여전히 추적됩니다. 그래서 비밀 파일이 실수로 커밋되면 .gitignore에 추가하는 것만으로는 해결되지 않습니다.
# 이미 추적 중인 파일을 추적 중단하려면
git rm --cached .env # 인덱스에서 제거 (파일은 유지)
git rm --cached -r dist/ # 디렉터리 단위
# 이후 .gitignore에 패턴 추가 + 커밋슬래시와 와일드카드의 위치에 따라 패턴 적용 범위가 달라진다
.gitignore 패턴은 단순한 파일명 매칭이 아닙니다. 슬래시(/)로 시작하면 .gitignore가 위치한 디렉터리를 기준으로 경로를 고정합니다. 슬래시로 끝나면 디렉터리만 매칭합니다. **는 임의 깊이의 하위 경로에 매칭합니다. 이 규칙을 모르면 의도치 않게 하위 디렉터리까지 무시하거나, 반대로 특정 위치의 파일만 무시하고 싶었는데 전체에 적용되는 실수가 생깁니다.
dist/ # 어느 위치의 dist/ 디렉터리든 무시
/dist/ # 루트의 dist/ 만 무시
*.log # 모든 경로의 .log 파일 무시
logs/*.log # logs/ 바로 아래의 .log 파일만 무시
logs/**/*.log # logs/ 하위 모든 경로의 .log 파일 무시느낌표(!) 예외 패턴은 앞선 무시 규칙을 덮어쓰는 화이트리스트다
.gitignore의 패턴은 위에서 아래로 순서대로 적용되며, 나중에 오는 패턴이 앞선 패턴을 덮어씁니다. ! 접두사는 앞서 무시된 파일을 다시 포함시키는 예외 규칙입니다. 예를 들어 .env를 무시하면서 .env.example은 저장소에 포함해 협업자에게 환경 변수 형식을 안내하는 것이 대표적인 패턴입니다. 단, 무시된 디렉터리 안의 파일에는 ! 예외가 동작하지 않으므로, 디렉터리 단위 무시와 파일 단위 예외를 혼합할 때 주의해야 합니다.
.env # .env 파일 무시
!.env.example # .env.example은 예외로 추적
# 주의: 디렉터리를 먼저 무시하면 그 안 파일의 ! 예외는 동작 안 함
logs/ # logs/ 전체 무시
!logs/keep.md # 동작하지 않음패턴 기준
| 상황 | 적합한 선택 |
|---|---|
| 빌드 산출물 전체 무시 | dist/, build/ |
| 모든 로그 파일 무시 | *.log |
| 비밀 파일 무시, 양식 파일은 포함 | .env + !.env.example |
| 이미 커밋된 파일을 추적 중단 | git rm --cached <file> 후 패턴 추가 |
| 실수로 커밋된 비밀 정보 처리 | 히스토리 정리 + 비밀값 교체 (패턴 추가만으로 불충분) |
주의할 점
.gitignore는 미래의 추적만 막습니다. 이미 커밋된 파일은 패턴을 추가해도 자동으로
추적이 중단되지 않으며, git rm --cached로 인덱스에서 직접 제거해야 합니다.
실수로 올라간 비밀 파일(.env, API 키 등)은 이미 push된 히스토리와 clone 사본에 남아 있을 수 있으므로,
패턴 추가만으로 끝내지 말고 비밀값 교체와 필요 시 히스토리 정리(git filter-repo 등)를 함께 검토해야 합니다.
참고 링크
1 sources