2.3 KiB
2.3 KiB
Git 集成方案
调研日期:2026-04-11 状态:已调研,待实现
1. 判定 Git 仓库
从目标路径逐级向上查找 .git 目录:
git -C <path> rev-parse --is-inside-work-tree
# 返回 "true" = 是 git 仓库
Go 实现:filepath.Walk 向上遍历,检查 .git 目录存在性。
2. 可实现功能
| 功能 | 难度 | 命令 |
|---|---|---|
| 文件状态(修改/新增/删除/未跟踪) | 低 | git status --porcelain=v1 <file> |
| 文件/文件夹提交历史 | 低 | git log --oneline -20 -- <path> |
| 当前文件与 HEAD 的 diff | 中 | git diff HEAD -- <file> |
| 某行代码 blame | 低 | git blame <file> |
| 当前分支名 | 低 | git branch --show-current |
3. 实现架构
Go 后端(~200 行)
internal/git/
├── git.go # 核心逻辑:判定仓库、执行命令、解析输出
├── status.go # 文件状态查询
├── history.go # 提交历史
├── diff.go # 文件差异
└── blame.go # 行级追溯
关键接口设计:
IsGitRepo(path string) bool— 判定是否为 git 仓库GetFileStatus(path string) (string, error)— 返回 M/A/D/? 状态码GetFileHistory(path string, limit int) ([]Commit, error)— 提交历史GetFileDiff(path string) (string, error)— diff 文本BlameFile(path string) ([]BlameLine, error)— blame 结果
前端(~100 行)
- 文件列表:图标列增加 git 状态小标记(M=修改, A=新增, D=删除, ?=未跟踪)
- 右键菜单:git 仓库内显示「查看历史」「查看 Diff」「Blame」等选项
- 弹窗组件:提交历史列表 / Diff 查看 / Blame 视图
调用方式
Go 侧通过 os/exec.Command("git", "-C", repoPath, ...) 执行系统 git 命令,
解析 stdout 返回结构化数据给前端。
4. 前提条件
- 系统需安装 Git(Windows 上基本都有)
- 仅在有
.git的目录下激活相关功能 - 大文件/二进制文件不做 diff/blame
5. 注意事项
git -C <path>确保 git 命令在正确仓库上下文执行--porcelain=v1输出格式稳定,适合程序解析- 中文路径需注意编码(UTF-8)
- 性能:避免频繁调用 git 命令,考虑缓存结果