Tauri와 Rust를 사용해 Windows용 AI 기반 Git 컨텍스트 메뉴를 만든 방법
Source: Dev.to
GitPop은 가벼운 Windows 파일 탐색기 확장 프로그램으로, 오른쪽 클릭 메뉴에 현대적인 Git 커밋 UI를 추가하며, 선택적으로 로컬 AI 커밋 생성기를 제공합니다.

GitPop이 하는 일
From File Explorer, right‑click inside any repository folder and choose GitPop Here to open a small popup that lets you:
- 변경된 파일을 즉시 확인
- 깔끔한 UI로 스테이징 및 언스테이징
- 별도 앱으로 전환하지 않고 diff를 검토 – 곧 제공
- Ollama를 통한 로컬 모델(또는 선호하는 API)로 스테이징된 diff에서 커밋 메시지 생성
The core goal is simple: make the “small commit” workflow as fast as a shell command, but less blind.
Tech Stack & Why Tauri
컨텍스트‑메뉴 팝업에서는 시작 시간이 가장 중요한 지표입니다. 폴더를 오른쪽 클릭하고 GitPop Here를 선택했을 때 반응이 느리면 사용자 경험이 깨집니다.
| Layer | Technology |
|---|---|
| Frontend | React + TypeScript + vanilla CSS (glassmorphism‑style dark UI) |
| Backend | Rust |
| Framework | Tauri v2 |
Electron은 전체 Chromium 런타임을 포함하고 있어 바이너리 크기가 크고 메모리 사용량이 높아지는 단점이 있어 제외했습니다. Tauri는 시스템 웹뷰(Windows에서는 WebView2)를 Rust 백엔드와 함께 사용하므로 “즉시 열림” 요구사항을 훨씬 더 잘 만족합니다.
엔지니어링 도전 과제
윈도우 통합은 겉보기엔 간단해 보이지만, 몇 가지 까다로운 부분이 있습니다. 여기서는 가장 큰 세 가지를 다룹니다.
1. 파일 탐색기 컨텍스트 메뉴 항목 등록 (Rust 사용)
우클릭 메뉴에 GitPop Here 를 표시하기 위해 GitPop은 Windows 레지스트리에 명령을 등록합니다. 사용자가 .reg 파일을 실행하도록 요구하는 대신, GitPop은 winreg 크레이트를 이용해 “설치 모드”에서 프로그래밍적으로 이를 수행합니다.
use winreg::enums::*;
use winreg::RegKey;
#[tauri::command]
fn install_context_menu() -> Result {
let hkcu = RegKey::predef(HKEY_CURRENT_USER);
let exe_path = std::env::current_exe()
.map_err(|e| e.to_string())?
.to_string_lossy()
.into_owned();
// 배경(빈 공간을 우클릭) 항목 경로
let bg_path = r"Software\Classes\Directory\Background\shell\GitPop";
let (bg_key, _) = hkcu.create_subkey(bg_path)
.map_err(|e| e.to_string())?;
bg_key.set_value("", &"GitPop Here")
.map_err(|e| e.to_string())?;
bg_key.set_value("Icon", &format!("\"{}\"", exe_path))
.map_err(|e| e.to_string())?;
// 실행할 명령; %V는 클릭한 폴더를 가리킴
let (bg_cmd, _) = bg_key.create_subkey("command")
.map_err(|e| e.to_string())?;
bg_cmd.set_value("", &format!("\"{}\" \"%V\"", exe_path))
.map_err(|e| e.to_string())?;
Ok(())
}
이 접근 방식이 잘 작동하는 이유
- 독립적이며 되돌릴 수 있음 – 외부
.reg파일이 필요 없음. - 관리자 권한이 필요 없음(사용자별 설치).
- 기존 Git 설정을 방해하지 않음.
2. Windows에서 Git을 실행할 때 발생하는 “플래시 터미널” 버그
GitPop은 기본 Git CLI(git status, git diff, git commit 등)를 선호합니다. 이렇게 하면 사용자의 SSH 키, 인증 도우미, 훅, 전역 설정을 자동으로 그대로 사용합니다.
Windows에서 Command::new("git")을 직접 호출하면 짧은 CMD 창이 깜빡이는 현상이 발생할 수 있어, 사용자 경험이 떨어집니다.
해결 방법은 프로세스를 생성할 때 CREATE_NO_WINDOW 플래그를 설정하는 것입니다:
use std::process::Command;
#[cfg(target_os = "windows")]
use std::os::windows::process::CommandExt;
#[cfg(target_os = "windows")]
const CREATE_NO_WINDOW: u32 = 0x08000000;
/// Windows에서 프로그램을 숨긴 상태로 실행하는 `Command`를 반환합니다.
fn build_hidden_cmd(program: &str) -> Command {
let mut cmd = Command::new(program);
#[cfg(target_os = "windows")]
{
cmd.creation_flags(CREATE_NO_WINDOW);
}
cmd
}
이제 모든 Git 호출은 Command::new("git") 대신 build_hidden_cmd("git")을 사용하므로 플래시가 사라집니다.
3. Tauri v2 권한, 창 투명도, 그리고 보이지 않는 앱 함정
투명하고 유리 같은 팝업을 만들고 싶었는데, 이를 위해서는 다음과 같은 설정이 필요합니다:
{
"transparent": true,
"visible": false // React가 로드되는 동안 흰 화면이 나타나는 것을 방지하기 위해 처음에 숨김
}
UI가 준비되면(window.show()) 창을 표시합니다.
하지만 Tauri v2는 기본적으로 프론트엔드 API를 제한합니다. 필요한 권한이 없으면 창이 보이지 않은 채 백그라운드에서 정상적으로 실행됩니다.
해결 방법은 capabilities/default.json에 필요한 창 작업을 명시적으로 허용하는 것입니다:
{
"permissions": [
"core:window:default",
"core:window:manage",
"core:window:visibility",
"core:window:transparent"
]
}
이 권한들을 추가하면 투명 팝업이 즉시 나타나고 기대한 대로 동작합니다.
TL;DR
- GitPop은 Explorer에서 시각적 스테이징과 즉시 커밋 생성을 제공합니다.
- React + TypeScript(프론트엔드)와 Rust(백엔드)를 사용하고 Tauri v2 위에서 구동되어 초고속 시작을 구현합니다.
- 주요 엔지니어링 과제(레지스트리 등록, 숨겨진 Git 프로세스, Tauri 기능)는 간결한 Rust 스니펫과 올바른 Tauri 설정으로 해결됩니다.
{
"permissions": [
"e:window:allow-show",
"core:window:allow-close",
"process:allow-exit"
]
}
전체 화면 제어
Enter fullscreen mode
Exit fullscreen mode
이것은 “보안‑우선” 기본값 중 하나로, 올바르지만 창과 관련된 작업을 처음 시도할 때 확실히 장난을 칩니다.
Sparkle 버튼: AI 커밋 생성 (기본적으로 로컬에서)
커밋 메시지를 작성하는 일은 작은 작업이지만 마찰을 일으킵니다. GitPop의 ✨ Sparkle 버튼은 그 마찰을 줄여줍니다:
- 파일 스테이징 – GitPop은
git diff --cached를 실행합니다. - 커밋 메시지 생성 – 스테이징된 diff가 LLM에 전송되어 커밋 메시지를 제안합니다.
프라이버시‑우선 모델 선택
프라이빗 diff를 클라우드 API에 전송하는 것은 많은 개발자에게 허용되지 않습니다. 따라서 GitPop은 기본값으로 Ollama를 사용하여 로컬에서 실행합니다. 설치된 모델(예: llama3.2 또는 qwen2.5-coder)을 감지하고 API 키, 유료 토큰, 네트워크 호출 없이 커밋 메시지를 생성합니다.
GitPop은 또한 다음을 지원합니다:
- OpenAI
- Anthropic
- Gemini
- 커스텀 엔드포인트
모델 선택은 구현 세부 사항일 뿐이며, UX 목표는 일관됩니다: 스테이징 → 스파클 → 커밋 → 완료.
시도해 보기
Windows를 사용 중이시고 (macOS 지원은 곧 제공됩니다) 이 작업 흐름에 맞다면, 저장소에서 최신 설치 프로그램을 받아보세요:
GitHub: https://github.com/vinzify/gitpop
피드백, 이슈, 풀 리퀘스트를 환영합니다. 또한 macOS Finder에 동일한 “우클릭 커밋 UI”를 도입하려면 어떤 작업이 필요한지 탐색 중이며, 통합 제약은 다르지만 불편함은 동일합니다.
커밋을 즐기세요!