Show HN: Nit – 나는 Git을 Zig로 다시 구축해 AI agents의 토큰 사용량을 71% 절감했습니다
Source: Hacker News
소개
AI 에이전트는 git을 끊임없이 호출합니다—status, diff, log, show. 3,156개의 실제 코딩 세션 데이터를 분석한 결과, git은 약 459 000 토큰의 출력(전체 쉘 명령의 약 7.4 %)을 차지했습니다. Codex는 더 심각해서 bash 호출 중 10 % 이상이 git이었습니다.
git의 출력은 사람을 위해 설계되었습니다: 자세한 헤더, 안내 문구, 열 정렬, 장식적인 포맷. 머신은 “선물 포장”이 필요 없습니다. 토큰 하나가 추가될 때마다 비용이 들고 지연이 발생합니다.
그래서 저는 nit를 만들었습니다. Zig로 작성된 네이티브 git 대체 구현으로, libgit2를 통해 git 객체 데이터베이스에 직접 접근합니다. 기본 설정은 머신에 최적화되어 있습니다.
수치
토큰 절감 (nit compact vs. git default)
| 명령 | Git 토큰 | Nit 토큰 | 절감율 |
|---|---|---|---|
| status | 125 | 36 | 71 % |
| log | 2 273 | 301 | 87 % |
| diff | 1 016 | 657 | 35 % |
| show — stat | 260 | 118 | 55 % |
실제 세션 데이터 전체에서 nit의 compact 기본값은 150–250 K 토큰을 절감할 수 있습니다. 그리고 더 빠릅니다.
속도 향상 (실제 레포에서 100 번 hyperfine 실행)
| 명령 | Git (ms) | Nit (ms) | 속도 향상 |
|---|---|---|---|
| status | 13.7 | 8.4 | 1.64× |
| diff | 14.3 | 9.9 | 1.44× |
| show | 10.2 | 7.3 | 1.39× |
작동 원리
Zig의 C 인터옵은 제로 코스트입니다. @cImport로 libgit2 헤더를 가져와 함수를 직접 호출합니다—서브프로세스 오버헤드도, 텍스트 파싱도 없습니다. nit은 git 객체 데이터베이스를 네이티브하게 읽습니다.
아직 최적화되지 않은 명령에 대해서는 execvpe()를 통해 git에 넘깁니다. nit 프로세스 자체가 교체되므로 래퍼 오버헤드가 없습니다. 따라서 alias git=nit을 사용해도 기능 손실이 없으며, 네이티브 구현이 늘어날수록 자동으로 패스스루가 줄어듭니다.
U1 실험
가장 논란이 된 설계 결정은 diff 컨텍스트를 3줄(기본 git)에서 1줄로 줄인 것이었습니다. 추가 컨텍스트 라인은 많은 토큰을 숨깁니다. 이를 줄이면 이해도가 떨어질까요?
멀티 파일 diff, 중첩 제어 흐름, 코드 이동, 애매한 유사 블록을 포함한 27개의 실험을 진행했습니다. Claude는 U0, U1, U3 모두에서 4/4 점수를 받아 차이가 없었습니다.
실제 Claude Code 세션에서는 diff 후 바로 소스 파일을 읽는 에이전트가 **3.9 %**에 불과했으며, 이는 diff 자체가 주요 컨텍스트임을 시사합니다.
따라서 U1은 눈에 띄는 단점 없이 토큰 절감을 제공합니다. 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입니다.