guide

무엇을 무시하고 무엇을 커밋할까

빌드 산출물·의존성·캐시·비밀은 무시하고 lockfile·예시 설정·팀 에디터 설정은 커밋하는 기준, 하위 .gitignore, 빈 디렉터리 유지, 템플릿 합치기 요령을 정리합니다.

좋은 .gitignore는 길이가 아니라 기준으로 판단한다. 기준은 하나다. 저장소를 새로 clone한 사람이 소스와 설정만으로 같은 결과를 다시 만들 수 있는가. 다시 만들 수 있는 것은 무시하고, 다시 만들 수 없거나 결과를 고정하는 것은 커밋한다.

무시할 것

종류이유
빌드 산출물dist/, build/, target/, *.o, *.class소스에서 다시 만든다
의존성 설치 결과node_modules/, vendor/(PHP), .venv/매니페스트와 lockfile로 다시 설치한다
캐시·로그.cache/, .pytest_cache/, *.log, coverage/실행할 때마다 바뀐다
로컬 환경·비밀.env, *.pem, local.properties, *.tfstate사람·환경마다 다르거나 유출되면 안 된다
개인 도구 상태.DS_Store, *.swp, .idea/workspace.xml프로젝트와 무관하다 (전역 gitignore 권장)

커밋할 것

하위 디렉터리에 .gitignore 두기

.gitignore는 루트에만 둘 수 있는 것이 아니다. 하위 디렉터리의 .gitignore는 그 디렉터리를 기준으로 동작하고, 상위 파일보다 우선한다. 모노레포에서 패키지마다 필요한 규칙이 다르다면 패키지 폴더에 따로 두는 것이 읽기 쉽다.

repo/
├── .gitignore          # 공통: .DS_Store, .env, coverage/
├── apps/web/.gitignore # .next/, out/
└── services/api/.gitignore # target/

빈 디렉터리 유지하기

git은 파일만 추적하고 빈 디렉터리는 저장하지 않는다. 로그 폴더처럼 폴더는 있어야 하지만 내용은 무시하려면 폴더 안에 표시 파일을 두고 부정 규칙으로 살린다.

/log/*
!/log/.keep

.keep이나 .gitkeep이라는 이름은 git의 공식 기능이 아니라 관례일 뿐이다. 어떤 이름이든 동작한다. 또 다른 방법으로, 그 폴더 안에 다음 내용의 .gitignore를 두면 자기 자신만 남기고 나머지를 무시한다.

*
!.gitignore

템플릿을 합칠 때

규칙은 짧고 구체적으로

*.json처럼 너무 넓은 규칙은 설정 파일까지 삼킨다. 가능한 한 경로를 좁히고(/dist/), 디렉터리에는 끝 슬래시를 붙여 같은 이름의 파일과 구분한다. 규칙 위에 한 줄 주석으로 이유를 적어 두면 다음 사람이 지워도 되는지 판단할 수 있다.

참고

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