A lightweight IntelliJ IDEA-style Git client. MIT License. Verified on Windows only (NSIS installer). Not a GitHub or GitLab pull-request client. The log loads 200 commits per page and stops at 20,000.
中文说明如下。Linux 与 macOS 尚未支持,欢迎贡献。没有这两个平台的安装包或下载入口。
面向 Windows 的轻量 IntelliJ IDEA 风格 Git 客户端,采用 MIT License。常驻内存以状态栏里的进程 RSS 为准,目标 < 60MB,不保证任何仓库都低于该数。日志每页 200 条,继续加载最多到 2 万条后停止;已加载的行整页渲染,没有虚拟滚动,不保证大仓库丝滑。
很多重度开发者极度喜爱 IntelliJ IDEA 的 Git 交互与版本控制体系(无可挑剔的 Git Log 拓扑图、便捷的行级 Partial Commit、顺手的双栏 Diff 比对、本地安全的 Shelf 架藏、以及强大的 3-Way Merge 冲突解决)。
然而,IDEA 作为一个重型 IDE,往往需要占用 2.5 GB ~ 4 GB+ 的内存,并伴随着漫长的启动时间和频繁的索引构建。如果只是想快速查看 Git 历史、对比分支、提交代码或挑拣提交(Cherry-pick),启动 IDEA 极其沉重。
SnailGit 把 IDEA 里常用的 Git 操作做成独立桌面应用,主路径是已落地的 Tauri 2。它不是 IDEA 的完整复刻,也没有 blame、交互式 rebase、GitHub/GitLab PR 客户端。常驻内存目标 < 60MB,以窗口状态栏的真实进程 RSS 为准,不保证任何仓库都低于该数。
浏览器模式(
pnpm dev)仅是开发预览:非 Tauri 环境下使用src/mock/gitData.ts假数据,不可读写真实仓库。AI 协作约束见 AGENTS.md。协议是根目录的 MIT License。这是桌面应用,不是 npm 库,
package.json保持"private": true。贡献、Windows 启动和现有检查见 CONTRIBUTING.md。
-
多项目仓库管理侧边栏 (Repositories Sidebar)
- 最左侧常驻项目列表,支持展开/折叠双模式(紧凑图标模式 vs 完整列表模式)
- 添加本地 Git 项目:支持输入路径或浏览添加,提供快捷示例导入
- 平滑一键切换:点击项目立即切换主界面的当前仓库、分支与变更状态
- 项目管理操作:支持收藏置顶(Star)、从 SnailGit 列表安全移除(无损本地磁盘文件)
- 实时状态感知:卡片上即时呈现未暂存变更数量指示(如
● 13)与未同步推送数量(如↑1)
-
Git Log 历史拓扑图 (Alt+9)
- 多轨道贝塞尔曲线 SVG 彩色拓扑图谱,清晰展示分叉与合并
- 包含 Branch / Tag 徽章(黄色 Tag、绿色 HEAD、蓝色远程分支)
- 多维过滤器:按 Branch、User、Date、Paths 和全文字段快速过滤
- 提交详情抽屉与变更文件树(A/M/D 状态与行数增减联动)
- 经典右键菜单:Cherry-pick, Checkout Revision, Create Branch, Revert, Reset to Here
-
Commit 面板与双栏 Diff 比较器 (Alt+0)
- Default Changelist 与 Unversioned Files 分组树,支持勾选/取消勾选待提交项
- Side-by-Side 双栏 Diff:
- 左栏 HEAD 版本 vs 右栏工作区版本
- 细粒度单词级 (Word-level) 高亮
- 行级/代码块级暂存 (Partial Commit / Chunk Staging):独立勾选具体代码块提交,支持
>>应用块与x回滚块
- Commit Message 快速输入,带常见前缀建议(
feat:,fix:,refactor:,perf:,chore:) Amend commit快速修补开关与复合提交按钮(Commit / Commit and Push...)
-
Branches 分支管理弹出层 (Git Widget)
- 右下角与顶部一键弹出 IDEA 风格悬浮窗
- 快速模糊搜索、Recent / Local / Remote 分支分组
- 一键执行 Checkout、Merge into Current、Rebase onto Selected、Compare with Current
-
Shelf (架藏) & Stash (贮藏)
- 完整还原 IDEA 独家实用的 Shelf 功能(保存在本地安全区,不受跨分支切换或误删 stash 影响)
- 支持独立 Unshelve 恢复与清理
- 原生 Git Stash 堆栈查看、Apply、Pop 与 Drop
-
3-Way Merge (三方冲突解决器)
- 经典三栏视图:Yours (本地) | Result (最终合成代码) | Theirs (远程)
- 支持“Apply All Non-Conflicting Changes”一键智能合并
- 支持单侧 Accept Left / Accept Right 以及中栏实时编辑
pnpm installpnpm run dev启动后在浏览器中打开 http://localhost:60606 即可交互体验原型。
pnpm tauri dev唤起原生桌面窗口,调用本机 Git。顶栏和底部状态栏都会显示进程 RSS(App.tsx 每 8 秒调一次 process_memory_mb)。目标 < 60MB,以界面读数为准。
pnpm tauri buildsrc-tauri/tauri.conf.json 当前只配置了 Windows NSIS 目标(bundle.targets: ["nsis"],currentUser 安装模式),产出 .exe 安装器。macOS / Linux 未支持,没有对应打包目标。
推送 v 开头的语义化版本标签(例如 v0.1.0)会触发 .github/workflows/release.yml:在 Windows 上先跑现有检查,再构建 NSIS 安装包并上传到同名 GitHub Release。标签去掉 v 之后必须与 src-tauri/tauri.conf.json、package.json、src-tauri/Cargo.toml 的 version 一致,否则工作流会在构建前失败。安装包未签名。带 - 的标签(如 v0.1.0-beta.1)会标成预发布。
.github/workflows/windows-check.yml 在推送和拉取请求上跑类型检查、前端 lint 和 Rust 测试,只使用 Windows runner。
下面三张都还没有 Windows 实机图。截图待补。不要用生成图或浏览器 mock 填这三处。
- 日志拓扑:截图待补
- 提交与双栏 diff:截图待补
- Shelf 或三方合并:截图待补
以下能力已在代码中落地,为避免重复实现,改动前请先看对应文件/命令:
| 能力 | 入口 |
|---|---|
| 中英文切换(zh 默认) | src/i18n/messages.ts、useI18n();持久化 key snail-git.locale |
| 托盘常驻 + 单实例(关窗仅隐藏,真退出走托盘菜单) | src-tauri/src/lib.rs(tray-icon、tauri-plugin-single-instance) |
| 自绘无边框标题栏 | tauri.conf.json decorations: false、src/components/WindowControls.tsx |
| 多仓库侧边栏 / 收藏 / 移除 | src/components/ProjectSidebar/ |
| 克隆仓库、远程管理(增删改 URL) | clone_repo、list_remotes / add_remote / rename_remote / set_remote_url / remove_remote,界面 src/components/RemotesModal.tsx |
| Squash 合并提交 | preview_squash / squash_commits,界面 src/components/GitLogView/SquashDialog.tsx |
| 分支比较 | compare_branches,命令行与提交对话框 |
| 生成补丁 | create_patch |
| 三方冲突解决 | load_conflict / resolve_conflict / smart_merge_conflict,界面 src/components/merge/ |
| 文件编码/换行检测 | inspect_file(状态栏展示) |
| 仓库变化自动刷新 | set_watch_path / set_watch_paused + lib.rs 的 watch_loop |
| 合并 / 变基 / 挑拣的中止与继续 | repo_state / continue_operation / abort_operation,界面 src/components/OperationBar.tsx |
| Tag 新建 / 删除 / 推送 / 删除远程 | create_tag / delete_tag / push_tag / delete_remote_tag,界面 src/components/GitLogView/TagDialog.tsx、RemotePickerDialog.tsx |
强制推送(仅 --force-with-lease) |
push_to 的 force 参数 + preview_push 的 needsForce,界面 src/components/PushDialog.tsx;代码中不使用 --force |
自绘输入 / 确认弹窗(无原生 prompt / confirm) |
src/components/common/askInput.ts / askConfirm.ts / dialogQueue.ts / InputDialog.tsx / ConfirmHost.tsx |
| Changelist 重命名 / 删除 | src/components/CommitView/ChangelistTree.tsx(localStorage key snailgit.changelists.<repoKey>,存储值保持 更改 / 全部) |
| 日志分页 | src-tauri/src/git_ops.rs 的 LOG_PAGE_SIZE = 200、LOG_FETCH_CAP = 20_000;继续加载到上限后停止。已加载的行整页渲染,没有虚拟滚动 |
工程约定(i18n、依赖白名单、Rust 命令链路、无前端测试框架等)见 AGENTS.md。
- Phase 1:IDEA Git 功能深度调研与高保真交互前端原型
- Phase 2:接入轻量 Native 宿主(Tauri 2.0 / Rust),搭建跨平台桌面端骨架与双模架构
- Phase 3:真实 Git 数据流(状态、日志、diff、提交、分支、stash、shelf)与
.git变化刷新 - Phase 4:快捷键对齐 IDEA(Ctrl+K, Ctrl+T, Ctrl+Shift+K, Alt+9, Alt+0, F7/Shift+F7, Ctrl+Enter)