.gitignore에 넣었는데 계속 추적되는 파일은 이미 Git 인덱스에 등록됐는지 먼저 확인한다. 이미 추적 중이면 .gitignore만 고쳐서는 빠지지 않는다. 로컬 파일은 남기고 추적만 끄려면 git rm --cached .env를 실행한 뒤 .gitignore와 제거 상태를 함께 커밋한다.

가장 짧은 해결 순서는 네 단계다.
git rev-parse --show-toplevel로 저장소 루트를 확인하고 그 폴더로 이동한다.git ls-files --error-unmatch .env로 추적 여부를 확인한다.git rm --cached .env로 인덱스에서만 제거한다.git diff --cached --name-status로 범위를 확인한 뒤.gitignore와 함께 커밋한다.
목차
1. 이미 추적 중인지 확인한다
프로젝트 폴더의 터미널에서 먼저 저장소 루트를 확인한다.
git rev-parse --show-toplevel
출력된 경로가 현재 프로젝트 폴더와 다르면 그 경로로 이동한 뒤 아래 명령을 실행한다. 저장소가 아니라는 오류가 나오면 Git 저장소로 만든 프로젝트 폴더를 다시 연다.
git ls-files --error-unmatch .env
결과에 .env가 나오면 Git 인덱스에 들어 있는 상태다. 파일을 찾지 못했다는 오류가 나오면 추적 중이 아닐 수 있으므로 무시 규칙부터 확인한다.
git check-ignore -v .env
정상적으로 무시되는 파일이면 어떤 .gitignore의 몇 번째 줄이 적용됐는지 나온다. 출력이 없으면 경로·규칙 오타 또는 이미 추적 중인 상태를 구분해야 한다.
2. 로컬 파일은 남기고 추적만 해제한다
git rm --cached .env
--cached는 작업 폴더의 .env를 지우는 선택이 아니다. Git 인덱스에서 해당 경로를 제거한다. 비민감 테스트 저장소에서 실행했을 때 명령은 rm '.env'를 출력했지만, 바로 뒤의 파일 확인은 local-file-kept를 출력했다.
이어서 상태를 확인한다.
git status --short
git check-ignore -v .env
직접 재현에서는 git status --short에 .env 삭제가 다음 커밋 대상으로 표시됐고, git check-ignore -v .env에는 .gitignore:1:.env가 나왔다. 여기서 삭제 표시는 저장소의 다음 버전에서 추적을 끝낸다는 뜻이며 로컬 파일 삭제 결과가 아니었다.
3. .gitignore와 추적 해제를 함께 커밋한다
git add .gitignore
git diff --cached --name-status
git diff --cached --name-status로 .env가 저장소에서 제거되고 .gitignore가 추가되는지 먼저 확인한다. 예상한 두 경로 외의 변경이 있으면 커밋하지 않고 원인을 확인한다. 범위가 맞으면 커밋한다.
git commit -m "Stop tracking local env file"
실제 .env 내용이나 비밀값은 화면·로그·커밋 메시지에 복사하지 않는다.
이미 원격에 비밀키를 올렸다면
추적 해제는 다음 커밋부터 파일을 제외하는 조치다. 과거 커밋의 값이나 이미 복제된 비밀을 무효화하지 않는다. 실제 API 키·토큰·비밀번호가 원격에 올라갔다면 해당 서비스에서 키를 폐기하고 새 키를 발급하는 일을 먼저 한다. 이력 정리는 저장소 공유 상태와 호스팅 정책을 확인한 뒤 별도로 진행한다.
오류별 다음 행동
pathspec '.env' did not match any files
현재 폴더가 저장소 루트인지 pwd와 git rev-parse --show-toplevel로 확인한다. 파일명이 .env.local처럼 다른지도 git status --short로 확인한다.
git check-ignore가 아무것도 출력하지 않는다
.gitignore의 경로를 실제 파일 경로에 맞춘다. 하위 폴더라면 예를 들어 app/.env처럼 적거나 프로젝트 전체의 같은 이름을 막으려면 적절한 패턴을 사용한다. 먼저 git ls-files 결과로 이미 추적 중인지도 다시 확인한다.
여러 파일이 이미 추적 중이다
처음부터 git rm -r --cached .를 실행하면 변경 범위가 커진다. 초보자는 대상 파일을 하나씩 지정하고 git diff --cached --name-status로 확인하는 편이 안전하다.
확인 범위
이 글은 Git 공식 문서와 로컬 비민감 저장소 재현으로 아래 범위를 확인했다.
- 직접 확인: 로컬 비민감 Git 저장소에서 커밋된
.env, 뒤늦은.gitignore,git rm --cached, 로컬 파일 유지, ignore 규칙 적용 - 공식 자료: Git gitignore 문서, Git git-rm 문서
- 미확인: 실제 비밀 유출, 원격 호스팅의 탐지 화면, 과거 이력 정리 결과
자주 묻는 질문
git rm --cached .env를 실행하면 내 컴퓨터의 .env도 지워지나?
아니다. --cached를 붙이면 Git 인덱스에서만 제거하고 작업 폴더의 파일은 남긴다. 실행 뒤 test -f .env && echo "local-file-kept"처럼 파일 존재를 확인하고, git diff --cached --name-status로 다음 커밋에서 저장소 경로가 제거되는지 따로 확인한다.
.gitignore에 추가했는데 git status에 삭제로 나오는 이유는?
이미 추적하던 파일을 인덱스에서 제거했기 때문이다. 다음 커밋에서 저장소 버전의 추적을 끝낸다는 표시이며, 로컬 파일이 사라졌다는 뜻은 아니다.
이미 원격 저장소에 올라간 비밀값도 이 명령으로 안전해지나?
아니다. git rm --cached는 다음 커밋부터 추적을 멈춘다. 노출된 키나 토큰은 해당 서비스에서 폐기하고 새 값으로 교체해야 한다.
GitHub에 처음 저장소를 연결하는 단계부터 다시 확인해야 한다면 바이브코딩 GitHub 연결 가이드를 이어서 본다. 연습할 비민감 프로젝트가 없다면 바이브코딩 첫 프로젝트에서 별도 폴더를 만드는 단계부터 시작한다.
검증 기준
- 마지막 업데이트일: 2026-09-18
- 확인 환경: macOS 로컬 비민감 Git 저장소, 명령줄 Git.
- 주요 근거: Git gitignore 공식 문서, Git git-rm 공식 문서
- 통과 기준: 로컬
.env가 남고, Git 인덱스에서는 제거되며,.gitignore규칙이 적용되는 상태를 각각 별도 명령으로 확인
직접 만든 실습 자료와 새 도구 소식
AI 도구로 만든 실습 자료, 달라진 기능과 강의 소식을 준비하고 있습니다. 발송을 시작하면 안내해 드려요. 먼저 확인 메일에서 본인 이메일을 확인해 주세요.
신청하기 전에 첫 소식 미리보기에서 내용과 자료를 확인해 보세요.