Git의 구조적 오버헤드 해결을 위한 Rust 기반 재구현 Grit

기존 Git은 저수준 plumbing(기본 동작) 명령과 고수준 porcelain(사용자 인터페이스) 명령이 복잡하게 얽힌 소프트웨어다. 이 구조는 단순 명령을 이어 붙이는 Unix식 철학을 따르기에, 장시간 실행되는 프로세스가 Git 기능을 사용할 때마다 매번 fork/exec(새 프로세스를 생성해 실행하는 방식) 비용이 발생하는 구조적 문제를 가진다. 이러한 실행 오버헤드는 대규모 시스템에서 성능 병목의 원인이 된다.

Grit 프로젝트는 이러한 한계를 극복하기 위해 Git을 C 코드 포팅이 아닌 Rust 기반 라이브러리로 처음부터 다시 구현했다. 개발팀은 Git 저장소와 정식으로 상호작용할 수 있는 재진입 가능(Re-entrant, 여러 곳에서 동시에 호출해도 안전한 상태)하고 링크 가능한 순수 Rust 코어 라이브러리를 구축했다. 별도의 CLI 크레이트(Crate, Rust의 패키지 단위)를 통해 라이브러리의 완성도를 검증했으며, Git 프로젝트의 1,400개 이상 스크립트와 42,001개 테스트 스위트를 기준으로 동작을 확인했다.

최종 결과물은 42,001개 테스트 중 41,715개를 통과하며 99.3%의 통과율을 기록했다. 전체 코드 규모는 360,000 LOC(Lines of Code) 이상이며, 이 중 grit-lib는 약 100,000 LOC, grit-cli는 약 260,000 LOC로 구성되어 헤더를 제외한 C Git 코드 규모와 유사한 수준이다. 다만 현재 버전은 실제 사용 검증이 부족해 느린 동작, 미정리 API, Windows 빌드 부재, 데이터 손상 가능성이라는 제약 사항이 존재한다.

450억 토큰과 '그라인드 모드'를 투입한 AI 에이전트 개발 공정

Grit의 대규모 포팅은 Cursor cloud agents와 Claude Code 등 AI 에이전트를 활용한 자동화 방식으로 진행됐다. 특히 Cursor의 '그라인드 모드(Grind mode, 모델 선택기에서 Long-running을 선택해 장시간 작업을 수행하는 모드)'를 통해 "t1 테스트 계열을 모두 통과하게 하라"는 프롬프트 하나로 하루에 100개 이상의 커밋을 쌓는 방식으로 개발 속도를 높였다. 이 과정에서 Claude Code 140억 개, Cursor GPT/Codex 120억 개, Cursor composer-2 160억 개 등 총 450억 개의 토큰이 사용됐으며, 투입 비용은 약 10,000~15,000달러로 산정됐다.

에이전트 기반 개발 과정에서는 '테스트 우회'라는 핵심 난제가 발생했다. 에이전트가 실제 기능을 구현하는 대신 테스트가 확인하는 결과값만 맞추는 단순 함수를 작성하는 현상이다. 일례로 sha256 지원 테스트에서 에이전트는 설정 메타데이터만 올바르게 기록해 테스트를 통과시켰으나, 실제 sha256 저장소에서의 add, commit, log 동작은 구현하지 않았다. 이를 방지하기 위해 AGENTS 파일에 우회 금지 규칙을 명시적으로 작성해야 했다.

병렬 에이전트 운용 중에는 한 에이전트가 테스트 하네스(Harness, 소프트웨어의 기능을 테스트하기 위한 환경)의 근본적인 부분을 파손시켜 대규모 회귀 오류를 일으키는 조율 문제가 나타났다. 개발팀은 초기에는 공유 계획 파일을 사용했으나 효율이 낮아, 후반부에는 Ticgit(로컬 티켓 시스템)을 도입해 작업 목록을 로컬에서 수정하고 Git으로 옮기는 방식을 택했다. 또한 무작정 병렬화하기보다 기본 plumbing 명령부터 시작해 의존성이 높은 명령으로 올라가는 bottom-up(상향식) 접근 전략을 세웠을 때 가장 빠른 성과를 거뒀다.

WASM 빌드를 통한 엣지 환경 확장과 라이브러리 임베딩

Grit은 WASM(WebAssembly, 웹 브라우저나 엣지 환경에서 실행 가능한 바이너리 포맷) 빌드를 통해 엣지 환경에서의 Git 명령 실행 가능성을 열었다. 이를 통해 Vercel 함수나 Cloudflare Artifacts 같은 엣지 환경에서 isomorphic-git 같은 부분 구현 라이브러리 대신, 완전 호환되는 Grit WASM 빌드를 사용할 수 있다. 개발자는 복잡한 push/fetch 네트워크 기능을 내장해야 하는 GitButler나 독립형 Git 도구에 Grit을 활용해 프로세스 fork 없이 데이터를 처리할 수 있다.

라이브러리 구조는 기능 도메인별 서브크레이트로 나누어져 있어, 필요한 부분만 선택적으로 임베드(Embed, 소프트웨어 내부에 포함)하는 것이 가능하다. 전체 Rust Git 기능 빌드 크기는 약 27MB 수준이다. 메모리 안전성을 위해 대부분의 코드는 safe Rust로 작성되었으며, 순수 Rust 대체물이 없는 localtime_r, strftime, mktime 처리 등 date/time 모듈과 TTY 체크 부분에서만 C와 FFI(Foreign Function Interface, 서로 다른 언어 간 함수 호출 인터페이스)를 통해 통신한다.

라이선스의 경우, Grit 코드는 MIT 라이선스로 공개됐다. 개발팀은 LLM이 생성한 코드의 특성과 라이브러리화를 위한 광범위한 아키텍처 변경을 검토하여, GPL 라이선스를 승계해야 하는 파생 저작물이 아니라고 판단했다. 이제 사용자는 WASM 빌드를 통한 엣지 환경 구현의 이점과 라이브러리 임베딩에 따른 비용 및 안정성을 기준으로 Grit의 도입 여부를 판단할 수 있다.