我如何使用 Tauri 和 Rust 为 Windows 构建 AI 驱动的 Git 右键菜单

发布: (2026年3月1日 GMT+8 08:36)
7 分钟阅读
原文: Dev.to

Source: Dev.to

GitPop 是一个轻量级的 Windows 文件资源管理器扩展,它在右键菜单中添加了现代化的 Git 提交 UI,并提供可选的 本地 AI 提交生成器

GitPop 在 GitHub 上

GitPop 横幅

GitPop 的功能

在文件资源管理器中,右键单击任意仓库文件夹并选择 GitPop Here,即可打开一个小弹窗,让您:

  • 立即查看已更改的文件
  • 使用简洁的界面进行暂存和取消暂存
  • 查看差异(无需切换到其他应用)—— 即将推出
  • 使用 通过 Ollama 的本地模型(或您偏好的 API)从已暂存的差异生成提交信息

核心目标很简单:让“小提交”工作流像 shell 命令一样快速,但不盲目

技术栈与选择 Tauri 的原因

对于右键菜单弹出窗口,启动时间是最关键的指标。如果右键点击文件夹并选择 GitPop Here 时感觉迟缓,体验就会被破坏。

技术
前端React + TypeScript + vanilla CSS(玻璃态风格暗色 UI)
后端Rust
框架Tauri v2

我排除了 Electron,因为它会打包完整的 Chromium 运行时,导致二进制文件体积大、内存占用高。Tauri 使用 系统 WebView(Windows 上为 WebView2)配合 Rust 后端,能够更好地满足“瞬间打开”的需求。

工程挑战

Windows 集成从外表看起来很简单,但内部有一些棘手的细节。主要的三大难点如下。

1. 注册文件资源管理器右键菜单项(来自 Rust)

为了在右键菜单中显示 GitPop Here,GitPop 会在 Windows 注册表中注册一个命令。GitPop 并不是让用户手动运行 .reg 文件,而是通过 “Setup Mode” 使用 winreg crate 以编程方式完成此操作。

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();

    // Path for the background (right‑click on empty space) entry
    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())?;

    // Command that runs the executable; %V resolves to the clicked folder
    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 statusgit diffgit 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;

/// Returns a `Command` that runs the given program hidden on Windows.
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 调用现在改为使用 build_hidden_cmd("git") 而不是 Command::new("git"),从而消除了闪烁。

3. Tauri v2 能力、窗口透明以及 “看不见的应用” 陷阱

我想要一个透明、玻璃感的弹窗,需要如下配置:

{
  "transparent": true,
  "visible": false   // start hidden to avoid a white flash while React loads
}

当 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 让您直接在资源管理器中进行可视化暂存并即时生成提交。
  • 使用 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

这是那些“安全优先”的默认设置之一,虽然正确,但当你第一次尝试进行任何窗口相关操作时,它绝对会捉弄你。

闪耀按钮:AI 提交信息生成(默认本地)

编写提交信息是一件小事,但会带来摩擦。GitPop 的 ✨ Sparkle 按钮可以减少这种摩擦:

  1. 暂存文件 – GitPop 运行 git diff --cached
  2. 生成提交信息 – 将已暂存的 diff 发送给大语言模型(LLM),以提议提交信息。

隐私优先的模型选择

将专有 diff 发送到云 API 对许多开发者来说是不可接受的。因此,GitPop 默认使用 Ollama,在本地运行。它会检测已安装的模型(例如 llama3.2qwen2.5-coder),并在无需 API 密钥、付费令牌或网络请求的情况下生成提交信息。

GitPop 还支持:

  • OpenAI
  • Anthropic
  • Gemini
  • Custom endpoints

模型选择是实现细节;用户体验目标保持一致:暂存 → 闪耀 → 提交 → 完成

试一试

如果你使用 Windows(macOS 支持即将推出)并且这符合你的工作流,请从仓库获取最新的安装程序:

GitHub: https://github.com/vinzify/gitpop

欢迎提交反馈、问题和拉取请求。我也在探索将相同的“右键提交 UI”带到 macOS Finder 所需的工作量,尽管集成约束不同,但痛点是相同的。

祝提交愉快!

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...