본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

Packfile, GC, repo maintenance

~18 min · gc, maintenance

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Packfile과 gc가 큰 object store를 유지해

blob, tree, commit, tag마다 파일 하나를 두는 loose object는 단순하지만 규모가 커지면 비싸. commit이 10만 개이고 blob이 수백만 개인 repo는 .git/objects/에 파일 수백만 개를 만들어 filesystem과 listing, remote 전송에 부담을 줘. Git은 많은 object를 압축하고 연결한 .pack file과 동반 .idx index로 해결해. Pack된 object는 빠르게 다룰 수 있고 전송량도 크게 줄어.

git gc, 곧 garbage collect는 loose object를 pack하고 도달할 수 없는 것을 제거하며 index를 다시 만들어. 현대 Git은 loose object 200개, pack 7000개 같은 임계값을 넘으면 gc --auto를 실행하고 대부분 repo에는 그것으로 충분해. 오래된 공유 repo에서 git gc --aggressive로 pack을 더 철저히 다시 만들 수 있지만 CPU 비용이 크므로 server mirror나 비업무 시간에 실행해.

핵심은 도달 가능성이야. HEAD, branch, tag, reflog entry, stash 같은 ref에서 닿을 수 있는 object는 살아남고 어디에서도 닿지 않는 object가 GC 후보가 돼. Reflog는 90일짜리 안전망이라 orphaned commit도 entry가 만료될 때까지 닿을 수 있어. git gc --prune=now는 그 안전망을 건너뛰고 도달 불가능한 object를 즉시 없애므로, git filter-repo로 민감한 내용을 다시 쓴 뒤 진짜 제거할 때 쓸 수 있어.

git fsck는 object 무결성을 검사하고 git count-objects -v는 loose와 packed 수, disk 크기를 보여줘. Git 2.30+의 git maintenance start는 gc, pack-refs, commit-graph, prefetch 같은 background task를 등록해 별도 cron 없이 repo를 관리해. commit-graph filegit log --graphgit merge-base 같은 조상 query를 빠르게 하며 git config core.commitGraph true로 켜고 git commit-graph write로 갱신할 수 있어.

Code

Repo 건강 + pack 상태 검사·bash
# Loose vs packed 카운트 + 총 크기:
git count-objects -vH

# 무결성 검증 (느리지만 철저):
git fsck --full

# 뭔가 이상할 때 수동 gc:
git gc

# 더 공격적 repack — 서버사이드 / 비업무 시간:
git gc --aggressive --prune=now

# Modern background maintenance (Git 2.30+):
git maintenance start            # gc, pack-refs, commit-graph 등록
git maintenance run              # 1회 실행
git maintenance unregister       # 끄기
Pack + commit-graph 세부·bash
# 모두 수동 repack:
git repack -ad

# Packfile 세부 표시:
ls -lh .git/objects/pack/
git verify-pack -v .git/objects/pack/*.idx | tail -20

# Commit-graph 가 history query 가속:
git config core.commitGraph true
git config gc.writeCommitGraph true

# Commit-graph 빌드 / 갱신:
git commit-graph write --reachable

External links

Exercise

실제 repo에서 git count-objects -vH를 실행해 loose와 packed 수를 읽고 git gc 뒤 다시 확인해. git config core.commitGraph truegit commit-graph write --reachable로 commit-graph를 켠 뒤 조금 큰 repo에서 전후 git log --graph --all | head -5000 시간을 재. 차이가 예상과 맞았는지 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.