在VS Code扩展中如何获取两个Git分支间的变更统计数据?
获取VS Code扩展中Git分支间代码变更数量的解决方案
我在开发VS Code扩展时,需要获取两个Git分支之间的代码变更统计数据——比如分支A中有一个10行的文件,分支B修改后变成15行,要得到新增5行的差异数据。终端里执行git diff branchA branchB --shortstat能返回类似1 file changed, 5 insertions(+), 0 deletions(-)的结果,但VS Code的API(包括Source Control API)里没有直接提供获取这类数据的方法。
最终通过Node.js的异步进程创建功能解决了问题,这也是官方Git扩展和GitLens的实现思路。使用child_process模块的spawn方法执行Git命令,捕获输出后解析即可得到所需数据。
核心实现代码(TypeScript)
import * as vscode from 'vscode'; import { spawn } from 'child_process'; async function getBranchDiffStats(branchA: string, branchB: string): Promise<string> { return new Promise((resolve, reject) => { const workspaceFolder = vscode.workspace.workspaceFolders?.[0].uri.fsPath; if (!workspaceFolder) { reject('未打开工作区文件夹'); return; } // 执行git diff命令 const gitProcess = spawn('git', ['diff', branchA, branchB, '--shortstat'], { cwd: workspaceFolder }); let output = ''; // 捕获标准输出 gitProcess.stdout.on('data', (data) => { output += data.toString(); }); // 捕获错误输出 gitProcess.stderr.on('data', (data) => { reject(data.toString()); }); // 进程结束后处理结果 gitProcess.on('close', (code) => { if (code === 0) { resolve(output.trim()); } else { reject(`Git进程退出,代码:${code}`); } }); }); } // 示例调用 async function exampleUsage() { try { const stats = await getBranchDiffStats('branchA', 'branchB'); vscode.window.showInformationMessage(`分支差异统计:${stats}`); } catch (error) { vscode.window.showErrorMessage(`获取差异失败:${error}`); } }
这段代码会在当前工作区执行Git diff命令,捕获输出后返回格式化的统计字符串。你可以进一步解析输出字符串,提取出文件变更数、新增行数、删除行数等具体数值。
内容的提问来源于stack exchange,提问作者guaxuma
相关产品推荐
相关产品推荐

