본문 바로가기
빌드노트 검색

빌드노트

git clean 미리보기에 빌드 찌꺼기가 안 나오는 이유

git clean -n에서 빠진 빌드 파일을 추적 여부와 ignore 여부로 구분한다. 삭제 없는 네 미리보기를 실제 비교해 -d·-x·-X의 후보 차이와 개인 설정까지 포함될 수 있는 범위를 확인한다.

git clean -n을 실행했는데 build/나 캐시 파일이 목록에 없다면, 먼저 ignore 여부를 확인한다. 기본 clean은 ignored 파일을 정리 후보에서 제외한다. 경로를 따로 지정하지 않았을 때 아직 추적하지 않는 디렉터리 안까지 보려면 -d도 필요하다. -n은 삭제하지 않고 후보만 보여 주는 옵션이다. git clean 공식 문서 (새 탭에서 열림)

목록에 없는 파일이 추적 중인지, 무시됐는지 확인한다

Git이 설치된 터미널에서 확인할 저장소의 루트로 이동한다. 아래 두 명령은 파일을 삭제하지 않는다. 첫 명령은 무시된 파일까지 상태를 보여 주고, 두 번째는 지정한 경로 중 추적 중인 파일을 찾는다. 파일명은 자신의 출력물과 보관할 파일 경로로 바꾼다.

git status --short --ignored --untracked-files=all
git ls-files -- tracked.txt build/output.txt cache.tmp .env.local notes/draft.txt scratch.txt

별도로 만든 새 저장소에서 합성 파일로 확인했다. .gitignore, tracked.txt, src/kept.txt를 먼저 커밋하고 tracked.txt를 수정했다. scratch.txt와 notes/draft.txt는 아직 추가하지 않은 파일이다. 루트 .gitignore에는 /build/, /cache.tmp, /.env.local을 각각 한 줄씩 넣었다. build/output.txt, cache.tmp, .env.local도 실제로 만들었으며, 설정 파일의 내용은 실습용 가짜 값이다.

첫 명령의 실제 출력은 다음과 같았다.

 M tracked.txt
?? notes/draft.txt
?? scratch.txt
!! .env.local
!! build/output.txt
!! cache.tmp

??는 추적하지 않는 파일, !!는 ignore 규칙으로 무시된 파일이다. --ignored가 없으면 ignored 항목은 상태 목록에서도 빠진다. --untracked-files=all은 디렉터리 이름으로 묶는 대신 내부 파일까지 보여 준다. status의 표시 옵션과 상태 코드 (새 탭에서 열림)

두 번째 명령은 tracked.txt만 출력했다. ls-files의 기본 조회 대상은 인덱스, 즉 Git의 추적 목록이다. 첫 줄의 M은 이 추적 파일에 스테이징하지 않은 수정이 있다는 뜻이다. 변경 없는 .gitignore와 src/kept.txt는 첫 상태 출력에 나오지 않았다. 상태 목록에 안 보인다는 사실만으로 ignored라고 판단할 수는 없다. ls-files의 기본 조회 범위 (새 탭에서 열림)

무시된 이유를 찾을 때는 실제 파일 경로로 적용된 규칙을 조회한다.

git check-ignore -v -- build/output.txt cache.tmp .env.local

이 실험에서는 다음 세 줄이 나왔다. 순서대로 규칙 파일, 줄 번호, 패턴, 조회한 경로다. 다른 제외 파일이 표시되면 그 파일의 해당 줄을 확인한다. 패턴이 !로 시작하면 제외가 아니라 예외 규칙에 맞았다는 뜻이므로, 출력 유무만 보지 말고 패턴을 읽는다. check-ignore의 verbose 출력 (새 탭에서 열림)

.gitignore:1:/build/	build/output.txt
.gitignore:2:/cache.tmp	cache.tmp
.gitignore:3:/.env.local	.env.local

-d를 붙여도 ignored 항목은 계속 빠진다

