Git +
Visual Studio Git 增强扩展
在 VS 内置 Git 工具之上,提供工具栏按钮、自动 Fetch、智能同步、约定式提交及 Git Hook 功能。
English Documentation
✨ 功能
🔄 拉取(自动储藏)
一键拉取,自动处理本地更改。Pull with Stash(拉取+储藏) 按钮被注入到 Git 更改窗口工具栏,紧邻原生 Pull 按钮。点击后:
- 通过
git status 检查本地更改
- 如有本地更改,自动储藏(
git stash push)
- 执行
git pull(可选 --rebase)
- 恢复储藏(
git stash pop)
告别"存在未提交的更改,无法拉取"的错误——快速同步代码而不中断工作流。
当 VS 内置的 Action Button(如解决冲突的"继续"按钮)可见时,Pull with Stash 按钮会自动隐藏以保持界面整洁。
⏱️ 自动 Fetch
按可配置的时间间隔,在后台定期执行 git fetch --all --prune。无需手动操作即可保持与远程仓库同步。自动 Fetch 的间隔信息会显示在 Fetch 按钮的提示文本中。
📝 约定式提交
将约定式提交模板直接插入 Git 提交消息框。插入约定式提交模板 按钮被注入到 Git 更改窗口,紧邻工作项链接按钮。支持:
- 从预定义的提交类型中选择(
feat、fix、docs、style、refactor、perf、test、chore、ci、build、revert),每种类型均附带 emoji 和描述
- 可选的范围支持 — 从
.gitplus/conventional-commits.settings.json 读取
- BREAKING CHANGE 尾注插入(含 header 中的
! 标记)
- 类型替换 — 选择不同类型可替换消息中已有的类型
- 通过
ENABLE COMMIT CONVENTION 菜单项启用约定式提交校验
✅ 约定式提交语法校验
对提交消息进行实时语法校验,遵循 Conventional Commits 规范。当通过 .gitplus/conventional-commits.settings.json 启用严格校验后,扩展将:
- 实时解析提交消息,使用自研的 lexer/parser 完整理解约定式提交语法(类型、范围、
! 标记、描述、正文、尾注)
- 高亮显示语法错误和警告,直接在提交文本框中以波浪下划线标注 — 红色表示错误,黄色表示警告
- 格式无效时以红色边框勾勒提交消息区域
- 禁用提交按钮,直至所有错误均已解决
- 显示诊断消息(CC001–CC014),精确描述问题所在
校验器检查以下内容:
- 缺失或无效的提交类型
- 类型/范围后缺少冒号或空格
- 范围括号格式错误
- 缺少描述文本
- 无效的尾注键(如
BREAKING CHANGE、自定义尾注)
- 意外的多余空行或空格
🪝 约定式提交 Git Hook
GitPlus 内置一个独立的 Git commit-msg Hook 工具(conventional-commits.githook.exe),可在 Git 仓库中安装为 commit-msg 钩子,在 git commit 时自动校验提交消息格式。该工具:
- 基于 .NET 10 构建,经过 Native AOT 编译为独立可执行文件,无需运行时
- 读取仓库根目录下的
.gitplus/conventional-commits.settings.json 获取校验规则
- 内置与 VS 扩展相同的完整 lexer/parser,校验逻辑完全一致
- 通过菜单中的 ENABLE COMMIT CONVENTION 即可一键安装到当前仓库的
.git/hooks/ 目录
工作流程:
git commit -m "..."
→ .git/hooks/commit-msg 脚本触发
→ conventional-commits.githook.exe 校验消息
→ 格式错误:拒绝提交并显示诊断信息
→ 格式正确:通过校验,提交继续
⚙️ 基于仓库的提交规范配置
GitPlus 支持基于仓库的提交规范配置。.gitplus/conventional-commits.settings.json 可直接提交到 Git 仓库,使团队成员共享统一的提交消息规则。配置文件支持:
enableStrictValidation — 启用/禁用严格校验
scopes — 允许的 scope 列表(空列表时不校验 scope)
customRules — 自定义提交类型(扩展默认 11 种类型)
customFooters — 自定义尾注键(除 BREAKING CHANGE 外)
该文件可从插入约定式提交模板菜单一键生成,包含 JSON Schema 引用以提供 IDE 智能提示。
⚙️ 可配置选项
所有选项可通过 工具 → 选项 → Git + 访问:
| 类别 |
选项 |
默认值 |
描述 |
| 常规 |
超时(秒) |
30 |
Git 操作超时时间 |
| 常规 |
Git 文件路径 |
(系统 PATH) |
自定义 git.exe 路径 |
| 自动 Fetch |
启用自动 Fetch |
✅ 开 |
开启/关闭后台自动 Fetch |
| 自动 Fetch |
Fetch 间隔(分钟) |
5 |
自动 Fetch 调用间隔 |
| 拉取 |
拉取时使用 Rebase |
✅ 开 |
使用 --rebase 代替合并 |
| 拉取 |
显示自动拉取按钮 |
✅ 开 |
显示/隐藏自动拉取按钮 |
| 提交 |
显示约定式提交按钮 |
✅ 开 |
显示/隐藏约定式提交按钮 |
| 提交 |
约定式提交设置文件名 |
conventional-commits.settings.json |
用于提交消息校验的设置文件 |
| 日志 |
日志级别 |
信息 |
Git + 输出窗格的日志详细程度 |
🌐 本地化
扩展界面支持英文和简体中文(zh-Hans)两种语言。
📸 截图
注入到 Git 更改窗口中的 Pull with Stash(拉取+储藏) 按钮、约定式提交 按钮以及实时 语法校验 功能。
📦 安装
前提条件
- Visual Studio 2022(版本 17.0 或更高)
- .NET Framework 4.7.2 或更高
通过 VSIX 安装
从 Releases 下载 .vsix 文件,双击安装。或从源码构建:
dotnet build GitPlus.slnx -c Release
生成的 .vsix 文件位于:
GitPlus.Extensions/bin/Release/GitPlus.vsix
🛠️ 开发
技术栈
| 项目 |
目标框架 |
说明 |
GitPlus.Extensions |
net472 |
VS 2022 进程内扩展 |
GitPlus.Commons |
netstandard2.0 |
共享工具库(DI、GitResult、Hash) |
GitPlus.ConventionalCommits |
netstandard2.0 |
约定式提交 lexer/parser 引擎 |
GitPlus.ConventionalCommits.GitHook |
net10.0 |
Git commit-msg Hook(Native AOT) |
GitPlus.Tests |
net472 |
单元测试 |
- 语言:C# 14(record、模式匹配、file-scoped namespace)
- 核心依赖:
Microsoft.VisualStudio.SDK — VS 扩展性
CommunityToolkit.Mvvm — AsyncRelayCommand
Lombok.NET — [RequiredArgsConstructor] 源码生成注入
Microsoft.Extensions.DependencyInjection — DI 容器
Microsoft.Extensions.Logging.Abstractions — 结构化日志
- 包管理:集中式版本管理(
Directory.Packages.props)
项目结构
GitPlus.Extensions/ # VS 扩展主项目(net472)
├── GitPlusPackage.cs # AsyncPackage 入口,DI 初始化 + Injector 调度
├── Configurations/
│ └── GitPlusOptionPage.cs # 工具 → 选项 对话框页 + GitPlusOption POCO
├── Injectors/
│ ├── InjectorBase.cs # UI 注入器抽象基类
│ ├── GitWindowActionButtonPanelInjector.cs # Pull with Stash 按钮注入
│ └── GitWorkItemActionStackPanelInjector.cs # 约定式提交 + 语法校验 + Git Hook
├── Services/
│ ├── WindowWatcher.cs # DTE 窗口生命周期事件
│ ├── GitCommandService.cs # git.exe 进程封装
│ └── AutoFetchService.cs # 定时自动 Fetch
├── Commons/
│ ├── DependencyObjectExtensions.cs # WPF VisualTree 扩展(FindChild/InsertElement 等)
│ ├── FileBrowserEditor.cs # 文件浏览器 UITypeEditor
│ ├── GitWindowLocator.cs # VisualTree 元素定位器
│ ├── GitWindowViewModelExtensions.cs # VS 内部 ViewModel 反射扩展
│ ├── OutputWindowLogger.cs # VS Output Window 日志提供程序
│ ├── ResourceExtensions.cs # 资源 URI 辅助方法
│ └── WaveUnderlineAdorner.cs # 波浪下划线装饰器
├── Resources/
│ ├── GitButtonStyle.xaml # ImageButton 控件模板
│ └── Icons.xaml # DrawingImage 矢量图标
└── Assets/
├── conventional-commits.rules.json # 内置提交类型规则
├── conventional-commits.rules.schema.json # 规则 JSON Schema
├── conventional-commits.settings.schema.json # 设置 JSON Schema
└── conventional-commits.githook.exe # Git Hook 可执行文件
GitPlus.Commons/ # 共享工具库(netstandard2.0)
├── Extensions.cs # DI 容器 / 字符串扩展
├── GitResult.cs # Git 操作结果模型
├── Hash.cs # 哈希工具
├── LocalizedAttributes.cs # 本地化特性类
├── Properties/
│ └── Languages.resx # 多语言资源(自动生成 .Designer.cs)
└── Text/
└── TextSpan.cs # 文本范围结构
GitPlus.ConventionalCommits/ # 约定式提交引擎(netstandard2.0)
├── Lexer.cs # 词法分析器
├── Parser.cs # 语法分析器(递归下降)
├── ParserSettings.cs # 解析器配置
├── Diagnostic.cs # 诊断模型(CC001–CC014)
├── ConventionalCommitRules.cs # 提交规则模型
├── ConventionalCommitSettings.cs # 仓库级设置模型
└── Syntaxs/
├── SyntaxKind.cs # Token/AST 节点类型枚举
├── SyntaxToken.cs / SyntaxNode.cs / SyntaxTree.cs
├── HeaderSyntax.cs / ScopeSyntax.cs
├── BodySyntax.cs / FooterSyntax.cs
└── CommitSyntax.cs # 顶层 AST 节点
GitPlus.ConventionalCommits.GitHook/ # Git Hook 独立工具(net10.0, PublishAot)
├── Program.cs # 入口点:读取设置、校验提交消息
└── ConventionalCommitOptionsJsonSerializerContext.cs # AOT JSON 序列化上下文
GitPlus.Tests/ # 单元测试(MSTest, net472)
├── GitResultTests.cs
└── ConventionalCommits/ # 约定式提交测试(8 个测试类,覆盖各类场景)
构建
# 构建全部项目(包括 Git Hook 的 AOT 发布)
dotnet build GitPlus.slnx
# Release 构建
dotnet build GitPlus.slnx -c Release
运行测试
dotnet test GitPlus.slnx
调试 (F5)
在 Visual Studio 中打开解决方案,将 GitPlus.Extensions 设为启动项目,按 F5 — 这会启动 VS 实验实例并加载扩展。
🧪 测试
GitPlus.Tests 项目使用 MSTest,目标框架为 net472,并引用 WPF 程序集以支持基于 DependencyObject 的测试。测试覆盖:
GitResult 的成功/失败语义
- 约定式提交解析器:正常提交、异常边界、真实场景、带配置的解析等
📄 许可证
本项目基于 MIT 许可证开源 — 详见 LICENSE.txt。
Made with ❤️ by View