Go 언어 생태계에 새로운 바람을 불어넣을 Git 라이브러리 'go-git2'가 등장했습니다. 이 라이브러리는 기존의 인기 라이브러리 'go-git'보다 무려 10배에서 100배까지 빠른 속도를 자랑하며, 특히 대규모 Git 저장소를 다루는 개발자들에게 희소식이 될 것으로 보입니다. 현재는 저장소 읽기(read-only) 기능만 지원하지만, 그 성능 향상 폭이 매우 인상적입니다.
go-git2의 핵심은 'libgit2'라는 C 기반의 Git 라이브러리를 WebAssembly(WASM)로 컴파일한 뒤, 이를 다시 'wasm2go' 도구를 이용해 순수 Go 코드로 변환했다는 점입니다. 이 덕분에 CGO_ENABLED=0 환경에서도 C 컴파일러 없이 빌드가 가능하며, 크로스 컴파일(cross-compile)도 용이합니다. 또한, libgit2가 샌드박스(sandbox) 환경에서 실행되므로 메모리 안전성(memory-safety)도 확보했습니다. 현재 64비트 리눅스, macOS, 윈도우를 지원하며, 기존 go-git과 유사한 API를 제공하여 전환이 비교적 쉽다는 장점도 있습니다.
성능 벤치마크 결과는 놀랍습니다. 예를 들어, 3만 5천 개 커밋과 7천 개 파일로 구성된 'django' 저장소에서 특정 파일 변경 이력을 조회하는 작업은 go-git이 39.7초 걸린 반면, go-git2는 352밀리초(ms) 만에 완료하여 113배 빠른 속도를 보였습니다. 최근 90일간의 커밋 목록 조회는 96배, HEAD 파일 목록 조회는 32배, 저장소 열기 및 HEAD 커밋 읽기는 16배 빨라졌습니다. 이러한 성능 향상은 go-git이 모든 이력을 탐색하고 커밋 트리(commit tree)를 비교하는 방식과 달리, go-git2가 git CLI에 가까운 효율적인 방식으로 이력 쿼리를 처리하기 때문입니다.
go-git2의 등장은 Go 언어를 사용하는 개발자들이 Git 저장소와 상호작용하는 방식에 큰 변화를 가져올 수 있습니다. 특히 CI/CD 파이프라인, 코드 분석 도구, Git 기반의 데이터베이스 또는 콘텐츠 관리 시스템(CMS) 등 Git 데이터를 고성능으로 처리해야 하는 애플리케이션 개발에 유리할 것입니다. 현재 쓰기(write) 기능은 지원하지 않지만, 향후 기능이 확장된다면 Go 언어 기반의 Git 도구 생태계가 더욱 풍부해질 것으로 기대됩니다.