같은 파일 상태에서 다음 네 명령을 차례로 실행했다. 네 명령 모두 -n을 유지하므로 삭제하지 않는다. 아래 비교는 저장소 루트에서 경로 인자 없이 실행한 결과다.

git clean -n
git clean -nd
git clean -ndx
git clean -ndX

각 명령의 실제 출력은 다음과 같았다.

[git clean -n]
Would remove scratch.txt

[git clean -nd]
Would remove notes/
Would remove scratch.txt

[git clean -ndx]
Would remove .env.local
Would remove build/
Would remove cache.tmp
Would remove notes/
Would remove scratch.txt

[git clean -ndX]
Would remove .env.local
Would remove build/
Would remove cache.tmp

대괄호 줄은 출력을 구분하려고 붙인 명령 이름이다. Would remove로 시작하는 줄이 Git의 출력이다. notes/는 그 안의 draft.txt를 포함한 디렉터리 후보로 표시됐다.

-n과 -nd의 차이는 아직 추적하지 않는 디렉터리를 포함했는지다. notes/는 -d를 붙이자 나타났지만, ignored인 build/와 cache.tmp는 계속 빠졌다. 빌드 폴더가 안 보인다는 이유로 -d만 더해도 해결되지 않는 경우다.

소문자 -x를 붙인 -ndx는 일반 untracked 항목과 ignored 항목을 함께 표시했다. 대문자 -X를 붙인 -ndX는 ignored 항목만 표시해서 scratch.txt와 notes/가 빠졌다. 두 옵션은 후보의 범위를 다르게 고른다. -x에도 명령줄의 -e 제외 규칙은 적용되지만 이번 비교에는 -e를 쓰지 않았다. clean의 -d·-x·-X 설명 (새 탭에서 열림)

수정한 tracked.txt는 네 목록 모두에 없었다. -x가 ignore 규칙을 건너뛴다고 추적 파일까지 후보로 바꾸지는 않는다. 이번 실험에서 전후 파일 8개의 내용 해시와 디렉터리 목록도 같았다.

ignored만 골라도 빌드 파일만 골라지는 것은 아니다

이 비교에서 -ndX에는 캐시와 빌드 폴더뿐 아니라 .env.local도 나왔다. -X는 이름이나 내용으로 재생성 가능한 파일을 알아보는 옵션이 아니다. ignore 규칙에 맞는 파일을 고르므로, 개인 설정이나 다시 구할 수 없는 파일도 포함될 수 있다.

일반 새 파일과 새 디렉터리의 후보를 보려면 -nd, ignored 항목도 합쳐 보려면 -ndx, ignored 항목만 따로 보려면 -ndX로 목록을 비교한다. 필요한 파일이 섞여 있으면 별도로 보관하고 제외 규칙과 경로를 다시 확인한다. 미리보기에 원하는 출력물이 나타났다는 이유만으로 -n을 빼거나 force 옵션을 붙이지 않는다.

한 번도 Git에 추가하거나 커밋하지 않은 새 파일에는 Git이 저장해 둔 내용이 없다. 삭제 후 restore나 reflog로 되찾을 수 있다고 기대하면 안 된다. 예전에 같은 경로를 커밋했어도 지금 새로 만든 파일의 내용이 보존됐다는 뜻은 아니다. Pro Git의 미커밋 내용 복구 한계 (새 탭에서 열림)

직접 확인한 환경은 Windows 11, Git 2.45.1.windows.1, PowerShell 7.6.6이다. 실험에서는 사용자 전역 제외 규칙을 배제하고 루트 .gitignore만 사용했다. 중첩 Git 저장소, 서브모듈, 심볼릭 링크, 경로 인자로 범위를 좁힌 경우는 시험하지 않았다. 실제 삭제와 삭제 후 복구도 실행하지 않았으며, 여기서 확인한 것은 네 dry-run이 선택한 후보의 차이다.

← 전체 글 보기