$ glc

gluck

git log, unfolds code into knowledge

커밋을 따라가며 그 시점의 코드를 읽고 비교하는 터미널 git history 뷰어입니다. 기억이 흐릿한 커밋은 뜻으로 검색할 수 있습니다.

설치하기 GitHub에서 보기
00.0 / 15.0

2026년 5월 21일 첫 커밋부터 v0.15.0까지, 실제 개발 기록으로 만든 15초 소개 영상입니다.

Why

코드가 변해온 길을 따라 읽기

오픈소스를 공부할 때 git history를 따라 코드가 어떻게 변해왔는지 읽는 것은 좋은 방법입니다. 다만 git show는 변경분만 보여주고, tig는 log 탐색에 탁월하지만 파일을 읽기에는 조금 불편하고, GitHub은 커밋을 넘길 때마다 브라우저를 오가야 합니다.

gluck은 git history를 타임라인으로 삼습니다. 각 시점의 파일 트리를 열고, 파일을 읽고, 이웃한 커밋과 비교하는 일을 터미널 안에서 키보드만으로 할 수 있게 하는 것이 목표입니다. 마우스 휠과 클릭도 지원합니다.

바이너리 이름 glc는 home row 근처에서 편하게 칠 수 있도록 고른 이름입니다.

Modes

세 가지 모드

Pick ──Enter──→ View ──Tab──→ Diff
  ↑              ↑            │
  │              └────Tab─────┘
  └─── Esc/h ─────────────────┘
PICK

커밋 고르기

커밋 리스트와 인라인 diff 미리보기를 함께 봅니다. 커밋을 200개씩 나눠 불러오므로 큰 저장소에서도 첫 화면이 빠르게 뜹니다.

VIEW

그 시점의 코드 읽기

선택한 커밋 시점의 파일 트리와 내용을 보여줍니다. 폴더 접기, gitignore 필터, 신택스 하이라이트, 줄 번호를 지원합니다.

DIFF

나란히 비교하기

부모 커밋과 side-by-side로 비교하고, v로 unified 보기로 바꿀 수 있습니다. 긴 줄은 양쪽 패널을 맞춰 줄바꿈합니다.

Semantic search

단어가 기억나지 않아도 찾을 수 있도록

s를 누르면 커밋 메시지, 파일 내용, 함수 이름을 뜻으로 검색합니다.

"인덱스 스키마가 바뀌면 재빌드하던 그 커밋"처럼 정확한 단어가 떠오르지 않을 때 쓰기 좋습니다. 키워드 검색과 의미 검색을 함께 사용해 관련도가 높은 결과를 위로 올립니다.

s어느 모드에서든 검색 모달 열기
입력커밋, 파일, 심볼을 한 번에 검색합니다. 한국어와 영어를 섞어 써도 됩니다.
^N / ^P결과 이동
Enter커밋은 Pick으로, 파일과 심볼은 해당 커밋의 View로 이동
I인덱스가 없거나 오래되었으면 모달 안에서 다시 빌드
Esc닫기

동작 방식

glc index는 HEAD의 파일을 tree-sitter로 심볼 단위로 나누고, 커밋 메시지와 함께 BM25 인덱스와 256차원 벡터 인덱스에 저장합니다. 질의는 두 인덱스를 함께 거친 뒤 RRF로 순위를 합칩니다.

BM25tantivy, 문자 bigram과 lowercase. "에러처리"와 "에러 처리"를 같은 것으로 봅니다.
Vectorpotion-multilingual-128M, 256차원. 표현이 달라도 뜻이 비슷하면 찾아냅니다.
RRF k=60두 결과 목록의 순위를 융합해 하나의 목록으로 정리합니다.
.glc-index/는 .gitignore에 추가해 두시길 권합니다. 인덱스 파일이 커밋되면 다음 인덱싱 대상에 섞일 수 있습니다.
Install

설치

Homebrew · macOS Apple Silicon
$ brew tap soomtong/tap && brew install glc
Cargo · Rust 툴체인이 있는 macOS / Linux, Intel Mac
$ cargo install --git https://github.com/soomtong/gluck
인덱스 · 시맨틱 검색을 쓰려면 저장소에서 한 번 실행
$ glc index

사용법

$ glc                  # 현재 디렉토리의 git history 열기
$ glc /path/to/repo    # 특정 저장소 열기
$ glc index            # 시맨틱 검색 인덱스 빌드 (.glc-index/)
$ glc index --force    # 인덱스 강제 재빌드
$ glc ignore           # 기본 제외 목록으로 .glcignore 생성
$ glc report           # 검색 품질 + 성능 리포트
Keys

키 바인딩

vim에 익숙하다면 대부분 예상한 대로 동작합니다.

공통

j k ↑ ↓이동
^N / ^P이전(older) / 다음(newer) 커밋, 선택한 파일 유지
s시맨틱 검색 모달
^T테마 순환 (설정에 저장)
TabView ⇄ Diff
EscPick으로 돌아가기
^D디버그 오버레이
q / ^C종료

Pick

Enter / l선택한 커밋을 View로
Tab선택한 커밋을 Diff로
/메시지·작성자·해시 prefix 검색
^F / ^B페이지 이동

Diff

h l ← →변경 파일 이동
vside-by-side ⇄ unified
u / d, J / K스크롤 / 페이지
wword wrap 토글

View

Enter파일 열기 / 폴더 접기·펼치기
h / l폴더 접기(→부모) / 펼치기(→첫 자식)
H / L이전 / 다음 변경 파일(*)로 이동
..gitignore 필터 토글
u / d내용 스크롤 (기본 3줄)
J / K내용 페이지 스크롤
wword wrap 토글 (기본 on)
Esc / h파일 위에서 Pick으로

시맨틱 검색 모달의 키는 시맨틱 검색 섹션에 정리되어 있습니다.

Syntax

신택스 하이라이트

tree-sitter 기반으로 다음 언어를 지원합니다. 목록에 없는 확장자는 plain text로 표시합니다.

Config

테마와 설정

테마는 여섯 가지이며 ^T로 바꾸면 바로 저장됩니다.

plain (기본)
catppuccin
tokyo-night
nord
gruvbox
one-light

설정 파일은 아래 경로에 있습니다. 파일이 없으면 기본값으로 실행하며, 자동으로 만들지는 않습니다.

macOS
~/Library/Application Support/gluck/config.toml

Linux
~/.config/gluck/config.toml

[theme]
name = "plain"          # plain | catppuccin | tokyo-night | nord | gruvbox | one-light

[ui]
scroll_lines = 3        # u/d 한 번에 몇 줄
word_wrap = true        # w 키로 토글하면 여기에 저장됨

[search]
# index_dir = ".glc-index"   # 기본: 저장소 루트의 .glc-index/
result_limit = 20       # 모달에 보여줄 결과 수
Thanks

영감을 준 도구들