빌드 산출물이나 임시 파일이 작업 디렉터리에 잔뜩 쌓여 git status(06장)의 untracked 목록이 지저분해졌을 때, 파일을 하나씩 손으로 지우는 대신 한 번에 정리하는 명령이 git clean이다. 다만 이 명령은 Git 명령 중에서도 특히 위험한 축에 속한다 — 삭제된 파일은 23장의 reset --hard와 마찬가지로 복구할 방법이 사실상 없다.
개요
| |
git clean은 25장의 git restore, 23장의 git reset과 성격이 다르다는 점을 분명히 해야 한다 — 그 명령들은 Git이 추적 중인 파일의 내용을 되돌리지만, git clean은 애초에 한 번도 커밋된 적 없는 파일 자체를 디스크에서 지운다. 즉 Git 객체 저장소 어디에도 그 내용이 백업되어 있지 않다.
기본 개념
-n(dry-run) 없이 -f 옵션만으로 곧바로 git clean -f를 실행하는 습관은 위험하다. 이 명령이 지우는 대상은 04장에서 다룬 untracked 상태의 파일이며, .gitignore(10장)에 등록됐든 아니든 기본적으로는 무시 파일을 제외한 untracked 파일이 대상이 된다. 실행 전 반드시 -n으로 삭제 대상 목록을 확인하는 것이 이 명령을 안전하게 쓰는 유일한 방법이다.
| |
| |
이 출력을 확인한 뒤에만 -f로 바꿔 실제 삭제를 실행한다.
종류/세부
자주 쓰는 옵션 조합
| 옵션 | 대상 범위 |
|---|---|
git clean -f | untracked 파일(기본, .gitignore로 무시된 파일은 제외) |
git clean -fd | untracked 파일 + untracked 디렉터리까지 |
git clean -fx | .gitignore로 무시된 파일까지 포함(빌드 산출물 등) |
git clean -fdx | 위 전부(사실상 저장소를 “방금 clone한 것과 같은 상태"로) |
-d가 없으면 빈 디렉터리나 untracked 파일만 든 디렉터리가 삭제 대상에서 빠질 수 있다. -x는 .gitignore가 존재하는 이유(10장)를 생각하면 신중하게 써야 한다 — 의도적으로 무시해둔 빌드 산출물, IDE 설정, 로컬 환경 파일까지 한 번에 지워질 수 있기 때문이다.
특정 경로만 정리하기
전체가 아니라 특정 디렉터리만 대상으로 좁힐 수도 있다.
| |
대화형 모드
무엇을 지울지 하나씩 확인하며 진행하고 싶다면 대화형 모드를 쓴다.
| |
이 모드는 05장에서 다룬 git add -p의 신중함과 비슷한 접근으로, 전체를 한 번에 지우는 대신 항목별로 선택할 수 있어 -n과 -f의 중간 정도 안전성을 제공한다.
주의사항·함정
-n 없이 -fdx를 습관적으로 실행하는 것은 매우 위험하다: 이 조합은 .gitignore로 무시된 파일까지 포함해 저장소 내 모든 untracked 항목을 지운다. 개인 설정 파일, 아직 커밋하지 않은 실험적 파일, .env 같은 환경 설정까지 한 번에 사라질 수 있으므로, 반드시 -n으로 먼저 확인하는 습관을 들인다.
.gitignore에 등록된 파일이 사라지는 것은 clean의 정상 동작이다: -x 옵션을 켰을 때 사라지는 파일은 버그가 아니라 옵션이 의도한 대로 동작한 것이다. .gitignore에 등록된 파일 중 다시 만들기 번거로운 것(예: 로컬 전용 설정 파일)이 있다면, -x를 쓰기 전에 그 파일들을 별도로 백업해두거나 애초에 -x 없이 실행한다.
서브모듈(37장)이 있는 저장소에서는 동작이 더 복잡해질 수 있다: 서브모듈 디렉터리 내부의 untracked 파일은 기본 git clean의 대상 범위 밖에 있을 수 있으며, 필요하다면 --force 옵션을 두 번 지정(-ff)하거나 서브모듈 안에서 별도로 clean을 실행해야 한다. 이 상세 내용은 37장에서 서브모듈을 다룰 때 참고한다.
![Featured image of post [Git] 30. git clean — 미추적 파일 정리](/post/git/git-clean-command-remove-untracked-files/wordcloud_hu_51746396a0b49f.webp)
![[Git] 28. git reflog — 실수 복구](/post/git/git-reflog-command-recover-lost-commits/wordcloud_hu_67933a4c82ea14b7.webp)
![[Git] 29. git stash — 임시 저장](/post/git/git-stash-command-temporary-storage/wordcloud_hu_57c9490aefdb3cf2.webp)
![[Git] 30. git clean — 미추적 파일 정리](/post/git/git-clean-command-remove-untracked-files/wordcloud_hu_73da61b3df7aabd.webp)
![[Git] 31. git add -p — 부분 스테이징](/post/git/git-add-patch-mode-partial-staging/wordcloud_hu_231bb07daf2dd09e.webp)
![[Git] 32. git blame — 변경 이력 추적](/post/git/git-blame-command-track-line-history/wordcloud_hu_249514842ed0d027.webp)
![[Git] 25. git restore와 git checkout -- <file>](/post/git/git-restore-checkout-file-discard-changes/wordcloud_hu_cd1210130e27a947.webp)
![[Git] 36. Packfile과 git gc](/post/git/packfile-and-git-gc/wordcloud_hu_b3276dfd3f3cb2be.webp)
![[Git] 06. git status — 상태 확인](/post/git/git-status-command-check-working-tree-state/wordcloud_hu_47937000002ad2ce.webp)
![[Git] 09. git log — 히스토리 조회](/post/git/git-log-command-view-history/wordcloud_hu_bc1a6a01030ca9b3.webp)
![[Git] 12. git switch/checkout — 브랜치 전환](/post/git/git-switch-checkout-branch-transition/wordcloud_hu_cfa8ddb8839c8503.webp)