콘텐츠로 이동

T-002. Claude Code & git 명령이 `~/Documents/git/winemine`에서 무한 hang (2026-05-15)

~/Documents/git/winemine에서 claude, claude --dangerously-skip-permissions, git status, git fetch, git fsck, 심지어 filemv까지 무한 hang. 레포를 ~/dev/winemine으로 새로 clone하니 즉시 정상 동작.

진짜 원인은 세 가지가 겹쳐서 발생:

  1. Git object 파일 손상 (.git/objects/08/2c0c3...) → mmap이 무한 대기
  2. 좀비 git 프로세스 30개+ 누적 → IDE가 hang 걸린 git status를 timeout마다 재시도하면서 쌓임
  3. ~/Documents/ 폴더 자체의 파일시스템 응답 지연 → iCloud Drive Documents 동기화 영향 의심 (디스크 자체는 정상)

핵심 교훈: 활성 작업 폴더는 ~/Documents/ 밖에 두자 (~/dev/ 같은 곳).


  • claude 또는 claude --dangerously-skip-permissions 실행 시 무한 로딩, 프롬프트 안 뜸
  • cmux, 기본 터미널 가리지 않고 동일 증상
  • git status도 무한 hang
  • git fetch, git fsck --full도 hang
  • file .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/2c0c3183576b5d2fe03fb410ded5e8cf5eb249

file, 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 cloneDocuments/git/에서 hang, ~/dev/에선 11MiB를 18.60 MiB/s로 즉시 받음
  • mv ~/Documents/git/winemine.broken ~/dev/ → 같은 볼륨인데도 hang
  • diff -rq ~/Documents/git/winemine.broken ~/dev/winemine → hang
  • lsfind 같은 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 또는 다른 시스템이 파일 소유권 만지작거리고 있었던 정황

Terminal window
claude doctor
# → 2.1.142 정상, 업데이트 정상
Terminal window
git status # hang
Terminal window
ls .git/
# → index가 8개! (index 2 ~ index 8) 비정상

복제된 index 삭제:

Terminal window
rm .git/index\ [2-8]

→ 그래도 git status hang.

Terminal window
ps aux | grep -v grep | grep git
# → 30개 이상의 git status 좀비
Terminal window
lsof +D /Users/yejinkim/Documents/git/winemine/.git 2>&1 | head -30
# → .git/objects/08/2c0c3... 파일이 잡혀있음 + .git/index.lock 생성됨

6. sample로 어디서 멈추는지 확인

섹션 제목: “6. sample로 어디서 멈추는지 확인”
Terminal window
git --no-optional-locks status 2>&1 &
GITPID=$!
sleep 3
sample $GITPID 2 2>&1 | head -50
# → xmmap_gently → mmap → __mmap 에서 hang 확정
Terminal window
rm -f .git/index.lock
rm -f .git/objects/08/2c0c3183576b5d2fe03fb410ded5e8cf5eb249
git status
# → fatal: unable to read tree 082c0c... (정상 에러)
Terminal window
git fsck --full # 또 hang
git fetch --all # 또 hang

fsck도 mmap에서 멈춤 → 손상 object가 더 있다는 의미.

Terminal window
cd ~/Documents/git
mv winemine winemine.broken
# Documents/git에서 clone 시도 → hang (Ctrl+C)
# ~/dev/로 이동 후 재시도 → 즉시 성공
cd ~/dev
git clone https://github.com/rocher71/winemine-landing.git winemine
# → 11MiB | 18.60 MiB/s, done.
Terminal window
# 백업 폴더 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
# → 작은 텍스트 파일은 정상적으로 읽힘! 복사 가능
Terminal window
diskutil verifyVolume /
# → File system check exit code is 0, appears to be OK
# → 디스크는 정상. 1분도 안 걸려서 완료.
Terminal window
cd ~/dev/winemine
claude
# → ✅ 정상 실행

Terminal window
# 1. 좀비 git 다 죽이기
killall -9 git
sleep 2
rm -f .git/index.lock
# 2. 손상 object 있는지 확인 (sample로 stack trace 추적)
git --no-optional-locks status 2>&1 &
GITPID=$!
sleep 3
sample $GITPID 2 2>&1 | head -50
kill -9 $GITPID
# 3. xmmap에서 멈추면 손상 object 확정 → nuclear option
cd ~/Documents/git
mv winemine winemine.broken
# 4. ~/dev/ 같은 Documents 밖 경로로 새로 clone
cd ~/dev
git 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 .next
    npm install
  • 한 번 git status가 hang 걸리면 IDE가 무한 재시도하면서 좀비를 양산함
  • 증상 발견 시 즉시 모든 에디터 종료killall -9 git → 그래야 lock이 풀림
  • 90% 이상 차면 파일시스템 작업이 느려지거나 hang 위험
  • 목표: 70% 이하 유지 (적어도 30GB 여유)
  • 큰 캐시들:
    Terminal window
    rm -rf ~/Library/Caches/Google # ~2.5GB
    rm -rf ~/Library/Caches/JetBrains # ~2.1GB
    brew cleanup # ~1.2GB
  • .git/gk/ 폴더가 있으면 GitKraken이 백그라운드에서 메타데이터 쓰는 중
  • 안 쓰면 앱 완전 종료 + rm -rf .git/gk (안전, GUI 캐시일 뿐)

Terminal window
# 좀비 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 3
sample $PID 2 2>&1 | head -50
kill -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 .git
find . -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 deployastro build 단계에서 무한 hang — 디렉토리 rename 후 com.apple.provenance xattr 부여로 인한 Gatekeeper stall. 이번 케이스(T-002)는 그것과는 별개 원인이지만, 같은 “디렉토리 이동 후 파일시스템 묘하게 깨짐” 패턴.

작성일: 2026-05-15 소요 시간: 약 1시간 (Claude와 단계별 진단)