T-002. Claude Code & git 명령이 `~/Documents/git/winemine`에서 무한 hang (2026-05-15)
TL;DR
섹션 제목: “TL;DR”~/Documents/git/winemine에서 claude, claude --dangerously-skip-permissions, git status, git fetch, git fsck, 심지어 file과 mv까지 무한 hang. 레포를 ~/dev/winemine으로 새로 clone하니 즉시 정상 동작.
진짜 원인은 세 가지가 겹쳐서 발생:
- Git object 파일 손상 (
.git/objects/08/2c0c3...) → mmap이 무한 대기 - 좀비 git 프로세스 30개+ 누적 → IDE가 hang 걸린
git status를 timeout마다 재시도하면서 쌓임 ~/Documents/폴더 자체의 파일시스템 응답 지연 → iCloud Drive Documents 동기화 영향 의심 (디스크 자체는 정상)
핵심 교훈: 활성 작업 폴더는 ~/Documents/ 밖에 두자 (~/dev/ 같은 곳).
claude또는claude --dangerously-skip-permissions실행 시 무한 로딩, 프롬프트 안 뜸cmux, 기본 터미널 가리지 않고 동일 증상git status도 무한 hanggit fetch,git fsck --full도 hangfile .git/objects/<sha>같은 단순 명령조차 hang- Finder에서
Documents/git/안의 폴더 이동도 hang (“Preparing to move…” 상태로 멈춤) mv명령도 hang- 다른 디렉토리(
~/dev/)에선 같은 명령들이 즉시 정상 동작 - 환경: macOS 26.4.1 (25E253), Claude Code 2.1.142, ARM64 (M1/M2)
원인 분석
섹션 제목: “원인 분석”직접 원인: Git object 파일 손상 + mmap 무한 대기
섹션 제목: “직접 원인: Git object 파일 손상 + mmap 무한 대기”git status의 stack trace를 sample 명령으로 추적한 결과:
cmd_status wt_status_collect run_diff_index diff_cache unpack_trees traverse_trees unpack_callback fill_tree_descriptor read_object_with_reference read_object_file_extended oid_object_info_extended do_oid_object_info_extended map_loose_object_1 xmmap mmap (in libsystem_kernel.dylib) __mmap ← 여기서 영원히 멈춤git이 .git/objects/08/2c0c3183576b5d2fe03fb410ded5e8cf5eb249 파일을 mmap()으로 메모리 매핑하려다 OS 응답을 못 받음.
lsof로도 동일한 파일이 잡혀 있는 게 확인됨:
git 1910 yejinkim 4r REG 1,17 256 176633205 /Users/yejinkim/Documents/git/winemine/.git/objects/08/2c0c3183576b5d2fe03fb410ded5e8cf5eb249file, cat 같은 단순 명령도 같은 파일에서 hang 걸렸음. 즉 OS 파일시스템 레벨에서 이 inode가 응답 불가 상태.
손상된 object를 rm으로 삭제하니 (unlink는 내용 안 읽음) git이 즉시 응답함:
fatal: unable to read tree 082c0c3183576b5d2fe03fb410ded5e8cf5eb249→ 손상은 한 파일만이 아니었음. git fsck --full도 다른 object에서 또 mmap hang.
2차 원인: 좀비 git 프로세스 누적
섹션 제목: “2차 원인: 좀비 git 프로세스 누적”ps aux | grep git 결과 30개 이상의 좀비 git status 프로세스가 떠 있었음:
git -C /Users/yejinkim/Documents/git/winemine status --porcelain -uno (x12)git -C /Users/yejinkim/Documents/git/winemine-keyscreen status ... (x8)/opt/homebrew/bin/git status -z -uall (x3)/opt/homebrew/bin/git fetch (x3)...IDE/에디터(VS Code, Cursor, Cmux 등)의 git integration이 hang 걸린 git status를 timeout마다 재시도하면서 누적됨. 이 좀비들이 .git/index에 lock을 잡고 있어서 새 git 명령도 즉시 hang.
3차 원인: ~/Documents/ 폴더의 파일시스템 응답 지연
섹션 제목: “3차 원인: ~/Documents/ 폴더의 파일시스템 응답 지연”이게 가장 미스터리한 부분. 같은 명령이 ~/Documents/git/에선 hang, ~/dev/에선 정상:
git clone→Documents/git/에서 hang,~/dev/에선 11MiB를 18.60 MiB/s로 즉시 받음mv ~/Documents/git/winemine.broken ~/dev/→ 같은 볼륨인데도 hangdiff -rq ~/Documents/git/winemine.broken ~/dev/winemine→ hangls나find같은 metadata 작업은 정상
원인 추정:
- iCloud Drive의 “Desktop & Documents in iCloud Drive” 동기화 영향 (
brctl status .git은 깨끗했지만, 부모 디렉토리Documents/레벨에서 영향 가능성) - 디스크 90% 사용 중인 상태도 악화 요인
- 디스크 자체는 정상 (
diskutil verifyVolume /→ exit code 0, “appears to be OK”)
부차적 발견
섹션 제목: “부차적 발견”.git/index파일이 8개까지 복제되어 있었음 (index 2,index 3, …,index 8)- 추정: Finder/iCloud가 동기화 충돌로 사본을 만든 것
.git/gk/폴더 발견 → GitKraken이 백그라운드 메타데이터 갱신 중 (앱이 안 떠 있어도 데몬이 깨어남)sudo xattr했을 때.git/objects/파일들에서 Permission denied 줄줄이 → iCloud 또는 다른 시스템이 파일 소유권 만지작거리고 있었던 정황
진단 과정 (시간순)
섹션 제목: “진단 과정 (시간순)”1. Claude Code 진단
섹션 제목: “1. Claude Code 진단”claude doctor# → 2.1.142 정상, 업데이트 정상2. git status도 hang 발견
섹션 제목: “2. git status도 hang 발견”git status # hang3. .git 폴더 검사
섹션 제목: “3. .git 폴더 검사”ls .git/# → index가 8개! (index 2 ~ index 8) 비정상복제된 index 삭제:
rm .git/index\ [2-8]→ 그래도 git status hang.
4. 좀비 프로세스 발견
섹션 제목: “4. 좀비 프로세스 발견”ps aux | grep -v grep | grep git# → 30개 이상의 git status 좀비5. lsof로 파일 핸들 추적
섹션 제목: “5. lsof로 파일 핸들 추적”lsof +D /Users/yejinkim/Documents/git/winemine/.git 2>&1 | head -30# → .git/objects/08/2c0c3... 파일이 잡혀있음 + .git/index.lock 생성됨6. sample로 어디서 멈추는지 확인
섹션 제목: “6. sample로 어디서 멈추는지 확인”git --no-optional-locks status 2>&1 &GITPID=$!sleep 3sample $GITPID 2 2>&1 | head -50# → xmmap_gently → mmap → __mmap 에서 hang 확정7. 손상 object 격리
섹션 제목: “7. 손상 object 격리”rm -f .git/index.lockrm -f .git/objects/08/2c0c3183576b5d2fe03fb410ded5e8cf5eb249git status# → fatal: unable to read tree 082c0c... (정상 에러)8. 다른 object도 손상 발견
섹션 제목: “8. 다른 object도 손상 발견”git fsck --full # 또 hanggit fetch --all # 또 hangfsck도 mmap에서 멈춤 → 손상 object가 더 있다는 의미.
9. Nuclear option: 새 위치로 clone
섹션 제목: “9. Nuclear option: 새 위치로 clone”cd ~/Documents/gitmv winemine winemine.broken
# Documents/git에서 clone 시도 → hang (Ctrl+C)# ~/dev/로 이동 후 재시도 → 즉시 성공cd ~/devgit clone https://github.com/rocher71/winemine-landing.git winemine# → 11MiB | 18.60 MiB/s, done.10. 백업에서 변경사항 살리기
섹션 제목: “10. 백업에서 변경사항 살리기”# 백업 폴더 ls는 정상 → 백업 자체는 살아있음ls ~/Documents/git/winemine.broken/
# 최근 수정 파일 확인 (find는 metadata만 봐서 hang 안 걸림)find ~/Documents/git/winemine.broken -type f \ ! -path '*/node_modules/*' ! -path '*/.git/*' ! -path '*/.next/*' \ -mtime -7 2>/dev/null | head -30
# mv도 hang → 파일별로 cat으로 읽기cat ~/Documents/git/winemine.broken/.env.local# → 작은 텍스트 파일은 정상적으로 읽힘! 복사 가능11. 디스크 검사
섹션 제목: “11. 디스크 검사”diskutil verifyVolume /# → File system check exit code is 0, appears to be OK# → 디스크는 정상. 1분도 안 걸려서 완료.12. 최종 확인
섹션 제목: “12. 최종 확인”cd ~/dev/winemineclaude# → ✅ 정상 실행1줄 해결 (요약본)
섹션 제목: “1줄 해결 (요약본)”# 1. 좀비 git 다 죽이기killall -9 gitsleep 2rm -f .git/index.lock
# 2. 손상 object 있는지 확인 (sample로 stack trace 추적)git --no-optional-locks status 2>&1 &GITPID=$!sleep 3sample $GITPID 2 2>&1 | head -50kill -9 $GITPID
# 3. xmmap에서 멈추면 손상 object 확정 → nuclear optioncd ~/Documents/gitmv winemine winemine.broken
# 4. ~/dev/ 같은 Documents 밖 경로로 새로 clonecd ~/devgit clone <repo-url> winemine
# 5. 백업에서 uncommitted 파일 cat으로 읽어서 복사cat ~/Documents/git/winemine.broken/.env.local# → 출력 내용을 새 위치에 복붙작업 폴더 정책
섹션 제목: “작업 폴더 정책”- 새 repo는
~/dev/에 둔다 (또는~/Documents/밖 다른 경로) - 기존
~/Documents/git/안의 활성 repo도 점진적으로 이동 - 이동 시 T-001 트러블슈팅 노트 그대로 적용:
Terminal window xattr -dr com.apple.provenance .rm -rf node_modules .nextnpm install
IDE/에디터 git integration
섹션 제목: “IDE/에디터 git integration”- 한 번
git status가 hang 걸리면 IDE가 무한 재시도하면서 좀비를 양산함 - 증상 발견 시 즉시 모든 에디터 종료 후
killall -9 git→ 그래야 lock이 풀림
디스크 관리
섹션 제목: “디스크 관리”- 90% 이상 차면 파일시스템 작업이 느려지거나 hang 위험
- 목표: 70% 이하 유지 (적어도 30GB 여유)
- 큰 캐시들:
Terminal window rm -rf ~/Library/Caches/Google # ~2.5GBrm -rf ~/Library/Caches/JetBrains # ~2.1GBbrew cleanup # ~1.2GB
GitKraken
섹션 제목: “GitKraken”.git/gk/폴더가 있으면 GitKraken이 백그라운드에서 메타데이터 쓰는 중- 안 쓰면 앱 완전 종료 +
rm -rf .git/gk(안전, GUI 캐시일 뿐)
유용한 진단 명령어 모음
섹션 제목: “유용한 진단 명령어 모음”# 좀비 git 프로세스 확인ps aux | grep -v grep | grep git
# 좀비 일괄 정리killall -9 git
# 어떤 프로세스가 .git을 잡고 있는지lsof +D <path>/.git 2>&1 | head -30
# hang 걸린 프로세스의 stack trace (어디서 멈췄나)<command> &PID=$!sleep 3sample $PID 2 2>&1 | head -50kill -9 $PID
# 손상 후보 object 찾기 (metadata만 봐서 hang 안 걸림)find .git/objects -type f ! -path '*/pack/*' \( -size 0 -o ! -readable \) 2>/dev/null
# .git config 확인cat .git/config
# iCloud 동기화 상태brctl status .gitfind . -name "*.icloud" 2>/dev/null | head
# xattr 확인 (sudo 필요 — .git/objects는 권한 제한됨)sudo xattr -lr . 2>/dev/null | grep -E 'provenance|quarantine' | head -10
# 디스크 검사diskutil verifyVolume /
# 디스크 용량df -h ~du -sh ~/Library/Caches/* 2>/dev/null | sort -h | tail새 위치(~/dev/winemine)에서:
- ✅
git status즉시 응답 - ✅
git fetch --all정상 - ✅
claude정상 실행 - ✅
~/Documents/git/winemine.broken폴더도 디스크 정리 후 정상 삭제됨
관련 노트
섹션 제목: “관련 노트”- T-001:
npm run deploy가astro build단계에서 무한 hang — 디렉토리 rename 후com.apple.provenancexattr 부여로 인한 Gatekeeper stall. 이번 케이스(T-002)는 그것과는 별개 원인이지만, 같은 “디렉토리 이동 후 파일시스템 묘하게 깨짐” 패턴.
작성일: 2026-05-15 소요 시간: 약 1시간 (Claude와 단계별 진단)