Packfile, gc, 일상 maintenance
Loose object — blob/tree/commit/tag 마다 파일 하나 — 는 단순하지만 규모에선 비싸. Commit 10 만 + blob 수백만인 repo 는 .git/objects/ 에 파일 수백만 개. 파일시스템 성능, listing 속도, remote 전송 overhead 다 무너짐. Git 의 답은 packfile: 많은 object 를 압축 + 연결해 .pack 파일 하나 + 동반 .idx index. Pack 된 object 의 연산은 빠르고, 전송은 극적으로 작아.
git gc ('garbage collect') 가 loose object pack, 도달 불가능한 거 제거, index 재구축. Modern Git 은 임계 넘으면 (loose 200, pack 7000 등) 자동으로 gc --auto 실행. 대부분 repo 엔 충분. 장기 공유 repo 엔 주기적 git gc --aggressive 가 더 철저히 pack 재구성, CPU 비용 더 듦. 서버 mirror 나 비업무 시간에 — 업무 중간 아니라.
'도달 불가능' 이 핵심 개념. Ref (HEAD, branch, tag, reflog entry, stash) 에서 도달 가능한 object 는 살아남. 다른 ref 가 도달 못 하는 object 가 GC 후보. Reflog 가 90 일 안전망 — orphaned commit 도 reflog entry 통해 TTL 만료까지 도달 가능. git gc --prune=now 가 안전망 우회 + 즉시 도달 불가능 object 제거, 민감 콘텐츠 진짜 사라지길 원할 때 유용 (history rewrite 용 git filter-repo 와 짝).
일상 maintenance 명령. git fsck 가 object 무결성 검증. git count-objects -v 가 loose vs packed 카운트와 디스크 크기 표시. git maintenance start (Git 2.30+) 가 background task (gc, pack-refs, commit-graph, prefetch) 등록 — 명시적 cron 없이 repo 최적화 유지. Modern Git 은 commit-graph 파일 도 써 — 조상 query (git log --graph, git merge-base) 가속. git config core.commitGraph true 로 활성화, git commit-graph write 로 갱신.