Tauri와 Rust를 사용해 Windows용 AI 기반 Git 컨텍스트 메뉴를 만든 방법

발행: (2026년 3월 1일 오전 09:36 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

GitPop은 가벼운 Windows 파일 탐색기 확장 프로그램으로, 오른쪽 클릭 메뉴에 현대적인 Git 커밋 UI를 추가하며, 선택적으로 로컬 AI 커밋 생성기를 제공합니다.

GitPop on GitHub

GitPop banner

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를 선택했을 때 반응이 느리면 사용자 경험이 깨집니다.

LayerTechnology
FrontendReact + TypeScript + vanilla CSS (glassmorphism‑style dark UI)
BackendRust
FrameworkTauri 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 버튼은 그 마찰을 줄여줍니다:

  1. 파일 스테이징 – GitPop은 git diff --cached를 실행합니다.
  2. 커밋 메시지 생성 – 스테이징된 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”를 도입하려면 어떤 작업이 필요한지 탐색 중이며, 통합 제약은 다르지만 불편함은 동일합니다.

커밋을 즐기세요!

0 조회
Back to Blog

관련 글

더 보기 »

일이 정신 건강 위험이 될 때

markdown !Ravi Mishrahttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fu...