git log, unfolds code into knowledge.
커밋 로그라는 시간의 주름을 따라 접힌 코드가 펼쳐진다 — 읽고, 비교하고, 이해하는 행위 끝에 지식이 남는다.
바이너리 이름
glc는 손가락이 기억하는 명령어: home row에서 벗어나지 않고g l c. gluck은 그 뒤에 unfolding과 knowing을 더한, 프로젝트의 온전한 이름이다.
Git history file viewer — 터미널에서 git history의 파일을 탐색하고 읽는 TUI 도구.
cargo install --git https://github.com/soomtong/gluckIntel Mac(x86_64)용 바이너리는 GitHub Actions 지원 중단으로 제공하지 않습니다. Intel Mac 사용자는 아래 Cargo 설치 방법을 이용해 주세요.
brew tap soomtong/tap
brew install glcLinux용 바이너리는 별도로 제공되지 않습니다. Rust 툴체인이 설치되어 있다면 직접 빌드할 수 있습니다.
cargo install --git https://github.com/soomtong/gluck또는 소스를 받아 빌드:
git clone https://github.com/soomtong/gluck
cd gluck
cargo build --release
# 빌드 결과: ./target/release/glcglc # 현재 디렉토리의 git history 열기
glc /path/to/repo # 특정 저장소 열기
glc index # 시맨틱 검색 인덱스 빌드
glc index --force # 인덱스 강제 재빌드| 키 | 동작 |
|---|---|
j / k / ↑ / ↓ |
커밋 이동 |
^N / ^P |
이전(older)/다음(newer) 커밋 이동 |
Enter / l |
선택 커밋 View 모드 |
Tab |
선택 커밋 Diff 모드 |
/ |
커밋 검색 |
s |
시맨틱 검색 모달 열기 (glc index 선행 필요) |
^T |
색상 테마 전환 |
q |
종료 |
| 키 | 동작 |
|---|---|
j / k / ↑ / ↓ |
파일 트리 이동 |
u / d |
내용 스크롤 (3줄) |
J / K |
내용 페이지 스크롤 |
. |
.gitignore 파일 필터 토글 |
Tab |
Diff 모드 전환 |
Esc / h |
Pick 모드 |
^N / ^P |
이전(older)/다음(newer) 커밋 이동 |
s |
시맨틱 검색 모달 열기 |
| 키 | 동작 |
|---|---|
j / k / ↑ / ↓ |
변경 파일 이동 |
h / l / ← / → |
변경 파일 이동 |
u / d |
diff 내용 스크롤 (3줄) |
J / K |
diff 내용 페이지 스크롤 |
v |
side-by-side / unified 토글 |
Tab |
View 모드 |
Esc |
Pick 모드 |
^N / ^P |
이전(older)/다음(newer) 커밋 쌍 이동 |
s |
시맨틱 검색 모달 열기 |
s 키를 누르면 커밋 메시지와 파일/심볼을 동시에 검색하는 모달이 열립니다.
- 모달 내에서
ctrl+n/p로 결과 탐색,Enter로 선택 - Enter: 선택한 결과가 커밋이면 Pick 모드, 파일·심볼이면 View 모드로 자동 전환
- Esc: 모달 닫기
- 인덱스가 없으면
I키로 빌드 가능: force rebuild index
사용 전 glc index로 인덱스를 먼저 빌드할 수 있습니다.
하이브리드 검색(hybrid search)으로 BM25 키워드 검색과 벡터 의미 검색을 결합합니다.
쿼리 입력
├── BM25 (Tantivy bigram) ──→ 키워드 매칭 결과
├── Embedding (potion-multilingual-128M) ──→ 벡터 검색 결과
└── RRF (Reciprocal Rank Fusion) ──→ 점수 융합 → 최종 결과
- BM25 검색: Tantivy의 bigram 토크나이저로 한국어/영문 키워드를 매칭합니다. 제목과 본문 필드를 모두 검색합니다.
- 벡터 검색: 쿼리를 256차원 임베딩으로 변환한 뒤 turbovec 4-bit 양자화 인덱스에서 유사도를 계산합니다.
- RRF 융합: 두 검색 결과를 Reciprocal Rank Fusion(k=60)으로 병합하여 최종 순위를 결정합니다.
glc index는 커밋 메시지와 HEAD의 파일을 대상으로 인덱스를 빌드합니다.
- 커밋 메시지: 제목과 본문을 그대로 인덱싱
- 파일: 4KB 미만은 전체 파일(
WholeFile), 그 이상은 tree-sitter로 심볼(function,struct,impl) 단위로 분할하여 인덱싱 - 현재 Rust(
.rs) 파일에 한해 tree-sitter 기반 심볼 추출을 지원합니다
.glc-index/
├── meta.toml # 버전, HEAD OID, 도큐먼트 수, 인덱싱 시각
├── bm25/ # Tantivy BM25 인덱스 (bigram 토크나이저)
└── vectors/ # turbovec 4-bit 양자화 벡터 인덱스
glc index 최초 실행 시 임베딩 모델(minishlab/potion-multilingual-128M, 약 500MB)을 자동으로 다운로드합니다.
모델은 HuggingFace Hub 기본 캐시에 저장됩니다:
- macOS / Linux:
~/.cache/huggingface/hub/
같은 머신에서 다른 레포를 인덱싱할 때는 캐시에서 즉시 로드되므로 재다운로드가 없습니다.
.glc-index/는 .gitignore에 추가하는 것을 권장합니다:
echo '.glc-index/' >> .gitignore
설정 파일은 XDG config 경로에 저장됩니다.
- macOS:
~/Library/Application Support/gluck/config.toml - Linux:
~/.config/gluck/config.toml
[theme]
# 색상 테마: plain (기본), catppuccin, tokyo-night, nord, gruvbox, one-light
name = "plain"
[ui]
# u/d 키 스크롤 줄 수 (기본: 3)
scroll_lines = 3오픈소스 프로젝트를 공부할 때 가장 좋은 방법 중 하나는 git history를 따라가며 코드가 어떻게 변해왔는지 읽는 것이다. 하지만 기존 도구들은 각각 한계가 있다:
- git log / git show — 변경사항은 볼 수 있지만 해당 시점의 전체 파일을 읽기 불편하다
- tig — log 탐색에 훌륭하지만 파일 뷰어로는 부족하다
- GitHub/GitLab — 브라우저가 필요하고 커밋 간 이동이 느리다
gluck은 git history를 타임라인으로 삼아, 각 시점의 파일을 읽고 비교하는 데 집중한다.
- 커밋 리스트를 탐색하고 선택
- 파일 단위로 변경 이력 필터링
- 커밋 메시지, 작성자, 날짜 기반 검색
- 선택한 커밋 시점의 전체 파일 내용 조회
- 파일 트리 탐색 (해당 커밋 기준)
- syntax highlight 지원
- 두 커밋 간 변경사항 비교 (side-by-side / unified)
- 파일 단위 diff, 특정 함수/블록 단위 diff
- 변경된 파일만 필터링하여 보기
- 주요 언어 syntax highlight
- 터미널 색상 테마 지원
- 오픈소스 프로젝트를 처음 공부할 때 초기 커밋부터 따라가며 코드 읽기
- 특정 기능이 언제, 어떻게 추가되었는지 추적
- 버그 수정 커밋을 찾아 어떤 변경이 있었는지 확인
- 프로젝트 문서(history 내 README, docs 등)의 변천사 읽기
- Terminal 전용 TUI 도구
- 로컬 git repository 기반 동작