跳到主要内容

源代码管理大概怎么挂状态?

结论​

插件用 scm.createSourceControl 注册一个源代码管理提供者,下面挂资源组,例如暂存和未暂存。组里的 SourceControlResourceState 表示每个变更文件。真正的 diff 和提交命令由你自己接。

展开​

const scm = vscode.scm.createSourceControl("myext", "我的源码管理", folder.uri);
const group = scm.createResourceGroup("working", "更改");
group.resourceStates = [
{ resourceUri: fileUri, decorations: { strikeThrough: false } }
];
scm.inputBox.placeholder = "提交说明";

界面上的提交按钮对应 scm.acceptInputCommand。用户输入的说明在 inputBox.value。命令里调用你的提交实现,成功后清空输入并刷新资源组。

状态从哪来:读你的版本库,或执行底层命令解析 porcelain 输出。解析要在工作区侧做。变更后更新 resourceStates,这是替换语义,按最新完整列表赋值。

文件装饰、快捷操作、资源组右键走菜单贡献点 scm/resourceGroup/context 和 scm/resourceState/context。命令参数里能拿到资源 URI。

多根工作区要每个文件夹一个 SourceControl,用 rootUri 区分。关掉文件夹时释放对应控制器。

内置 Git 插件已经占用 .git。不要再注册一个抢同一仓库的 Git 提供者,除非你在做别的版本系统,或者明确是在扩展 Git 没有覆盖的侧栏信息。

容易讲错的点​

  • 源代码管理 API 不负责帮你执行 git。它只提供视图和输入框。
  • 资源状态不要每秒无条件全量刷新。跟着文件监视和命令结果更新。
  • 提交命令如果没检查工作区信任,不受信任的仓库也能被你自动执行钩子。