나는 Git을 Zig로 재구축해 AI 에이전트의 토큰을 71% 절감했습니다
Source: Dev.to
소개
AI 에이전트는 상태 확인, 차이(diff), 로그, 그리고 show 작업을 위해 Git을 지속적으로 호출합니다. 3 156개의 실제 코딩 세션을 분석한 결과, Git은 459 000 토큰에 달하는 출력을 차지했으며, 이는 **전체 셸 명령의 7.4 %**에 해당합니다(코덱의 경우 10 % 이상). Git의 출력은 사람을 위해 설계되었습니다: 상세한 헤더, 안내 문구, 열 정렬, 장식용 포맷 등. 머신에게는 이러한 “선물 포장”이 불필요한 토큰을 늘려 비용과 지연을 증가시킵니다.
토큰 절감
저는 Zig로 작성된 네이티브 Git 대체 구현 nit를 만들었습니다. nit은 libgit2를 직접 사용해 Git 객체 데이터베이스와 통신합니다. 기본 설정이 머신에 맞게 조정돼 토큰 사용량을 크게 줄입니다.
| 명령어 | Git 토큰 | nit 토큰 | 절감율 |
|---|---|---|---|
status | ~125 | ~36 | 71 % |
log -20 | ~2 273 | ~301 | 87 % |
diff | ~1 016 | ~657 | 35 % |
show --stat | ~260 | ~118 | 55 % |
실제 세션 데이터 전체에 걸쳐, nit의 압축된 기본값은 150 – 250 K 토큰을 절감할 수 있습니다.
성능 벤치마크
hyperfine(실제 저장소에서 100회 실행) 사용 결과:
| 명령어 | Git | nit | 속도 향상 |
|---|---|---|---|
status | 13.7 ms | 8.4 ms | 1.64× |
diff | 14.3 ms | 9.9 ms | 1.44× |
show | 10.2 ms | 7.3 ms | 1.39× |
구현 세부 사항
- Zig의 C 인터옵은 비용이 없습니다:
@cImport로 libgit2 헤더를 가져와 함수를 직접 호출합니다—서브프로세스 오버헤드나 텍스트 파싱이 없습니다. - 아직 최적화되지 않은 명령에 대해서는 nit이
execvpe()를 통해 Git을 호출합니다. 이때 nit 프로세스 자체가 완전히 교체됩니다. 따라서git=nit별칭을 사용해도 안전하며, 네이티브 부분이 성장함에 따라 기능이 그대로 유지됩니다.
Diff 컨텍스트 감소
가장 논란이 된 설계 선택은 기본 diff 컨텍스트를 3줄(Git 기본값)에서 1줄로 줄인 것입니다. 추가 컨텍스트 줄은 많은 토큰을 차지합니다. 영향을 평가하기 위해 27개의 멀티 파일 diff, 중첩 제어 흐름, 코드 이동, 모호한 블록을 포함한 실험을 수행했습니다. Claude는 U0, U1, U3 모두에서 4/4 점수를 받아 이해도 손실이 없음을 확인했습니다.
Claude Code 세션에서 561개의 git diff/show 호출을 분석한 실제 데이터에 따르면, diff 후 바로 소스 파일을 읽는 에이전트는 **3.9 %**에 불과했습니다. 이는 diff 자체가 주요 컨텍스트 소스임을 의미합니다. 따라서 U1 모드(1줄 컨텍스트)는 토큰을 절감하면서도 유용성을 해치지 않습니다; hunk 헤더는 여전히 라인 번호를 제공합니다.
모드
| 모드 | 설명 |
|---|---|
| Compact (기본) | 머신 최적화, 최소 데이터 제공. |
Human (-H) | 색상과 그룹화된 출력으로 인간이 읽기 편하도록. |
호환성
Git은 수십 년에 걸친 역사를 가지고 있어 다양한 엣지 케이스(분리된 HEAD, 병합 커밋, 파일 이름 변경, 바이너리 diff, 서브모듈 등)가 존재합니다. 저는 이러한 시나리오를 포괄하는 78개의 호환성 테스트를 작성했습니다. nit의 출력이 Git과 의미 있게 달라지는 경우마다 테스트를 추가하고 문제를 수정했습니다. 패스스루 설계 덕분에 작업량을 관리할 수 있었으며, 먼저 영향이 큰 명령(status, diff, log, show)부터 시작해 나머지는 Git에 맡겼습니다.
설치 및 사용
brew install fielding/tap/nit
에이전트용
nit log
인간용
nit log -H
별칭 (선택)
alias git=nit
눈에 띄지 않는 부분은 그대로 Git이며, 더 빠른 부분은 nit이 담당합니다.