Git을 Zig로 다시 구축해 AI 에이전트의 토큰을 71% 절감

발행: (2026년 3월 26일 오전 09:12 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

소개

AI 에이전트는 상태 확인, 차이점(dif), 로그, 표시(show) 작업을 위해 Git을 지속적으로 호출합니다. 3 156개의 실제 코딩 세션을 분석한 결과, Git이 차지하는 출력 토큰은 약 459 000 토큰이며, 이는 **전체 쉘 명령의 7.4 %**에 해당합니다(코덱스의 경우 10 % 이상). Git의 출력은 인간을 위해 설계되었습니다: 자세한 헤더, 설명 텍스트, 열 패딩, 장식 형식 등. 기계에게는 이러한 “선물 포장”이 불필요한 토큰을 추가해 비용과 지연을 증가시킵니다.

토큰 절감

저는 Zig로 작성된 네이티브 Git 대체 구현 nit를 만들었습니다. nit은 libgit2를 통해 Git 객체 데이터베이스와 직접 통신합니다. 기본 설정은 기계에 최적화되어 있어 토큰 사용량을 크게 줄입니다.

명령어Git 토큰nit 토큰절감율
status~125~3671 %
log -20~2 273~30187 %
diff~1 016~65735 %
show --stat~260~11855 %

실제 세션 데이터 전체에 걸쳐 nit의 간결한 기본값은 150 – 250 K 토큰을 절감할 수 있습니다.

성능 벤치마크

hyperfine(실제 저장소에서 100회 실행) 사용 결과:

명령어Gitnit속도 향상
status13.7 ms8.4 ms1.64×
diff14.3 ms9.9 ms1.44×
show10.2 ms7.3 ms1.39×

구현 세부 사항

  • Zig의 C 인터옵은 비용이 없습니다: @cImport로 libgit2 헤더를 가져와 함수를 직접 호출합니다—서브프로세스 오버헤드나 텍스트 파싱이 없습니다.
  • 아직 최적화되지 않은 명령어에 대해서는 nit이 execvpe()를 통해 Git을 호출하고, nit 프로세스를 완전히 교체합니다. 따라서 git=nit 별칭을 사용해도 안전하며, 네이티브 부분이 성장함에 따라 기능이 그대로 유지됩니다.

Diff 컨텍스트 감소

가장 논란이 되었던 설계 선택은 기본 diff 컨텍스트를 3줄(Git 기본값)에서 1줄로 줄인 것입니다. 추가 컨텍스트 줄은 많은 토큰을 차지합니다. 영향을 평가하기 위해 다중 파일 diff, 중첩 제어 흐름, 코드 이동, 모호한 블록을 포함한 27개의 실험을 수행했습니다. Claude는 U0, U1, U3 모두에서 4/4 점수를 받아 이해도 손실이 없음을 확인했습니다.

Claude Code 세션에서 561개의 git diff/show 호출 데이터를 분석한 결과, diff 후 바로 소스 파일을 읽는 에이전트는 **3.9 %**에 불과했습니다. 이는 diff 자체가 주요 컨텍스트 소스임을 의미합니다. 따라서 U1 모드(1줄 컨텍스트)는 토큰을 절감하면서도 유용성을 해치지 않습니다; hunk 헤더는 여전히 라인 번호를 제공합니다.

모드

모드설명
Compact (default)기계에 최적화된 최소 데이터 출력
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이 담당합니다.

0 조회
Back to Blog

관련 글

더 보기 »